summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/httpd.h2
-rw-r--r--include/util_varbuf.h2
-rw-r--r--modules/filters/mod_substitute.c10
-rw-r--r--server/util.c4
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) {