]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib: tweak selection errors when consuming cached answer
authorVladimír Čunát <vladimir.cunat@nic.cz>
Wed, 24 May 2023 10:12:42 +0000 (12:12 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Mon, 12 Jun 2023 08:32:57 +0000 (10:32 +0200)
Forwarding-related changes uncovered this case
in integration.iter_limits test.  Errors can happen also
when consuming data produced by cache, in which case there's
no suitable server to blame for the error.

lib/resolve-produce.c
lib/selection.c
lib/selection.h

index 72b0709ff3281a7435946c32b105ca40846cabc1..d9bec4337cda4d7719fed804779a1428e6272b1b 100644 (file)
@@ -646,6 +646,7 @@ int kr_resolve_produce(struct kr_request *request, struct kr_transport **transpo
                ITERATE_LAYERS(request, qry, produce, packet);
                if (!(request->state & KR_STATE_FAIL) && knot_wire_get_qr(packet->wire)) {
                        /* Produced an answer from cache, consume it. */
+                       kr_server_selection_cached(qry);
                        qry->secret = 0;
                        request->state = KR_STATE_CONSUME;
                        ITERATE_LAYERS(request, qry, consume, packet);
index c25782e62aafa9e06e06ddafe2efafdba74a7379..dc3a601c65045ae08e2a6ef77e74702337f2c6f8 100644 (file)
@@ -772,6 +772,15 @@ void kr_server_selection_init(struct kr_query *qry)
                        mempool, &qry->server_selection.local_state->private);
        }
 }
+void kr_server_selection_cached(struct kr_query *qry)
+{
+       qry->server_selection = (struct kr_server_selection){
+               .initialized = false,
+               // we reuse iter_error, as it's no-op if (!initialized)
+               .error = iter_error,
+               // everything else is NULL
+       };
+}
 
 int kr_forward_add_target(struct kr_request *req, const struct sockaddr *sock)
 {
index 34cc69c4d788de5e3ca4d028495a4777e0338106..0938e38046a6dbf5a8cd98d43b40e018defed5c4 100644 (file)
@@ -131,6 +131,12 @@ struct kr_server_selection {
  */
 KR_EXPORT
 void kr_server_selection_init(struct kr_query *qry);
+/**
+ * @brief Ensure server selection state suitable for processing "reply from cache".
+ *
+ * In particular, qry->server_selection.error() calls shouldn't crash.
+ */
+void kr_server_selection_cached(struct kr_query *qry);
 
 /**
  * @brief Add forwarding target to request.