BOUND regex opcodes (\b, \B) could try to scan zero length UTF-8.
[p5sagit/p5-mst-13.2.git] / sv.c
diff --git a/sv.c b/sv.c
index 2cc3c43..be1947a 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -2010,6 +2010,7 @@ Perl_looks_like_number(pTHX_ SV *sv)
            s++; if (*s != 'I' && *s != 'i') return 0;
            s++; if (*s != 'T' && *s != 't') return 0;
            s++; if (*s != 'Y' && *s != 'y') return 0;
+           s++;
        }
        sawinf = 1;
     }
@@ -2859,7 +2860,8 @@ Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
        if (SvTEMP(sstr) &&             /* slated for free anyway? */
            SvREFCNT(sstr) == 1 &&      /* and no other references to it? */
            !(sflags & SVf_OOK) &&      /* and not involved in OOK hack? */
-           SvLEN(sstr))                        /* and really is a string */
+           SvLEN(sstr)         &&      /* and really is a string */
+           !(PL_op && PL_op->op_type == OP_AASSIGN)) /* and won't be needed again, potentially */
        {
            if (SvPVX(dstr)) {          /* we know that dtype >= SVt_PV */
                if (SvOOK(dstr)) {
@@ -2961,8 +2963,11 @@ void
 Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
 {
     register char *dptr;
-    assert(len >= 0);  /* STRLEN is probably unsigned, so this may
-                         elicit a warning, but it won't hurt. */
+    {
+        /* len is STRLEN which is unsigned, need to copy to signed */
+       IV iv = len;
+       assert(iv >= 0);
+    }
     SV_CHECK_THINKFIRST(sv);
     if (!ptr) {
        (void)SvOK_off(sv);
@@ -6619,6 +6624,10 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
            *--eptr = '%';
 
            (void)sprintf(PL_efloatbuf, eptr, nv);
+#ifdef USE_LOCALE_NUMERIC
+           if ((PL_hints & HINT_LOCALE) && maybe_tainted)
+               *maybe_tainted = TRUE;
+#endif
 
            eptr = PL_efloatbuf;
            elen = strlen(PL_efloatbuf);
@@ -7653,6 +7662,14 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl)
            av = (AV*)POPPTR(ss,ix);
            TOPPTR(nss,ix) = av_dup(av);
            break;
+       case SAVEt_PADSV:
+           longval = (long)POPLONG(ss,ix);
+           TOPLONG(nss,ix) = longval;
+           ptr = POPPTR(ss,ix);
+           TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+           sv = (SV*)POPPTR(ss,ix);
+           TOPPTR(nss,ix) = sv_dup(sv);
+           break;
        default:
            Perl_croak(aTHX_ "panic: ss_dup inconsistency");
        }