From: Tomas Krizek Date: Fri, 2 Jul 2021 08:48:32 +0000 (+0200) Subject: daemon/worker: ensure HTTP headers are freed on ignored queries X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=438c804b32cbf94b897d989bc737fbff9c09a472;p=thirdparty%2Fknot-resolver.git daemon/worker: ensure HTTP headers are freed on ignored queries Ignored queries never call create_request() where ownership of headers is taken care of. They need to be explicitly cleared instead, because we're the owners of the pointer here. --- diff --git a/daemon/http.c b/daemon/http.c index 5297c0394..507a3e1a3 100644 --- a/daemon/http.c +++ b/daemon/http.c @@ -254,7 +254,7 @@ static void refuse_stream(nghttp2_session *h2, int32_t stream_id) h2, NGHTTP2_FLAG_NONE, stream_id, NGHTTP2_REFUSED_STREAM); } -static void free_headers(kr_http_header_array_t *headers) +void http_free_headers(kr_http_header_array_t *headers) { if (headers == NULL) return; @@ -273,7 +273,7 @@ static void http_cleanup_stream(struct http_ctx *ctx) ctx->current_method = HTTP_METHOD_NONE; free(ctx->uri_path); ctx->uri_path = NULL; - free_headers(ctx->headers); + http_free_headers(ctx->headers); ctx->headers = NULL; } @@ -772,7 +772,7 @@ void http_free(struct http_ctx *ctx) * processing HTTP stream. */ while (queue_len(ctx->streams) > 0) { struct http_stream stream = queue_head(ctx->streams); - free_headers(stream.headers); + http_free_headers(stream.headers); if (stream.headers == ctx->headers) ctx->headers = NULL; // to prevent double-free queue_pop(ctx->streams); diff --git a/daemon/http.h b/daemon/http.h index c5bbb528e..e76d211f2 100644 --- a/daemon/http.h +++ b/daemon/http.h @@ -58,4 +58,5 @@ ssize_t http_process_input_data(struct session *session, const uint8_t *buf, ssi int http_write(uv_write_t *req, uv_handle_t *handle, knot_pkt_t* pkt, int32_t stream_id, uv_write_cb on_write); void http_free(struct http_ctx *ctx); +void http_free_headers(kr_http_header_array_t *headers); #endif diff --git a/daemon/worker.c b/daemon/worker.c index 1c9e9ea39..10e20ae48 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -1738,8 +1738,11 @@ int worker_submit(struct session *session, (is_query == is_outgoing)) { if (!is_outgoing) { the_worker->stats.dropped += 1; - if (http_ctx) + if (http_ctx) { + struct http_stream stream = queue_head(http_ctx->streams); + http_free_headers(stream.headers); queue_pop(http_ctx->streams); + } } return kr_error(EILSEQ); }