[inseparable changes from patch from perl5.003_12 to perl5.003_13]
[p5sagit/p5-mst-13.2.git] / doop.c
diff --git a/doop.c b/doop.c
index ddcaf36..836027e 100644 (file)
--- a/doop.c
+++ b/doop.c
 #include <signal.h>
 #endif
 
-#ifdef BUGGY_MSC
- #pragma function(memcmp)
-#endif /* BUGGY_MSC */
-
-#ifdef BUGGY_MSC
- #pragma intrinsic(memcmp)
-#endif /* BUGGY_MSC */
-
 I32
 do_trans(sv,arg)
 SV *sv;
@@ -274,10 +266,14 @@ register SV **sarg;
                (void)sprintf(xs,f,SvNV(arg));
                xlen = strlen(xs);
 #ifdef LC_NUMERIC
-               /* User-defined locales may include arbitrary characters */
-               if (! numeric_standard)
+               /*
+                * User-defined locales may include arbitrary characters.
+                * And, unfortunately, some system may alloc the "C" locale
+                * to be overridden by a malicious user.
+                */
+               if (op->op_type == OP_SPRINTF)
                    SvTAINTED_on(sv);
-#endif
+#endif /* LC_NUMERIC */
                break;
            case 's':
                ch = *(++t);
@@ -503,7 +499,7 @@ register SV *sv;
                    goto nope;
                len -= rslen - 1;
                s -= rslen - 1;
-               if (memcmp(s, rsptr, rslen))
+               if (memNE(s, rsptr, rslen))
                    goto nope;
                count += rslen;
            }
@@ -539,12 +535,21 @@ SV *right;
     char *lsave = lc;
     char *rsave = rc;
 
-    dc = SvPV_force(sv,na);
     len = leftlen < rightlen ? leftlen : rightlen;
     lensave = len;
-    if (SvCUR(sv) < len) {
-       dc = SvGROW(sv,len + 1);
-       (void)memzero(dc + SvCUR(sv), len - SvCUR(sv) + 1);
+    if (SvOK(sv)) {
+       dc = SvPV_force(sv, na);
+       if (SvCUR(sv) < len) {
+           dc = SvGROW(sv, len + 1);
+           (void)memzero(dc + SvCUR(sv), len - SvCUR(sv) + 1);
+       }
+    }
+    else {
+       I32 needlen = ((optype == OP_BIT_AND)
+                       ? len : (leftlen > rightlen ? leftlen : rightlen));
+       Newz(801, dc, needlen + 1, char);
+       (void)sv_usepvn(sv, dc, needlen);
+       dc = SvPVX(sv);         /* sv_usepvn() calls Renew() */
     }
     SvCUR_set(sv, len);
     (void)SvPOK_only(sv);