(perl #130684) allocate enough space for the extra 'x'
authorTony Cook <tony@develop-help.com>
Wed, 1 Feb 2017 03:34:16 +0000 (14:34 +1100)
committerTony Cook <tony@develop-help.com>
Wed, 1 Feb 2017 03:34:16 +0000 (14:34 +1100)
77c8f26370dcc0e added support for a doubled x regexp flags, and ensured
the doubled flag was passed to the qr// created by
S_compile_runtime_code().

Unfortunately it didn't ensure enough space was allocated for that
extra 'x'.

regcomp.c
t/re/pat.t

index 0a315cb..660be76 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -6526,7 +6526,7 @@ S_compile_runtime_code(pTHX_ RExC_state_t * const pRExC_state,
        int n = 0;
        STRLEN s;
        char *p, *newpat;
-       int newlen = plen + 6; /* allow for "qr''x\0" extra chars */
+       int newlen = plen + 7; /* allow for "qr''xx\0" extra chars */
        SV *sv, *qr_ref;
        dSP;
 
index d5e5d2f..9abe5aa 100644 (file)
@@ -23,7 +23,7 @@ BEGIN {
     skip_all('no re module') unless defined &DynaLoader::boot_DynaLoader;
     skip_all_without_unicode_tables();
 
-plan tests => 835;  # Update this when adding/deleting tests.
+plan tests => 836;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -1901,6 +1901,12 @@ EOP
            }msx, { stderr => 1 }, "Offsets in debug output are not negative");
        }
     }
+    {
+        # buffer overflow
+        fresh_perl_is("BEGIN{\$^H=0x200000}\ns/[(?{//xx",
+                      "Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE (?{/ at (eval 1) line 1.\n",
+                      {}, "buffer overflow for regexp component");
+    }
 } # End of sub run_tests
 
 1;