summaryrefslogtreecommitdiff
path: root/ext/File-Glob
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-09-20 14:25:38 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-09-20 14:25:38 -0700
commita6636b43dc409e4b49f369c18fedd34332fdb9ab (patch)
tree4d89577c421d9261b0e159fc00be48f7e4c51a49 /ext/File-Glob
parenta71a1afb2287c191e69669788abc7bd83dc909a1 (diff)
downloadperl-a6636b43dc409e4b49f369c18fedd34332fdb9ab.tar.gz
[perl #114984] Glob.xs: Extend stack when returning
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.
Diffstat (limited to 'ext/File-Glob')
-rw-r--r--ext/File-Glob/Glob.xs1
-rw-r--r--ext/File-Glob/t/rt114984.t25
2 files changed, 26 insertions, 0 deletions
diff --git a/ext/File-Glob/Glob.xs b/ext/File-Glob/Glob.xs
index 3ea05909c6..d74e7a4965 100644
--- a/ext/File-Glob/Glob.xs
+++ b/ext/File-Glob/Glob.xs
@@ -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
index 0000000000..4229c6b780
--- /dev/null
+++ b/ext/File-Glob/t/rt114984.t
@@ -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';