Fix for 20001128.006, be more careful in Perl_sv_utf8_downgrade().
Jarkko Hietaniemi [Thu, 30 Nov 2000 20:41:39 +0000 (20:41 +0000)]
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

sv.c

diff --git a/sv.c b/sv.c
index d7b4c8b..01076cb 100644 (file)
--- 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;
 }