diff options
-rw-r--r-- | include/httpd.h | 2 | ||||
-rw-r--r-- | include/util_varbuf.h | 2 | ||||
-rw-r--r-- | modules/filters/mod_substitute.c | 10 | ||||
-rw-r--r-- | server/util.c | 4 |
4 files changed, 9 insertions, 9 deletions
diff --git a/include/httpd.h b/include/httpd.h index f6b372eb53..28c9eb179e 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -1799,7 +1799,7 @@ AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input, const char *sour * @param source The string that was originally matched to the regex * @param nmatch the nmatch returned from ap_pregex * @param pmatch the pmatch array returned from ap_pregex - * @param maxlen the maximum string length to return + * @param maxlen the maximum string length to return, 0 for unlimited * @return The substituted string, or NULL on error */ AP_DECLARE(apr_status_t) ap_pregsub_ex(apr_pool_t *p, char **result, diff --git a/include/util_varbuf.h b/include/util_varbuf.h index 64637f3b4c..28fb867203 100644 --- a/include/util_varbuf.h +++ b/include/util_varbuf.h @@ -135,7 +135,7 @@ AP_DECLARE(char *) ap_varbuf_pdup(apr_pool_t *p, struct ap_varbuf *vb, * @param source The string that was originally matched to the regex * @param nmatch the nmatch returned from ap_pregex * @param pmatch the pmatch array returned from ap_pregex - * @param maxlen the maximum string length to append to vb + * @param maxlen the maximum string length to append to vb, 0 for unlimited * @return APR_SUCCESS if successful * @note Just like ap_pregsub(), this function does not copy the part of * *source before the matching part (i.e. the first pmatch[0].rm_so diff --git a/modules/filters/mod_substitute.c b/modules/filters/mod_substitute.c index 3a59caa99e..bd0dafd70e 100644 --- a/modules/filters/mod_substitute.c +++ b/modules/filters/mod_substitute.c @@ -98,7 +98,6 @@ static void do_pattmatch(ap_filter_t *f, apr_bucket *inb, apr_size_t bytes; apr_size_t len; const char *buff; - const char *repl; struct ap_varbuf vb; apr_bucket *b; apr_bucket *tmp_b; @@ -135,6 +134,7 @@ static void do_pattmatch(ap_filter_t *f, apr_bucket *inb, int have_match = 0; vb.strlen = 0; if (script->pattern) { + const char *repl; while ((repl = apr_strmatch(script->pattern, buff, bytes))) { have_match = 1; @@ -187,6 +187,7 @@ static void do_pattmatch(ap_filter_t *f, apr_bucket *inb, else if (script->regexp) { int left = bytes; const char *pos = buff; + char *repl; while (!ap_regexec_len(script->regexp, pos, left, AP_MAX_REG_MATCH, regm, 0)) { have_match = 1; @@ -196,12 +197,11 @@ static void do_pattmatch(ap_filter_t *f, apr_bucket *inb, ap_varbuf_strmemcat(&vb, pos, regm[0].rm_so); /* add replacement string */ ap_varbuf_regsub(&vb, script->replacement, pos, - AP_MAX_REG_MATCH, regm, - APR_SIZE_MAX); + AP_MAX_REG_MATCH, regm, 0); } else { - repl = ap_pregsub(pool, script->replacement, pos, - AP_MAX_REG_MATCH, regm); + ap_pregsub_ex(pool, &repl, script->replacement, pos, + AP_MAX_REG_MATCH, regm, 0); len = (apr_size_t) (regm[0].rm_eo - regm[0].rm_so); SEDRMPATBCKT(b, regm[0].rm_so, tmp_b, len); tmp_b = apr_bucket_transient_create(repl, diff --git a/server/util.c b/server/util.c index 0f772e6305..abd7a10e42 100644 --- a/server/util.c +++ b/server/util.c @@ -386,7 +386,7 @@ static apr_status_t regsub_core(apr_pool_t *p, char **result, return APR_EINVAL; if (!nmatch || nmatch>AP_MAX_REG_MATCH) { len = strlen(src); - if (maxlen > 0 && len > maxlen) + if (maxlen > 0 && len >= maxlen) return APR_ENOMEM; if (!vb) { *result = apr_pstrmemdup(p, src, len); @@ -416,7 +416,7 @@ static apr_status_t regsub_core(apr_pool_t *p, char **result, } - if (len > maxlen && maxlen > 0) + if (len >= maxlen && maxlen > 0) return APR_ENOMEM; if (!vb) { |