From: Jarkko Hietaniemi <jhi@iki.fi>
Date: Thu, 30 Nov 2000 20:41:39 +0000 (+0000)
Subject: Fix for 20001128.006, be more careful in Perl_sv_utf8_downgrade().
X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=fa301091a913890fbb1fa04962693e6daf2a2229;p=p5sagit%2Fp5-mst-13.2.git

Fix for 20001128.006, be more careful in Perl_sv_utf8_downgrade().
Why the different platforms behave so differently (core dump vs
no core dump) on this bug is a but of a mystery, but if I had to
guess I would mumble something like 'alignment'.

p4raw-id: //depot/perl@7936
---

diff --git a/sv.c b/sv.c
index d7b4c8b..01076cb 100644
--- a/sv.c
+++ b/sv.c
@@ -2447,22 +2447,26 @@ bool
 Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
 {
     if (SvPOK(sv) && SvUTF8(sv)) {
-        char *c = SvPVX(sv);
-	STRLEN len = SvCUR(sv) + 1;	/* include trailing NUL */
-        if (!utf8_to_bytes((U8*)c, &len)) {
-	    if (fail_ok)
-		return FALSE;
-	    else {
-		if (PL_op)
-		    Perl_croak(aTHX_ "Wide character in %s",
-			       PL_op_desc[PL_op->op_type]);
-		else
-		    Perl_croak(aTHX_ "Wide character");
+        if (SvCUR(sv)) {
+	    char *c = SvPVX(sv);
+	    STRLEN len = SvCUR(sv);
+
+	    if (!utf8_to_bytes((U8*)c, &len)) {
+	        if (fail_ok)
+		    return FALSE;
+		else {
+		    if (PL_op)
+		        Perl_croak(aTHX_ "Wide character in %s",
+				   PL_op_desc[PL_op->op_type]);
+		    else
+		        Perl_croak(aTHX_ "Wide character");
+		}
 	    }
+	    SvCUR(sv) = len;
 	}
-	SvCUR(sv) = len - 1;
 	SvUTF8_off(sv);
     }
+
     return TRUE;
 }