This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #123816] fix stat stacking
authorHugo van der Sanden <hv@crypt.org>
Fri, 13 Feb 2015 12:26:50 +0000 (12:26 +0000)
committerHugo van der Sanden <hv@crypt.org>
Mon, 16 Feb 2015 03:14:06 +0000 (03:14 +0000)
The check function for filetests avoids treating '-t stat' as a pair of
stackable filetests, but needs also to avoid treating 'stat -t' as
stackable.

op.c
t/op/stat.t

diff --git a/op.c b/op.c
index dea09cf..2a76ae4 100644 (file)
--- a/op.c
+++ b/op.c
@@ -9876,8 +9876,10 @@ Perl_ck_ftst(pTHX_ OP *o)
        }
        if ((PL_hints & HINT_FILETEST_ACCESS) && OP_IS_FILETEST_ACCESS(o->op_type))
            o->op_private |= OPpFT_ACCESS;
-       if (PL_check[kidtype] == Perl_ck_ftst
-               && kidtype != OP_STAT && kidtype != OP_LSTAT) {
+       if (type != OP_STAT && type != OP_LSTAT
+            && PL_check[kidtype] == Perl_ck_ftst
+            && kidtype != OP_STAT && kidtype != OP_LSTAT
+        ) {
            o->op_private |= OPpFT_STACKED;
            kid->op_private |= OPpFT_STACKING;
            if (kidtype == OP_FTTTY && (
index 1461b52..ad94b3f 100644 (file)
@@ -25,7 +25,7 @@ if ($^O eq 'MSWin32') {
     ${^WIN32_SLOPPY_STAT} = 0;
 }
 
-plan tests => 113;
+plan tests => 115;
 
 my $Perl = which_perl();
 
@@ -622,6 +622,16 @@ SKIP: {
     is $w, undef, 'no unopened warning from stat _';
 }
 
+{
+    # [perl #123816]
+    # Inappropriate stacking of l?stat with filetests should either work or
+    # give a syntax error, they shouldn't crash.
+    eval { stat -t };
+    ok(1, 'can "stat -t" without crashing');
+       eval { lstat -t };
+    ok(1, 'can "lstat -t" without crashing');
+}
+
 END {
     chmod 0666, $tmpfile;
     unlink_all $tmpfile;