From 808089ae3d96f0e015e323188f0795c3446d3b96 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 4 Dec 2018 22:15:22 +0100 Subject: [PATCH] resolved: add new helper for carefully detach a stream from any server This adds a helper call for detaching a DnsServer from a DnsStream if the latter is the "default" stream of the server. Also, let's unref the stream in dns_stream_stop() rather than dns_stream_free(): as soon as our stream is disconnected by stopping there's really no need to keep it as default stream for the server around. Since dns_stream_free() calls dns_stream_stop() we can remove it from the former. --- src/resolve/resolved-dns-stream.c | 18 +++++++++++++++--- src/resolve/resolved-dns-stream.h | 2 ++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/resolve/resolved-dns-stream.c b/src/resolve/resolved-dns-stream.c index deb5abac5b..8bca32d253 100644 --- a/src/resolve/resolved-dns-stream.c +++ b/src/resolve/resolved-dns-stream.c @@ -17,6 +17,9 @@ static void dns_stream_stop(DnsStream *s) { s->io_event_source = sd_event_source_unref(s->io_event_source); s->timeout_event_source = sd_event_source_unref(s->timeout_event_source); s->fd = safe_close(s->fd); + + /* Disconnect us from the server object if we are now not usable anymore */ + dns_stream_detach(s); } static int dns_stream_update_io(DnsStream *s) { @@ -430,9 +433,6 @@ static DnsStream *dns_stream_free(DnsStream *s) { dns_stream_stop(s); - if (s->server && s->server->stream == s) - s->server->stream = NULL; - if (s->manager) { LIST_REMOVE(streams, s->manager->dns_streams, s); s->manager->n_dns_streams--; @@ -551,3 +551,15 @@ DnsPacket *dns_stream_take_read_packet(DnsStream *s) { s->n_read = 0; return TAKE_PTR(s->read_packet); } + +void dns_stream_detach(DnsStream *s) { + assert(s); + + if (!s->server) + return; + + if (s->server->stream != s) + return; + + dns_server_unref_stream(s->server); +} diff --git a/src/resolve/resolved-dns-stream.h b/src/resolve/resolved-dns-stream.h index 424278ea0a..3faec83467 100644 --- a/src/resolve/resolved-dns-stream.h +++ b/src/resolve/resolved-dns-stream.h @@ -89,3 +89,5 @@ static inline bool DNS_STREAM_QUEUED(DnsStream *s) { } DnsPacket *dns_stream_take_read_packet(DnsStream *s); + +void dns_stream_detach(DnsStream *s); -- 2.25.1