]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/resolve: make qsource.headers a struct instead of pointer
authorTomas Krizek <tomas.krizek@nic.cz>
Thu, 8 Apr 2021 14:25:01 +0000 (16:25 +0200)
committerTomas Krizek <tomas.krizek@nic.cz>
Mon, 24 May 2021 12:20:15 +0000 (14:20 +0200)
daemon/lua/kres-gen.lua
daemon/worker.c
lib/resolve.h

index a5413aaad7ac18aff2b3e97af49cec810b63eebe..679d028cb0d646b1bf35d5daae90ef55575b867b 100644 (file)
@@ -197,7 +197,7 @@ struct kr_request {
                struct kr_request_qsource_flags flags;
                size_t size;
                int32_t stream_id;
-               kr_http_header_array_t *headers;
+               kr_http_header_array_t headers;
        } qsource;
        struct {
                unsigned int rtt;
index 35f82f188dc8facef8c81a88769aa74b475726c3..0207554b946a8d450d23968f19cb95763916c377 100644 (file)
@@ -378,20 +378,20 @@ static struct request_ctx *request_create(struct worker_ctx *worker,
        req->vars_ref = LUA_NOREF;
        req->uid = uid;
        req->qsource.flags.xdp = is_xdp;
+       array_init(req->qsource.headers);
        if (session) {
                req->qsource.flags.tcp = session_get_handle(session)->type == UV_TCP;
                req->qsource.flags.tls = session_flags(session)->has_tls;
                req->qsource.flags.http = session_flags(session)->has_http;
                req->qsource.stream_id = -1;
-               req->qsource.headers = NULL;
 #if ENABLE_DOH2
                if (req->qsource.flags.http) {
                        struct http_ctx *http_ctx = session_http_get_server_ctx(session);
                        struct http_stream stream = queue_head(http_ctx->streams);
                        req->qsource.stream_id = stream.id;
-                       /* Take ownership of HTTP headers. */
                        if (stream.headers) {
-                               req->qsource.headers = stream.headers;
+                               req->qsource.headers = *stream.headers;
+                               free(stream.headers);
                                stream.headers = NULL;
                        }
                }
@@ -464,14 +464,12 @@ static void request_free(struct request_ctx *ctx)
                ctx->req.vars_ref = LUA_NOREF;
        }
        /* Free HTTP/2 headers for DoH requests. */
-       if (ctx->req.qsource.headers) {  // TODO maybe refactor elsewhere into function
-               for(int i = 0; i < ctx->req.qsource.headers->len; i++) {
-                       free(ctx->req.qsource.headers->at[i].name);
-                       free(ctx->req.qsource.headers->at[i].value);
-               }
-               array_clear(*ctx->req.qsource.headers);
-               free(ctx->req.qsource.headers);
+       for(int i = 0; i < ctx->req.qsource.headers.len; i++) {
+               free(ctx->req.qsource.headers.at[i].name);
+               free(ctx->req.qsource.headers.at[i].value);
        }
+       array_clear(ctx->req.qsource.headers);
+
        /* Make sure to free XDP buffer in case it wasn't sent. */
        if (ctx->req.alloc_wire_cb) {
        #if ENABLE_XDP
index 0a6ee4cc83999280a9d01b1a8a3131246dac07a7..e6aeb484f874161def120f3df909b42716b120b4 100644 (file)
@@ -211,7 +211,7 @@ struct kr_request {
                struct kr_request_qsource_flags flags; /**< See definition above. */
                size_t size; /**< query packet size */
                int32_t stream_id; /**< HTTP/2 stream ID for DoH requests */
-               kr_http_header_array_t *headers;  /**< HTTP/2 headers for DoH requests */
+               kr_http_header_array_t headers;  /**< HTTP/2 headers for DoH requests */
        } qsource;
        struct {
                unsigned rtt;                  /**< Current upstream RTT */