dryang / rpms / systemd

Forked from rpms/systemd a year ago
Clone
62b62a
From b92fae31236301ba1fcca604c68bb4e908318c49 Mon Sep 17 00:00:00 2001
b2c191
From: Lennart Poettering <lennart@poettering.net>
b2c191
Date: Tue, 4 Dec 2018 22:13:39 +0100
b2c191
Subject: [PATCH] resolved: pin stream while calling callbacks for it
b2c191
b2c191
These callbacks might unref the stream, but we still have to access it,
b2c191
let's hence ref it explicitly.
b2c191
b2c191
Maybe fixes: #10725
b2c191
b2c191
(cherry picked from commit d973d94dec349fb676fdd844f6fe2ada3538f27c)
b2c191
b2c191
Resolves: #2110548
b2c191
---
b2c191
 src/resolve/resolved-dns-stream.c | 4 +++-
b2c191
 1 file changed, 3 insertions(+), 1 deletion(-)
b2c191
b2c191
diff --git a/src/resolve/resolved-dns-stream.c b/src/resolve/resolved-dns-stream.c
62b62a
index 555e200a23..ca0313d1d7 100644
b2c191
--- a/src/resolve/resolved-dns-stream.c
b2c191
+++ b/src/resolve/resolved-dns-stream.c
b2c191
@@ -42,6 +42,8 @@ static int dns_stream_update_io(DnsStream *s) {
b2c191
 }
b2c191
 
b2c191
 static int dns_stream_complete(DnsStream *s, int error) {
b2c191
+        _cleanup_(dns_stream_unrefp) _unused_ DnsStream *ref = dns_stream_ref(s); /* Protect stream while we process it */
b2c191
+
b2c191
         assert(s);
b2c191
 
b2c191
 #if ENABLE_DNS_OVER_TLS
62b62a
@@ -316,7 +318,7 @@ static int on_stream_timeout(sd_event_source *es, usec_t usec, void *userdata) {
b2c191
 }
b2c191
 
b2c191
 static int on_stream_io(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
b2c191
-        DnsStream *s = userdata;
b2c191
+        _cleanup_(dns_stream_unrefp) DnsStream *s = dns_stream_ref(userdata); /* Protect stream while we process it */
b2c191
         int r;
b2c191
 
b2c191
         assert(s);