Revert "PATCH: regex longjmp flaws"
authorNicholas Clark <nick@ccl4.org>
Mon, 21 Jan 2013 19:58:49 +0000 (20:58 +0100)
committerNicholas Clark <nick@ccl4.org>
Tue, 19 Mar 2013 10:53:19 +0000 (11:53 +0100)
This reverts commit 595598ee1f247e72e06e4cfbe0f98406015df5cc.

The netbsd - 5.0.2 compiler pointed out that the recent changes to add
longjmps to speed up some regex compilations can result in clobbering a
few values.  These depend on the compiled code, and so didn't show up in
other compiler's warnings.  This patch reinitializes them after a
longjmp.

[With a lot of hand editing in regcomp.c, to propagate the changes through
subsequent commits.]

regcomp.c
regcomp.h

index 03044ff..316c4ee 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -5584,13 +5584,12 @@ Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
     if (0) {
       redo_first_pass:
         {
-       U8 *src, *dst;
+        U8 *const src = (U8*)exp;
+        U8 *dst;
        int n=0;
        STRLEN s = 0, d = 0;
        bool do_end = 0;
 
-       GET_RE_DEBUG_FLAGS;
-
         /* It's possible to write a regexp in ascii that represents Unicode
         codepoints outside of the byte range, such as via \x{100}. If we
         detect such a sequence we have to convert the entire pattern to utf8
@@ -5606,7 +5605,6 @@ Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count,
         * recalculate the indices.
         * This is essentially an unrolled Perl_bytes_to_utf8() */
 
-       src = (U8*)SvPV_nomg(pat, plen);
        Newx(dst, plen * 2 + 1, U8);
 
        while (s < plen) {
index 9607326..21d2e1e 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -829,11 +829,9 @@ re.pm, especially to the documentation.
     if (re_debug_flags & RE_DEBUG_EXTRA_GPOS) x )
 
 /* initialization */
-/* get_sv() can return NULL during global destruction.  re_debug_flags can get
- * clobbered by a longjmp, so must be initialized */
+/* get_sv() can return NULL during global destruction. */
 #define GET_RE_DEBUG_FLAGS DEBUG_r({ \
         SV * re_debug_flags_sv = NULL; \
-        re_debug_flags = 0;            \
         re_debug_flags_sv = get_sv(RE_DEBUG_FLAGS, 1); \
         if (re_debug_flags_sv) { \
             if (!SvIOK(re_debug_flags_sv)) \