util.c: Stop ck_index/fbm_compile from abusing readonliness
authorFather Chrysostomos <sprout@cpan.org>
Fri, 21 Jun 2013 21:19:54 +0000 (14:19 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 23 Jun 2013 06:16:40 +0000 (23:16 -0700)
There is currently a convenient exception in sv_force_normal that
allows read-only scalars to be modified at compile time.

I want to get rid of it, since most code that relies on it is buggy.

So stop ck_index from relying on that when it calls fbm_compile by
stopping fbm_compile from triggering the error by forcing stringifica-
tion of variables that are already strings.

util.c

diff --git a/util.c b/util.c
index e07ae4d..11a7863 100644 (file)
--- a/util.c
+++ b/util.c
@@ -539,7 +539,9 @@ Perl_fbm_compile(pTHX_ SV *sv, U32 flags)
        if (mg && mg->mg_len >= 0)
            mg->mg_len++;
     }
-    s = (U8*)SvPV_force_mutable(sv, len);
+    if (!SvPOK(sv) || SvNIOKp(sv) || SvIsCOW(sv))
+       s = (U8*)SvPV_force_mutable(sv, len);
+    else s = (U8 *)SvPV_mutable(sv, len);
     if (len == 0)              /* TAIL might be on a zero-length string. */
        return;
     SvUPGRADE(sv, SVt_PVMG);