From 00ca4997873354d6792eb9e5eee3d9a0e3c00c68 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Fri, 8 Aug 2014 23:36:45 +0200 Subject: Apply upstream patch r1495 to our PCRE copy It's actually a subset of the patch (tests, docs, other whitespace fixes were dropped). Fixes a stack overflow issue on pathological regexps reported upstream: http://bugs.exim.org/show_bug.cgi?id=1503 Change-Id: If080e4c1e7a86c86459bbbc631c8d8bb3cd7b99f Reviewed-by: Richard J. Moore --- src/3rdparty/pcre/patches/pcre-r1495.patch | 23 +++++++++++++++++++++++ src/3rdparty/pcre/pcre_compile.c | 6 +++++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/3rdparty/pcre/patches/pcre-r1495.patch diff --git a/src/3rdparty/pcre/patches/pcre-r1495.patch b/src/3rdparty/pcre/patches/pcre-r1495.patch new file mode 100644 index 0000000000..d8b4ce097a --- /dev/null +++ b/src/3rdparty/pcre/patches/pcre-r1495.patch @@ -0,0 +1,23 @@ +Index: pcre_compile.c +=================================================================== +--- pcre_compile.c (revision 1494) ++++ pcre_compile.c (revision 1495) +@@ -8267,12 +8267,16 @@ + + /* If it was a capturing subpattern, check to see if it contained any + recursive back references. If so, we must wrap it in atomic brackets. +- In any event, remove the block from the chain. */ ++ Because we are moving code along, we must ensure that any pending recursive ++ references are updated. In any event, remove the block from the chain. */ + + if (capnumber > 0) + { + if (cd->open_caps->flag) + { ++ *code = OP_END; ++ adjust_recurse(start_bracket, 1 + LINK_SIZE, ++ (options & PCRE_UTF8) != 0, cd, cd->hwm); + memmove(start_bracket + 1 + LINK_SIZE, start_bracket, + IN_UCHARS(code - start_bracket)); + *start_bracket = OP_ONCE; + diff --git a/src/3rdparty/pcre/pcre_compile.c b/src/3rdparty/pcre/pcre_compile.c index 9708b93923..e3dd83b4cb 100644 --- a/src/3rdparty/pcre/pcre_compile.c +++ b/src/3rdparty/pcre/pcre_compile.c @@ -8193,12 +8193,16 @@ for (;;) /* If it was a capturing subpattern, check to see if it contained any recursive back references. If so, we must wrap it in atomic brackets. - In any event, remove the block from the chain. */ + Because we are moving code along, we must ensure that any pending recursive + references are updated. In any event, remove the block from the chain. */ if (capnumber > 0) { if (cd->open_caps->flag) { + *code = OP_END; + adjust_recurse(start_bracket, 1 + LINK_SIZE, + (options & PCRE_UTF8) != 0, cd, cd->hwm); memmove(start_bracket + 1 + LINK_SIZE, start_bracket, IN_UCHARS(code - start_bracket)); *start_bracket = OP_ONCE; -- cgit v1.2.3