]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/worker: ensure HTTP headers are freed on ignored queries
authorTomas Krizek <tomas.krizek@nic.cz>
Fri, 2 Jul 2021 08:48:32 +0000 (10:48 +0200)
committerTomas Krizek <tomas.krizek@nic.cz>
Thu, 29 Jul 2021 12:03:10 +0000 (14:03 +0200)
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.

daemon/http.c
daemon/http.h
daemon/worker.c

index ebcbc9eb936ef528b5d9c319affdac910e5f9b89..4c6bb060def0e9f1c58b32aec3bb82227abd825b 100644 (file)
@@ -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);
index c5bbb528e15388a17a10318c8ad987c5332788c2..e76d211f2d612cfe4e3056ce87049af44790d307 100644 (file)
@@ -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
index 1c9e9ea39cf466c5a5b9df7dbedbdc02ea632c02..10e20ae484ee3e8eeaacf6dca755b60aa13239eb 100644 (file)
@@ -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);
        }