This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Plug segfault in bsd_glob() with unsupported ALTDIRFUNC flag.
authorCraig A. Berry <craigberry@mac.com>
Fri, 19 Aug 2011 15:14:13 +0000 (10:14 -0500)
committerCraig A. Berry <craigberry@mac.com>
Sat, 3 Sep 2011 12:58:32 +0000 (07:58 -0500)
First, disable all the unsupported flags just to make sure they aren't
triggering something they shouldn't be.  Also, zero the pglob struct
before passing to bsd_glob(); it contains function pointers, and it's
safest if they are null rather than containing random stack data.

Bug reported by ClĂ©ment Lecigne <clemun@gmail.com>.

ext/File-Glob/Glob.pm
ext/File-Glob/Glob.xs
ext/File-Glob/t/basic.t

index 5231d0f..af17cff 100644 (file)
@@ -36,7 +36,7 @@ use feature 'switch';
 
 @EXPORT_OK   = (@{$EXPORT_TAGS{'glob'}}, 'csh_glob');
 
-$VERSION = '1.12';
+$VERSION = '1.13';
 
 sub import {
     require Exporter;
index 3f4928f..5a08a0d 100644 (file)
@@ -57,11 +57,14 @@ PPCODE:
        /* allow for optional flags argument */
        if (items > 1) {
            flags = (int) SvIV(ST(1));
+           /* remove unsupported flags */
+           flags &= ~(GLOB_APPEND | GLOB_DOOFFS | GLOB_ALTDIRFUNC | GLOB_MAGCHAR);
        } else if (ix) {
            flags = (int) SvIV(get_sv("File::Glob::DEFAULT_FLAGS", GV_ADD));
        }
 
        /* call glob */
+       bzero(&pglob, sizeof(glob_t));
        retval = bsd_glob(pattern, flags, errfunc, &pglob);
        GLOB_ERROR = retval;
 
index e331380..ed83019 100644 (file)
@@ -10,7 +10,7 @@ BEGIN {
     }
 }
 use strict;
-use Test::More tests => 14;
+use Test::More tests => 15;
 BEGIN {use_ok('File::Glob', ':glob')};
 use Cwd ();
 
@@ -187,3 +187,7 @@ pass("Don't panic");
     local $TODO = "home-made glob doesn't do regexes" if $^O eq 'VMS';
     is_deeply(\@glob_files, ['a_dej']);
 }
+
+# This used to segfault.
+my $i = bsd_glob('*', GLOB_ALTDIRFUNC);
+is(&File::Glob::GLOB_ERROR, 0, "Successfuly ignored unsupported flag");