diff --git a/core/routing.c b/core/routing.c index a80d4b07..f46b2f9a 100644 --- a/core/routing.c +++ b/core/routing.c @@ -81,11 +81,13 @@ struct uwsgi_buffer *uwsgi_routing_translate(struct wsgi_request *wsgi_req, stru case 2: if (pass1[i] == '}') { uint16_t vallen = 0; + int need_free = 0; char *value = NULL; char *bracket = memchr(key, '[', keylen); if (bracket && keylen > 0 && key[keylen-1] == ']') { struct uwsgi_route_var *urv = uwsgi_get_route_var(key, bracket - key); if (urv) { + need_free = urv->need_free; value = urv->func(wsgi_req, bracket + 1, keylen - (urv->name_len+2), &vallen); } else { @@ -96,7 +98,15 @@ struct uwsgi_buffer *uwsgi_routing_translate(struct wsgi_request *wsgi_req, stru value = uwsgi_get_var(wsgi_req, key, keylen, &vallen); } if (value) { - if (uwsgi_buffer_append(ub, value, vallen)) goto error; + if (uwsgi_buffer_append(ub, value, vallen)) { + if (need_free) { + free(value); + } + goto error; + } + if (need_free) { + free(value); + } } status = 0; key = NULL; diff --git a/uwsgi.h b/uwsgi.h index 44323d26..af7a5515 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1110,6 +1110,7 @@ struct uwsgi_route_var { char *name; uint16_t name_len; char *(*func)(struct wsgi_request *, char *, uint16_t, uint16_t *); + int need_free; struct uwsgi_route_var *next; };