From: Stefan Fritsch Date: Sun, 9 Dec 2012 13:10:46 +0000 (+0000) Subject: Merge r1343109: X-Git-Tag: 2.4.4~352 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c2f96d90e419d39250ac8770d9cd699f9c1ec24f;p=apache Merge r1343109: Make ap_regcomp() return AP_REG_ESPACE if out of memory. Make ap_pregcomp() abort if out of memory. This raises the minimum PCRE requirement to version 6.0, released in 2005. Reviewed by: jim, sf, minfrin git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1418930 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 5522149eb4..f4a94db7cb 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,10 @@ Changes with Apache 2.4.4 + *) core: Make ap_regcomp() return AP_REG_ESPACE if out of memory. Make + ap_pregcomp() abort if out of memory. This raises the minimum PCRE + requirement to version 6.0. [Stefan Fritsch] + *) mod_proxy: Add ability to configure the sticky session separator. PR 53893. [, Jim Jagielski] diff --git a/STATUS b/STATUS index 99ca52280b..047deab1c1 100644 --- a/STATUS +++ b/STATUS @@ -91,13 +91,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * core: Make ap_regcomp() return AP_REG_ESPACE if out of memory. - Make ap_pregcomp() abort if out of memory. This raises the minimum - PCRE requirement to version 6.0, released in 2005. - trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1343109 - 2.4.x patch: trunk patch works - +1: jim, sf, minfrin - * util: make varbuf functions treat AP_VARBUF_UNKNOWN consistently trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1359884 2.4.x patch: trunk patch works diff --git a/configure.in b/configure.in index e0f97ce1ee..9cbbe60843 100644 --- a/configure.in +++ b/configure.in @@ -226,6 +226,11 @@ if test "$PCRE_CONFIG" != "false"; then if $PCRE_CONFIG --version >/dev/null 2>&1; then :; else AC_MSG_ERROR([Did not find pcre-config script at $PCRE_CONFIG]) fi + case `$PCRE_CONFIG --version` in + [[1-5].*]) + AC_MSG_ERROR([Need at least pcre version 6.0]) + ;; + esac AC_MSG_NOTICE([Using external PCRE library from $PCRE_CONFIG]) APR_ADDTO(PCRE_INCLUDES, [`$PCRE_CONFIG --cflags`]) APR_ADDTO(PCRE_LIBS, [`$PCRE_CONFIG --libs`]) diff --git a/server/util.c b/server/util.c index 95411bbf13..63d5192a1c 100644 --- a/server/util.c +++ b/server/util.c @@ -278,8 +278,10 @@ AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern, int cflags) { ap_regex_t *preg = apr_palloc(p, sizeof *preg); - - if (ap_regcomp(preg, pattern, cflags)) { + int err = ap_regcomp(preg, pattern, cflags); + if (err) { + if (err == AP_REG_ESPACE) + ap_abort_on_oom(); return NULL; } diff --git a/server/util_pcre.c b/server/util_pcre.c index 2d157c0c10..1e83cad080 100644 --- a/server/util_pcre.c +++ b/server/util_pcre.c @@ -123,6 +123,7 @@ AP_DECLARE(int) ap_regcomp(ap_regex_t * preg, const char *pattern, int cflags) { const char *errorptr; int erroffset; + int errcode = 0; int options = 0; if ((cflags & AP_REG_ICASE) != 0) @@ -133,11 +134,18 @@ AP_DECLARE(int) ap_regcomp(ap_regex_t * preg, const char *pattern, int cflags) options |= PCRE_DOTALL; preg->re_pcre = - pcre_compile(pattern, options, &errorptr, &erroffset, NULL); + pcre_compile2(pattern, options, &errcode, &errorptr, &erroffset, NULL); preg->re_erroffset = erroffset; - if (preg->re_pcre == NULL) + if (preg->re_pcre == NULL) { + /* + * There doesn't seem to be constants defined for compile time error + * codes. 21 is "failed to get memory" according to pcreapi(3). + */ + if (errcode == 21) + return AP_REG_ESPACE; return AP_REG_INVARG; + } pcre_fullinfo((const pcre *)preg->re_pcre, NULL, PCRE_INFO_CAPTURECOUNT, &(preg->re_nsub));