Re: [ID 20011101.069] \stat('.') gives "Attempt to free unreferenced scalar"
Radu Greab [Fri, 2 Nov 2001 15:28:58 +0000 (17:28 +0200)]
Message-ID: <15330.40858.629851.468818@ix.netsoft.ro>

p4raw-id: //depot/perl@12811

op.c
t/op/stat.t

diff --git a/op.c b/op.c
index 4740afd..4b00e0f 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1670,19 +1670,22 @@ Perl_mod(pTHX_ OP *o, I32 type)
            goto nomod;
        break; /* mod()ing was handled by ck_return() */
     }
-    if (type != OP_LEAVESUBLV)
-        o->op_flags |= OPf_MOD;
-
-    if (type == OP_AASSIGN || type == OP_SASSIGN)
-       o->op_flags |= OPf_SPECIAL|OPf_REF;
-    else if (!type) {
-       o->op_private |= OPpLVAL_INTRO;
-       o->op_flags &= ~OPf_SPECIAL;
-       PL_hints |= HINT_BLOCK_SCOPE;
+    if (type != OP_REFGEN ||
+       PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)) {
+       if (type != OP_LEAVESUBLV)
+           o->op_flags |= OPf_MOD;
+
+       if (type == OP_AASSIGN || type == OP_SASSIGN)
+           o->op_flags |= OPf_SPECIAL|OPf_REF;
+       else if (!type) {
+           o->op_private |= OPpLVAL_INTRO;
+           o->op_flags &= ~OPf_SPECIAL;
+           PL_hints |= HINT_BLOCK_SCOPE;
+       }
+       else if (type != OP_GREPSTART && type != OP_ENTERSUB
+                && type != OP_LEAVESUBLV)
+           o->op_flags |= OPf_REF;
     }
-    else if (type != OP_GREPSTART && type != OP_ENTERSUB
-             && type != OP_LEAVESUBLV)
-       o->op_flags |= OPf_REF;
     return o;
 }
 
index dc47ef3..8d0ca19 100755 (executable)
@@ -9,7 +9,7 @@ BEGIN {
 
 use Config;
 
-print "1..58\n";
+print "1..59\n";
 
 $Is_MSWin32 = $^O eq 'MSWin32';
 $Is_NetWare = $^O eq 'NetWare';
@@ -281,3 +281,7 @@ if (-f) {print "ok 57\n";} else {print "not ok 57\n";}
 if (-f()) {print "ok 58\n";} else {print "not ok 58\n";}
 
 unlink 'Op.stat.tmp' or print "# unlink failed: $!\n";
+
+# bug id 20011101.069
+my @r = \stat(".");
+if (@r == 13) { print "ok 59\n" } else { print "not ok 59\n" }