Apply by doing:
	cd /usr/src
	patch -p0 < 001_perl.patch

And then rebuild and install perl:
	cd gnu/usr.bin/perl
	make -f Makefile.bsd-wrapper obj
	make -f Makefile.bsd-wrapper depend
	make -f Makefile.bsd-wrapper
	make -f Makefile.bsd-wrapper install

Index: gnu/usr.bin/perl/globvar.sym
===================================================================
RCS file: /cvs/src/gnu/usr.bin/perl/globvar.sym,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.24.1
diff -u -p -r1.1.1.1 -r1.1.1.1.24.1
--- gnu/usr.bin/perl/globvar.sym	6 Apr 2000 16:08:36 -0000	1.1.1.1
+++ gnu/usr.bin/perl/globvar.sym	3 Jan 2006 04:22:39 -0000	1.1.1.1.24.1
@@ -66,3 +66,4 @@ vtbl_regdatum
 vtbl_collxfrm
 vtbl_amagic
 vtbl_amagicelem
+memory_wrap
Index: gnu/usr.bin/perl/makedef.pl
===================================================================
RCS file: /cvs/src/gnu/usr.bin/perl/makedef.pl,v
retrieving revision 1.1.1.7
retrieving revision 1.1.1.7.4.1
diff -u -p -r1.1.1.7 -r1.1.1.7.4.1
--- gnu/usr.bin/perl/makedef.pl	15 Jan 2005 21:16:26 -0000	1.1.1.7
+++ gnu/usr.bin/perl/makedef.pl	3 Jan 2006 04:22:40 -0000	1.1.1.7.4.1
@@ -635,12 +635,6 @@ else {
 		    )];
 }
 
