[perl #114984] Glob.xs: Extend stack when returning
authorFather Chrysostomos <sprout@cpan.org>
Thu, 20 Sep 2012 21:25:38 +0000 (14:25 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 20 Sep 2012 21:25:38 +0000 (14:25 -0700)
If a pattern passed to File::Glob consists of a space-separated list
of patterns, the stack will only be extended by doglob() enough for
the list returned by each subpattern.  So iterate() needs to extend
the stack before copying the list of files from an AV to the stack.

This fixes a regression introduced in 5.16.0.

MANIFEST
ext/File-Glob/Glob.xs
ext/File-Glob/t/rt114984.t [new file with mode: 0644]

index a7935fc..cceb00e 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -3748,6 +3748,7 @@ ext/File-Glob/t/basic.t           See if File::Glob works
 ext/File-Glob/t/case.t         See if File::Glob works
 ext/File-Glob/t/global.t       See if File::Glob works
 ext/File-Glob/TODO             File::Glob extension todo list
+ext/File-Glob/t/rt114984.t     See if File::Glob works
 ext/File-Glob/t/taint.t                See if File::Glob works
 ext/GDBM_File/GDBM_File.pm     GDBM extension Perl module
 ext/GDBM_File/GDBM_File.xs     GDBM extension external subroutines
index 3ea0590..d74e7a4 100644 (file)
@@ -93,6 +93,7 @@ iterate(pTHX_ bool(*globber)(pTHX_ AV *entries, SV *patsv))
     /* chuck it all out, quick or slow */
     if (gimme == G_ARRAY) {
        if (!on_stack) {
+           EXTEND(SP, AvFILLp(entries)+1);
            Copy(AvARRAY(entries), SP+1, AvFILLp(entries)+1, SV *);
            SP += AvFILLp(entries)+1;
        }
diff --git a/ext/File-Glob/t/rt114984.t b/ext/File-Glob/t/rt114984.t
new file mode 100644 (file)
index 0000000..4229c6b
--- /dev/null
@@ -0,0 +1,25 @@
+use strict;
+use warnings;
+use v5.16.0;
+use File::Temp 'tempdir';
+use File::Spec::Functions;
+use Test::More tests => 1;
+
+my @md = (1..305);
+my @mp = (1000..1205);
+
+my $path = tempdir uc cleanup => 1;
+
+foreach (@md) {
+    open(my $f, ">", catfile $path, "md_$_.dat");
+    close $f;
+}
+
+foreach (@mp) {
+    open(my $f, ">", catfile $path, "mp_$_.dat");
+    close $f;
+}
+my @b = glob(qq{$path/mp_[0123456789]*.dat
+                $path/md_[0123456789]*.dat});
+is scalar(@b), @md+@mp,
+    'File::Glob extends the stack when returning a long list';