diff options
Diffstat (limited to 'src/vmod_dbrw.c')
-rw-r--r-- | src/vmod_dbrw.c | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/src/vmod_dbrw.c b/src/vmod_dbrw.c index 8afaf04..2895ea5 100644 --- a/src/vmod_dbrw.c +++ b/src/vmod_dbrw.c @@ -265,12 +265,10 @@ expand_backref(struct sess *sp, const char *str, const char *val, size_t matchcount, regmatch_t *matches, char *qry) { unsigned u; - char *b, *e, *p; + char *b, *p; u = WS_Reserve(sp->wrk->ws, 0); - e = b = sp->wrk->ws->f; - e += u; - p = b; + p = b = sp->wrk->ws->f; while (*val) { if (u == 0) { @@ -310,17 +308,9 @@ expand_backref(struct sess *sp, const char *str, const char *val, u--; } - if (u == 0) { - WS_Release(sp->wrk->ws, 0); - return NULL; - } - - *p = 0; - u--; - if (qry) { - size_t len = strlen(qry) + 1; - if (len >= u) { + size_t len = strlen(qry); + if (len + 1 >= u) { WS_Release(sp->wrk->ws, 0); return NULL; } @@ -329,11 +319,17 @@ expand_backref(struct sess *sp, const char *str, const char *val, else *p++ = '?'; memcpy(p, qry, len); + p += len; u -= len; - } + } + + if (u == 0) { + WS_Release(sp->wrk->ws, 0); + return NULL; + } + *p = 0; - if (u) - WS_Release(sp->wrk->ws, u); + WS_ReleaseP(sp->wrk->ws, p); return b; } |