Blob Blame History Raw
diff -up perl-5.10.0/ext/Storable/Storable.xs.old perl-5.10.0/ext/Storable/Storable.xs
--- perl-5.10.0/ext/Storable/Storable.xs.old	2007-12-18 11:47:07.000000000 +0100
+++ perl-5.10.0/ext/Storable/Storable.xs	2008-09-30 14:03:38.000000000 +0200
@@ -4561,7 +4561,13 @@ static SV *retrieve_overloaded(pTHX_ stc
 	 * WARNING: breaks RV encapsulation.
 	 */
 
-	sv_upgrade(rv, SVt_RV);
+	if (cname) {
+	/* No need to do anything, as rv will already be PVMG. */
+		assert (SvTYPE(rv) >= SVt_RV);
+	} else {
+		sv_upgrade(rv, SVt_RV);
+	}
+
 	SvRV_set(rv, sv);				/* $rv = \$sv */
 	SvROK_on(rv);
 
diff -up perl-5.10.0/ext/Storable/t/overload.t.old perl-5.10.0/ext/Storable/t/overload.t
--- perl-5.10.0/ext/Storable/t/overload.t.old	2007-12-18 11:47:07.000000000 +0100
+++ perl-5.10.0/ext/Storable/t/overload.t	2008-09-30 14:05:04.000000000 +0200
@@ -25,7 +25,7 @@ sub ok;
 
 use Storable qw(freeze thaw);
 
-print "1..16\n";
+print "1..20\n";
 
 package OVERLOADED;
 
@@ -59,6 +59,14 @@ sub make {
 	return $self;
 }
 
+package SCALAR_REF_TO_OVER;
+
+sub create {
+my ($class) = @_;
+my $over = bless {}, 'OVER';
+return bless \$over, $class;
+}
+
 package OVER;
 
 use overload
@@ -103,4 +111,11 @@ ok 13, $@ eq "";
 ok 14, ref ($t) eq 'REF';
 ok 15, ref ($$t) eq 'HAS_OVERLOAD';
 ok 16, $$$t eq 'snow';
+$c = SCALAR_REF_TO_OVER->create();
+# Don't segfault here
+$d = thaw freeze $c;
+ok 17, ref($c) eq 'SCALAR_REF_TO_OVER';
+ok 18, ref($d) eq 'SCALAR_REF_TO_OVER';
+ok 19, ref($$c) eq 'OVER';
+ok 20, ref($$d) eq 'OVER';
 1;