aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjshin@chromium.org <jshin@chromium.org>2014-11-14 19:50:50 +0000
committerjshin@chromium.org <jshin@chromium.org>2014-11-14 19:50:50 +0000
commit6242e2fbb36f486f2c0addd1c3cef67fc4ed33fb (patch)
treeb0fd7158a460dbc8b61531475c0ef07339e48a00
parent3af4ce5982311035e5f36803d547c0befa576c8c (diff)
downloadicu-6242e2fbb36f486f2c0addd1c3cef67fc4ed33fb.tar.gz
Add regex.patch file forgotten in the previous CL
BUG=422824,430353 TEST=NONE TBR=mbarbella Review URL: https://codereview.chromium.org/719943004 git-svn-id: http://src.chromium.org/svn/trunk/deps/third_party/icu52@292944 4ff67af0-8c30-449e-8e8b-ad334ec8d88c
-rw-r--r--patches/regex.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/patches/regex.patch b/patches/regex.patch
new file mode 100644
index 0000000..4f74ee1
--- /dev/null
+++ b/patches/regex.patch
@@ -0,0 +1,86 @@
+Index: source/i18n/regexcmp.h
+===================================================================
+--- source/i18n/regexcmp.h (revision 292476)
++++ source/i18n/regexcmp.h (working copy)
+@@ -182,7 +182,9 @@
+ int32_t fMatchOpenParen; // The position in the compiled pattern
+ // of the slot reserved for a state save
+ // at the start of the most recently processed
+- // parenthesized block.
++ // parenthesized block. Updated when processing
++ // a close to the location for the corresponding open.
++
+ int32_t fMatchCloseParen; // The position in the pattern of the first
+ // location after the most recently processed
+ // parenthesized block.
+Index: source/i18n/regexcmp.cpp
+===================================================================
+--- source/i18n/regexcmp.cpp (revision 292476)
++++ source/i18n/regexcmp.cpp (working copy)
+@@ -2133,6 +2133,10 @@
+ int32_t patEnd = fRXPat->fCompiledPat->size() - 1;
+ int32_t minML = minMatchLength(fMatchOpenParen, patEnd);
+ int32_t maxML = maxMatchLength(fMatchOpenParen, patEnd);
++ if (URX_TYPE(maxML) != 0) {
++ error(U_REGEX_LOOK_BEHIND_LIMIT);
++ break;
++ }
+ if (maxML == INT32_MAX) {
+ error(U_REGEX_LOOK_BEHIND_LIMIT);
+ break;
+@@ -2166,6 +2170,10 @@
+ int32_t patEnd = fRXPat->fCompiledPat->size() - 1;
+ int32_t minML = minMatchLength(fMatchOpenParen, patEnd);
+ int32_t maxML = maxMatchLength(fMatchOpenParen, patEnd);
++ if (URX_TYPE(maxML) != 0) {
++ error(U_REGEX_LOOK_BEHIND_LIMIT);
++ break;
++ }
+ if (maxML == INT32_MAX) {
+ error(U_REGEX_LOOK_BEHIND_LIMIT);
+ break;
+@@ -2329,7 +2337,15 @@
+ int32_t topOfBlock = blockTopLoc(FALSE);
+ if (fIntervalUpper == 0) {
+ // Pathological case. Attempt no matches, as if the block doesn't exist.
++ // Discard the generated code for the block.
++ // If the block included parens, discard the info pertaining to them as well.
+ fRXPat->fCompiledPat->setSize(topOfBlock);
++ if (fMatchOpenParen >= topOfBlock) {
++ fMatchOpenParen = -1;
++ }
++ if (fMatchCloseParen >= topOfBlock) {
++ fMatchCloseParen = -1;
++ }
+ return TRUE;
+ }
+
+Index: source/test/testdata/regextst.txt
+===================================================================
+--- source/test/testdata/regextst.txt (revision 292476)
++++ source/test/testdata/regextst.txt (working copy)
+@@ -1173,6 +1173,24 @@
+ "(?<=(?:){11})bc" "<0>bc</0>" # Empty (?:) expression.
+
+
++# Bug 11369
++# Incorrect optimization of patterns with a zero length quantifier {0}
++
++"(.|b)(|b){0}\$(?#xxx){3}(?>\D*)" "AAAAABBBBBCCCCCDDDDEEEEE"
++"(|b)ab(c)" "<0><1></1>ab<2>c</2></0>"
++"(|b){0}a{3}(D*)" "<0>aaa<2></2></0>"
++"(|b){0,1}a{3}(D*)" "<0><1></1>aaa<2></2></0>"
++"((|b){0})a{3}(D*)" "<0><1></1>aaa<3></3></0>"
++
++# Bug 11370
++# Max match length computation of look-behind expression gives result that is too big to fit in the
++# in the 24 bit operand portion of the compiled code. Expressions should fail to compile
++# (Look-behind match length must be bounded. This case is treated as unbounded, an error.)
++
++"(?<!(0123456789a){10000000})x" E "no match"
++"(?<!\\ubeaf(\\ubeaf{11000}){11000})" E "no match"
++
++
+ # Random debugging, Temporary
+ #
+ #"^(?:a?b?)*$" "a--"