BOUND regex opcodes (\b, \B) could try to scan zero length UTF-8.
[p5sagit/p5-mst-13.2.git] / av.c
diff --git a/av.c b/av.c
index ef2c905..e5f6dc8 100644 (file)
--- a/av.c
+++ b/av.c
@@ -554,6 +554,7 @@ Perl_av_unshift(pTHX_ register AV *av, register I32 num)
     register I32 i;
     register SV **ary;
     MAGIC* mg;
+    I32 slide;
 
     if (!av || num <= 0)
        return;
@@ -591,6 +592,9 @@ Perl_av_unshift(pTHX_ register AV *av, register I32 num)
     }
     if (num) {
        i = AvFILLp(av);
+       /* Create extra elements */
+       slide = i > 0 ? i : 0;
+       num += slide;
        av_extend(av, i + num);
        AvFILLp(av) += num;
        ary = AvARRAY(av);
@@ -598,6 +602,10 @@ Perl_av_unshift(pTHX_ register AV *av, register I32 num)
        do {
            ary[--num] = &PL_sv_undef;
        } while (num);
+       /* Make extra elements into a buffer */
+       AvMAX(av) -= slide;
+       AvFILLp(av) -= slide;
+       SvPVX(av) = (char*)(AvARRAY(av) + slide);
     }
 }
 
@@ -796,9 +804,14 @@ Perl_av_exists(pTHX_ AV *av, I32 key)
     if (SvRMAGICAL(av)) {
        if (mg_find((SV*)av,'P') || mg_find((SV*)av,'D')) {
            SV *sv = sv_newmortal();
+           MAGIC *mg;
+
            mg_copy((SV*)av, sv, 0, key);
-           magic_existspack(sv, mg_find(sv, 'p'));
-           return SvTRUE(sv);
+           mg = mg_find(sv, 'p');
+           if (mg) {
+               magic_existspack(sv, mg);
+               return SvTRUE(sv);
+           }
        }
     }
     if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef