handle null op_next in stacked filetests
authorZefram <zefram@fysh.org>
Wed, 6 Dec 2017 18:53:16 +0000 (18:53 +0000)
committerZefram <zefram@fysh.org>
Wed, 6 Dec 2017 18:58:38 +0000 (18:58 +0000)
When a filetest op returns false, it skips past following ops that
are stacked filetests.  The code to do this was assuming that op_next
would always be non-null, which is not always the case, for example in
a sort comparator.  Allow for it to be null.  Fixes [perl #129347].

pp_sys.c
t/op/filetest_stack_ok.t

index 7a4c4ab..b078586 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -3116,7 +3116,7 @@ S_ft_return_false(pTHX_ SV *ret) {
     PUTBACK;
 
     if (PL_op->op_private & OPpFT_STACKING) {
-        while (OP_IS_FILETEST(next->op_type)
+        while (next && OP_IS_FILETEST(next->op_type)
                && next->op_private & OPpFT_STACKED)
             next = next->op_next;
     }
index ceff452..36da2c8 100644 (file)
@@ -12,7 +12,7 @@ BEGIN {
 
 my @ops = split //, 'rwxoRWXOezsfdlpSbctugkTMBAC';
 
-plan( tests => @ops * 5 );
+plan( tests => @ops * 5 + 1 );
 
 package o { use overload '-X' => sub { 1 } }
 my $o = bless [], 'o';
@@ -47,3 +47,9 @@ for my $op (@ops) {
     my @foo = eval "-$op \$o";
     is @foo, 1, "-$op \$overld did not leave \$overld on the stack";
 }
+
+{
+    # [perl #129347] cope with stacked filetests where PL_op->op_next is null
+    () = sort { -d -d } \*TEST0, \*TEST1;
+    ok 1, "survived stacked filetests with null op_next";
+}