aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/pcre/pcre-8.33_1370.diff
diff options
context:
space:
mode:
authorPatrik Nyblom <[email protected]>2013-07-29 10:54:20 +0200
committerPatrik Nyblom <[email protected]>2013-08-06 16:19:37 +0200
commit6138bb612cd23c0ca37faadbe3fc9944be275228 (patch)
tree780e2eb0deb2e850fddcc54abbfc02c446982ffa /erts/emulator/pcre/pcre-8.33_1370.diff
parent390ee65ba78d571fdc0a8fccb6c456d7346eb9bc (diff)
downloadotp-6138bb612cd23c0ca37faadbe3fc9944be275228.tar.gz
otp-6138bb612cd23c0ca37faadbe3fc9944be275228.tar.bz2
otp-6138bb612cd23c0ca37faadbe3fc9944be275228.zip
Integrate patch for PCRE bug id 1370
Diffstat (limited to 'erts/emulator/pcre/pcre-8.33_1370.diff')
-rw-r--r--erts/emulator/pcre/pcre-8.33_1370.diff60
1 files changed, 60 insertions, 0 deletions
diff --git a/erts/emulator/pcre/pcre-8.33_1370.diff b/erts/emulator/pcre/pcre-8.33_1370.diff
new file mode 100644
index 0000000000..d62398985d
--- /dev/null
+++ b/erts/emulator/pcre/pcre-8.33_1370.diff
@@ -0,0 +1,60 @@
+--- code/trunk/pcre_exec.c 2013/07/02 18:37:36 1346
++++ code/trunk/pcre_exec.c 2013/07/26 10:03:38 1350
+@@ -5637,7 +5637,7 @@
+ }
+ }
+
+- /* Match extended Unicode sequences. We will get here only if the
++ /* Match extended Unicode grapheme clusters. We will get here only if the
+ support is in the binary; otherwise a compile-time error occurs. */
+
+ else if (ctype == OP_EXTUNI)
+@@ -5670,21 +5670,41 @@
+ /* eptr is now past the end of the maximum run */
+
+ if (possessive) continue; /* No backtracking */
++
+ for(;;)
+ {
+- if (eptr == pp) goto TAIL_RECURSE;
++ int lgb, rgb;
++ PCRE_PUCHAR fptr;
++
++ if (eptr == pp) goto TAIL_RECURSE; /* At start of char run */
+ RMATCH(eptr, ecode, offset_top, md, eptrb, RM45);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
++
++ /* Backtracking over an extended grapheme cluster involves inspecting
++ the previous two characters (if present) to see if a break is
++ permitted between them. */
++
+ eptr--;
+- for (;;) /* Move back over one extended */
++ if (!utf) c = *eptr; else
++ {
++ BACKCHAR(eptr);
++ GETCHAR(c, eptr);
++ }
++ rgb = UCD_GRAPHBREAK(c);
++
++ for (;;)
+ {
+- if (!utf) c = *eptr; else
++ if (eptr == pp) goto TAIL_RECURSE; /* At start of char run */
++ fptr = eptr - 1;
++ if (!utf) c = *fptr; else
+ {
+- BACKCHAR(eptr);
+- GETCHAR(c, eptr);
++ BACKCHAR(fptr);
++ GETCHAR(c, fptr);
+ }
+- if (UCD_CATEGORY(c) != ucp_M) break;
+- eptr--;
++ lgb = UCD_GRAPHBREAK(c);
++ if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;
++ eptr = fptr;
++ rgb = lgb;
+ }
+ }
+ }