ports/130033: ports/lang/perl5.8: sv_dup() bug causes memory corruption in threaded perl

kevin brintnall kbrint at rufus.net
Mon Dec 29 19:40:02 UTC 2008


>Number:         130033
>Category:       ports
>Synopsis:       ports/lang/perl5.8: sv_dup() bug causes memory corruption in threaded perl
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Dec 29 19:40:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     kevin brintnall
>Release:        7.0-RELEASE
>Organization:
>Environment:
FreeBSD hamachi.rufus.net 7.0-RELEASE-p6 FreeBSD 7.0-RELEASE-p6 #6: Mon Nov 24 14:35:54 CST 2008     root at hamachi.rufus.net:/usr/obj/usr/src/sys/RUFUS  i386


>Description:
A bug in Perl's sv_dup() causes potential memory corruption when new threads are spawned.
The nature of the bug is exacerbated by FreeBSD 7's malloc() implementation, which packs
like-sized allocations tightly together.

A full description of the bug can be found at:

  http://marc.info/?l=perl5-porters&m=123018610517259&w=2



>How-To-Repeat:

>Fix:
The fix has already been intetgrated into Perl's official development branch ("blead"):

  http://perl5.git.perl.org/perl.git/commitdiff/2779b694b3fbb69a13c300a6e239e050151abf6d?hp=f08e0584288c021de71ecd212ba86a45c8f96a5b

That patch does not apply cleanly to Perl 5.8 due to some context changes.  Please consider
adding the attached patch to ports/lang/perl5.8 until a version of Perl 5.8 is released
with the fix.


Patch attached with submission follows:

--- sv.c.orig
+++ sv.c
@@ -10233,7 +10233,8 @@ Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
 	SvSTASH_set(dstr, hv_dup_inc(SvSTASH(sstr), param));
 	AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
 	AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
-	if (AvARRAY((AV*)sstr)) {
+	/* avoid cloning an empty array */
+	if (AvARRAY((AV*)sstr) && AvFILLp((AV*)sstr) >= 0) {
 	    SV **dst_ary, **src_ary;
 	    SSize_t items = AvFILLp((AV*)sstr) + 1;
 
@@ -10258,6 +10259,8 @@ Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
 	else {
 	    SvPV_set(dstr, Nullch);
 	    AvALLOC((AV*)dstr)	= (SV**)NULL;
+	    AvMAX(  (AV*)dstr)	= -1;
+	    AvFILLp((AV*)dstr)	= -1;
 	}
 	break;
     case SVt_PVHV:


>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list