Skip to content

Commit f874dff

Browse files
committed
subsys: dns: resolve.c dns_resolve_close() fails to clean up DNS server
dns_resolve_close() fails to clean up DNS server slots when the context state is DNS_RESOLVE_CONTEXT_INACTIVE, leaving stale server configuration data that causes subsequent dns_resolve_init() calls to incorrectly detect "server already exists" and skip socket creation, breaking DNS resolution. Signed-off-by: Zafer SEN [email protected]
1 parent e438b57 commit f874dff

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

subsys/net/lib/dns/resolve.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2269,7 +2269,30 @@ static int dns_resolve_close_locked(struct dns_resolve_context *ctx)
22692269
int i, ret;
22702270

22712271
if (ctx->state != DNS_RESOLVE_CONTEXT_ACTIVE) {
2272-
return -ENOENT;
2272+
/* Even if context is not ACTIVE, we should still close any open sockets
2273+
* to ensure proper cleanup. This handles cases where context is INACTIVE
2274+
* but server slots still have valid data from previous initialization.
2275+
*/
2276+
LOG_INF("DNS context not ACTIVE (state=%d), but will close any open servers",
2277+
ctx->state);
2278+
2279+
/* Close any servers that have open sockets */
2280+
for (i = 0; i < SERVER_COUNT; i++) {
2281+
if (ctx->servers[i].sock >= 0 ||
2282+
ctx->servers[i].dns_server.sa_family != 0) {
2283+
LOG_INF("Closing server[%d] sock=%d sa_family=%d",
2284+
i, ctx->servers[i].sock,
2285+
ctx->servers[i].dns_server.sa_family);
2286+
ret = dns_server_close(ctx, i);
2287+
if (ret < 0 && ret != -ENOENT) {
2288+
NET_DBG("Cannot close DNS server %d (%d)", i, ret);
2289+
}
2290+
}
2291+
}
2292+
2293+
/* Ensure state is INACTIVE */
2294+
ctx->state = DNS_RESOLVE_CONTEXT_INACTIVE;
2295+
return 0;
22732296
}
22742297

22752298
ctx->state = DNS_RESOLVE_CONTEXT_DEACTIVATING;

0 commit comments

Comments
 (0)