diff options
Diffstat (limited to 'net-proxy/dansguardian/files/dansguardian-2.10.1.1-pcre830.patch')
-rw-r--r-- | net-proxy/dansguardian/files/dansguardian-2.10.1.1-pcre830.patch | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/net-proxy/dansguardian/files/dansguardian-2.10.1.1-pcre830.patch b/net-proxy/dansguardian/files/dansguardian-2.10.1.1-pcre830.patch new file mode 100644 index 000000000000..0f96c3a9e2d9 --- /dev/null +++ b/net-proxy/dansguardian/files/dansguardian-2.10.1.1-pcre830.patch @@ -0,0 +1,61 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 80_fix_libcre3_max_sub_expression_allocation.dpatch by Russell Coker +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: libpcre3 sets reg.re_nsub to an exreme large value and dansguardian +## DP: tries to allocate memory for all records which lets malloc fail. +## DP: this patch limits the allocation to 1024 records. (#667664) + +@DPATCH@ +diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' pkg-dansguardian~/src/RegExp.cpp pkg-dansguardian/src/RegExp.cpp +--- pkg-dansguardian~/src/RegExp.cpp 2011-10-29 14:16:31.000000000 +0200 ++++ pkg-dansguardian/src/RegExp.cpp 2012-06-23 11:02:48.821473711 +0200 +@@ -161,14 +161,17 @@ + offsets.clear(); + lengths.clear(); + imatched = false; +- regmatch_t *pmatch = new regmatch_t[reg.re_nsub + 1]; // to hold result ++ int num_sub_expressions = MAX_SUB_EXPRESSIONS; ++ if(reg.re_nsub < num_sub_expressions) ++ num_sub_expressions = reg.re_nsub; ++ regmatch_t *pmatch = new regmatch_t[num_sub_expressions + 1]; // to hold result + if (!pmatch) { // if it failed + delete[]pmatch; + imatched = false; + return false; + // exception? + } +- if (regexec(®, pos, reg.re_nsub + 1, pmatch, 0)) { // run regex ++ if (regexec(®, pos, num_sub_expressions + 1, pmatch, 0)) { // run regex + delete[]pmatch; + imatched = false; + // #ifdef DGDEBUG +@@ -182,7 +185,7 @@ + int error = 0; + while (error == 0) { + largestoffset = 0; +- for (i = 0; i <= (signed) reg.re_nsub; i++) { ++ for (i = 0; i <= (signed) num_sub_expressions; i++) { + if (pmatch[i].rm_so != -1) { + matchlen = pmatch[i].rm_eo - pmatch[i].rm_so; + submatch = new char[matchlen + 1]; +@@ -199,7 +202,7 @@ + } + if (largestoffset > 0) { + pos += largestoffset; +- error = regexec(®, pos, reg.re_nsub + 1, pmatch, REG_NOTBOL); ++ error = regexec(®, pos, num_sub_expressions + 1, pmatch, REG_NOTBOL); + } else { + error = -1; + } +diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' pkg-dansguardian~/src/RegExp.hpp pkg-dansguardian/src/RegExp.hpp +--- pkg-dansguardian~/src/RegExp.hpp 2011-10-29 14:16:31.000000000 +0200 ++++ pkg-dansguardian/src/RegExp.hpp 2012-06-23 11:02:48.821473711 +0200 +@@ -22,6 +22,7 @@ + #ifndef __HPP_REGEXP + #define __HPP_REGEXP + ++#define MAX_SUB_EXPRESSIONS 1024 + + // INCLUDES + |