develooper Front page | perl.perl5.changes | Postings from May 2008

Change 33778: Re: [perl #51636] segmentation fault with array ties

From:
Rafael Garcia-Suarez
Date:
May 2, 2008 04:45
Subject:
Change 33778: Re: [perl #51636] segmentation fault with array ties
Change 33778 by rgs@scipion on 2008/05/02 11:44:25

	Subject: Re: [perl #51636] segmentation fault with array ties
	From: "Vincent Pit" <perl@profvince.com>
	Date: Wed, 12 Mar 2008 17:37:40 +0100 (CET)
	Message-ID: <56287.147.210.17.175.1205339860.squirrel@147.210.17.175>

Affected files ...

... //depot/perl/pp_hot.c#576 edit

Differences ...

==== //depot/perl/pp_hot.c#576 (text) ====
Index: perl/pp_hot.c
--- perl/pp_hot.c#575~33702~	2008-04-17 00:58:29.000000000 -0700
+++ perl/pp_hot.c	2008-05-02 04:44:25.000000000 -0700
@@ -1020,8 +1020,14 @@
 		*(relem++) = sv;
 		didstore = av_store(ary,i++,sv);
 		if (magic) {
-		    if (SvSMAGICAL(sv))
+		    if (SvSMAGICAL(sv)) {
+			/* More magic can happen in the mg_set callback, so we
+			 * backup the delaymagic for now. */
+			U16 dmbak = PL_delaymagic;
+			PL_delaymagic = 0;
 			mg_set(sv);
+			PL_delaymagic = dmbak;
+		    }
 		    if (!didstore)
 			sv_2mortal(sv);
 		}
@@ -1051,8 +1057,12 @@
 			duplicates += 2;
 		    didstore = hv_store_ent(hash,sv,tmpstr,0);
 		    if (magic) {
-			if (SvSMAGICAL(tmpstr))
+			if (SvSMAGICAL(tmpstr)) {
+			    U16 dmbak = PL_delaymagic;
+			    PL_delaymagic = 0;
 			    mg_set(tmpstr);
+			    PL_delaymagic = dmbak;
+			}
 			if (!didstore)
 			    sv_2mortal(tmpstr);
 		    }
@@ -1076,7 +1086,13 @@
 	    }
 	    else
 		sv_setsv(sv, &PL_sv_undef);
-	    SvSETMAGIC(sv);
+
+	    if (SvSMAGICAL(sv)) {
+		U16 dmbak = PL_delaymagic;
+		PL_delaymagic = 0;
+		mg_set(sv);
+		PL_delaymagic = dmbak;
+	    }
 	    break;
 	}
     }
End of Patch.



Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About