Commit 6cf82fb0 authored by Stefan Fritsch's avatar Stefan Fritsch
Browse files

Improve handling of maxlen = APR_SIZE_MAX, noticed by Jim.

Use apr_pregsub_ex() and maxlen = 0 for unlimited in mod_substitute.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1189985 13f79535-47bb-0310-9956-ffa450edef68
parent eaad1e18
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -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
+5 −5
Original line number Diff line number Diff line
@@ -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,
+2 −2
Original line number Diff line number Diff line
@@ -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) {