-if ($define{'PERL_MALLOC_WRAP'}) {
-    emit_symbols [qw(
-		    PL_memory_wrap
-		    )];
-}
-
 unless ($define{'USE_5005THREADS'} || $define{'USE_ITHREADS'}) {
     skip_symbols [qw(
 		    PL_thr_key
Index: gnu/usr.bin/perl/op.c
===================================================================
RCS file: /cvs/src/gnu/usr.bin/perl/op.c,v
retrieving revision 1.10
retrieving revision 1.10.4.1
diff -u -p -r1.10 -r1.10.4.1
--- gnu/usr.bin/perl/op.c	15 Jan 2005 21:30:19 -0000	1.10
+++ gnu/usr.bin/perl/op.c	3 Jan 2006 04:22:40 -0000	1.10.4.1
@@ -2064,7 +2064,6 @@ Perl_fold_constants(pTHX_ register OP *o
 	/* XXX might want a ck_negate() for this */
 	cUNOPo->op_first->op_private &= ~OPpCONST_STRICT;
 	break;
-    case OP_SPRINTF:
     case OP_UCFIRST:
     case OP_LCFIRST:
     case OP_UC:
Index: gnu/usr.bin/perl/opcode.h
===================================================================
RCS file: /cvs/src/gnu/usr.bin/perl/opcode.h,v
retrieving revision 1.8
retrieving revision 1.8.6.1
diff -u -p -r1.8 -r1.8.6.1
--- gnu/usr.bin/perl/opcode.h	9 Aug 2004 18:08:55 -0000	1.8
+++ gnu/usr.bin/perl/opcode.h	3 Jan 2006 04:22:40 -0000	1.8.6.1
@@ -1585,7 +1585,7 @@ EXT U32 PL_opargs[] = {
 	0x0022281c,	/* vec */
 	0x0122291c,	/* index */
 	0x0122291c,	/* rindex */
-	0x0004280f,	/* sprintf */
+	0x0004280d,	/* sprintf */
 	0x00042805,	/* formline */
 	0x0001379e,	/* ord */
 	0x0001378e,	/* chr */
Index: gnu/usr.bin/perl/opcode.pl
===================================================================
RCS file: /cvs/src/gnu/usr.bin/perl/opcode.pl,v
retrieving revision 1.8
retrieving revision 1.8.6.1
diff -u -p -r1.8 -r1.8.6.1
--- gnu/usr.bin/perl/opcode.pl	9 Aug 2004 18:08:55 -0000	1.8
+++ gnu/usr.bin/perl/opcode.pl	3 Jan 2006 04:22:40 -0000	1.8.6.1
@@ -602,7 +602,7 @@ vec		vec			ck_fun		ist@	S S S
 index		index			ck_index	isT@	S S S?
 rindex		rindex			ck_index	isT@	S S S?
 
-sprintf		sprintf			ck_fun		mfst@	S L
+sprintf		sprintf			ck_fun		mst@	S L
 formline	formline		ck_fun		ms@	S L
 ord		ord			ck_fun		ifsTu%	S?
 chr		chr			ck_fun		fsTu%	S?
Index: gnu/usr.bin/perl/patchlevel.h
===================================================================
RCS file: /cvs/src/gnu/usr.bin/perl/patchlevel.h,v
retrieving revision 1.13
retrieving revision 1.13.4.1
diff -u -p -r1.13 -r1.13.4.1
--- gnu/usr.bin/perl/patchlevel.h	2 Feb 2005 20:13:33 -0000	1.13
+++ gnu/usr.bin/perl/patchlevel.h	3 Jan 2006 04:22:40 -0000	1.13.4.1
@@ -121,6 +121,7 @@ hunk.
 static	char	*local_patches[] = {
 	NULL
 	,"SUIDPERLIO1 - fix PERLIO_DEBUG buffer overflow (CAN-2005-0156)"
+	,"SPRINTF0 - fixes for sprintf formatting issues - CVE-2005-3962"
 	,NULL
 };
 
Index: gnu/usr.bin/perl/perl.h
===================================================================
RCS file: /cvs/src/gnu/usr.bin/perl/perl.h,v
retrieving revision 1.10
retrieving revision 1.10.4.1
diff -u -p -r1.10 -r1.10.4.1
--- gnu/usr.bin/perl/perl.h	15 Jan 2005 21:30:20 -0000	1.10
+++ gnu/usr.bin/perl/perl.h	3 Jan 2006 04:22:40 -0000	1.10.4.1
@@ -3071,10 +3071,8 @@ EXTCONST char PL_no_myglob[]
   INIT("\"my\" variable %s can't be in a package");
 EXTCONST char PL_no_localize_ref[]
   INIT("Can't localize through a reference");
-#ifdef PERL_MALLOC_WRAP
 EXTCONST char PL_memory_wrap[]
   INIT("panic: memory wrap");
-#endif
 
 EXTCONST char PL_uuemap[65]
   INIT("`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
Index: gnu/usr.bin/perl/sv.c
===================================================================
RCS file: /cvs/src/gnu/usr.bin/perl/sv.c,v
retrieving revision 1.10
retrieving revision 1.10.4.2
diff -u -p -r1.10 -r1.10.4.2
--- gnu/usr.bin/perl/sv.c	15 Jan 2005 21:30:22 -0000	1.10
+++ gnu/usr.bin/perl/sv.c	3 Jan 2006 04:22:41 -0000	1.10.4.2
@@ -8606,9 +8606,12 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const cha
 	    if (vectorarg) {
 		if (args)
 		    vecsv = va_arg(*args, SV*);
-		else
-		    vecsv = (evix ? evix <= svmax : svix < svmax) ?
-			svargs[evix ? evix-1 : svix++] : &PL_sv_undef;
+		else if (evix) {
+		    vecsv = (evix > 0 && evix <= svmax)
+			? svargs[evix-1] : &PL_sv_undef;
+		} else {
+		    vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
+		}
 		dotstr = SvPVx(vecsv, dotstrlen);
 		if (DO_UTF8(vecsv))
 		    is_utf8 = TRUE;
@@ -8618,12 +8621,13 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const cha
 		vecstr = (U8*)SvPVx(vecsv,veclen);
 		vec_utf8 = DO_UTF8(vecsv);
 	    }
-	    else if (efix ? efix <= svmax : svix < svmax) {
+	    else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
 		vecsv = svargs[efix ? efix-1 : svix++];
 		vecstr = (U8*)SvPVx(vecsv,veclen);
 		vec_utf8 = DO_UTF8(vecsv);
 	    }
 	    else {
+		vecsv = &PL_sv_undef;
 		vecstr = (U8*)"";
 		veclen = 0;
 	    }
@@ -8724,9 +8728,15 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const cha
 
 	if (vectorize)
 	    argsv = vecsv;
-	else if (!args)
-	    argsv = (efix ? efix <= svmax : svix < svmax) ?
-		    svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
+	else if (!args) {
+	    if (efix) {
+		const I32 i = efix-1;
+		argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
+	    } else {
+		argsv = (svix >= 0 && svix < svmax)
+		    ? svargs[svix++] : &PL_sv_undef;
+	    }
+	}
 
 	switch (c = *q++) {
 
@@ -8968,6 +8978,8 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const cha
 		    *--eptr = '0';
 		break;
 	    case 2:
+		if (!uv)
+		    alt = FALSE;
 		do {
 		    dig = uv & 1;
 		    *--eptr = '0' + dig;
@@ -9270,6 +9282,8 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const cha
 
 	/* calculate width before utf8_upgrade changes it */
 	have = esignlen + zeros + elen;
+	if (have < zeros)
+	    Perl_croak_nocontext(PL_memory_wrap);
 
 	if (is_utf8 != has_utf8) {
 	     if (is_utf8) {
@@ -9297,6 +9311,8 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const cha
 	need = (have > width ? have : width);
 	gap = need - have;
 
+	if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
+	    Perl_croak_nocontext(PL_memory_wrap);
 	SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
 	p = SvEND(sv);
 	if (esignlen && fill == '0') {