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>
Sun, 4 Sep 2011 21:14:28 +0000 (16:14 -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 7c6b92c..8bc4677 100644 (file)
@@ -56,7 +56,7 @@ use XSLoader ();
     ) ],
 );
 
-$VERSION = '1.07';
+$VERSION = '1.07_01';
 
 sub import {
     require Exporter;
index 59345e7..f676a30 100644 (file)
@@ -49,9 +49,12 @@ 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);
        }
 
        /* call glob */
+       bzero(&pglob, sizeof(glob_t));
        retval = bsd_glob(pattern, flags, errfunc, &pglob);
        GLOB_ERROR = retval;
 
index b9d46b1..3ea52d2 100644 (file)
@@ -15,7 +15,7 @@ BEGIN {
     }
 }
 use strict;
-use Test::More tests => 14;
+use Test::More tests => 15;
 BEGIN {use_ok('File::Glob', ':glob')};
 use Cwd ();
 
@@ -195,3 +195,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");