From 84b9ea9583afacd0a493c38d8cb925c6366eb971 Mon Sep 17 00:00:00 2001 From: Tomas Krizek Date: Thu, 8 Apr 2021 16:25:01 +0200 Subject: [PATCH] lib/resolve: make qsource.headers a struct instead of pointer --- daemon/lua/kres-gen.lua | 2 +- daemon/worker.c | 18 ++++++++---------- lib/resolve.h | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/daemon/lua/kres-gen.lua b/daemon/lua/kres-gen.lua index a5413aaad..679d028cb 100644 --- a/daemon/lua/kres-gen.lua +++ b/daemon/lua/kres-gen.lua @@ -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; diff --git a/daemon/worker.c b/daemon/worker.c index 35f82f188..0207554b9 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -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 diff --git a/lib/resolve.h b/lib/resolve.h index 0a6ee4cc8..e6aeb484f 100644 --- a/lib/resolve.h +++ b/lib/resolve.h @@ -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 */ -- 2.47.3