Change 14144 by jhi@alpha on 2002/01/09 02:28:33

        Subject: Re: [ID 20010912.007] substr reference core dump
        From: Hugo van der Sanden <[EMAIL PROTECTED]>
        Date: Tue, 08 Jan 2002 19:17:50 +0000
        Message-Id: <[EMAIL PROTECTED]>

Affected files ...

.... //depot/perl/scope.c#88 edit
.... //depot/perl/t/run/kill_perl.t#22 edit

Differences ...

==== //depot/perl/scope.c#88 (text) ====
Index: perl/scope.c
--- perl/scope.c.~1~    Tue Jan  8 19:45:06 2002
+++ perl/scope.c        Tue Jan  8 19:45:06 2002
@@ -673,9 +673,7 @@
            DEBUG_S(PerlIO_printf(Perl_debug_log,
                                  "restore svref: %p %p:%s -> %p:%s\n",
                                  ptr, sv, SvPEEK(sv), value, SvPEEK(value)));
-           if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv) &&
-               SvTYPE(sv) != SVt_PVGV)
-           {
+           if (SvTYPE(sv) == SVt_PVMG && SvMAGIC(sv)) {
                (void)SvUPGRADE(value, SvTYPE(sv));
                SvMAGIC(value) = SvMAGIC(sv);
                SvFLAGS(value) |= SvMAGICAL(sv);
@@ -687,9 +685,7 @@
             * croaking that might ensue when the SvSETMAGIC() below is
             * called, or to avoid two different SVs pointing at the same
             * SvMAGIC()).  This needs a total rethink.  --GSAR */
-           else if (SvTYPE(value) >= SVt_PVMG && SvMAGIC(value) &&
-                    SvTYPE(value) != SVt_PVGV)
-           {
+           else if (SvTYPE(value) == SVt_PVMG && SvMAGIC(value)) {
                SvFLAGS(value) |= (SvFLAGS(value) &
                                  (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
                SvMAGICAL_off(value);

==== //depot/perl/t/run/kill_perl.t#22 (text) ====
Index: perl/t/run/kill_perl.t
--- perl/t/run/kill_perl.t.~1~  Tue Jan  8 19:45:06 2002
+++ perl/t/run/kill_perl.t      Tue Jan  8 19:45:06 2002
@@ -822,3 +822,15 @@
 print join '', @a, "\n";
 EXPECT
 123456789
+######## [ID 20010912.007] segfault or "Can't modify non-existent substring"
+$b="abcde";
+$s = \substr($b, 2, 1);
+print "before: $$s\n";
+{
+  local $k;
+  *k = $s;
+}
+print "after: $$s\n";
+EXPECT
+before: c
+after: c
End of Patch.

Reply via email to