]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Fix wrong reference counting in DoH cross-protocol handling
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 7 Sep 2021 10:18:04 +0000 (12:18 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 13 Sep 2021 13:34:34 +0000 (15:34 +0200)
pdns/dnsdistdist/doh.cc

index e90077db4ef6aa27c6755fb40656e2f1955f1e3b..6301727a37a8dbfde1a748db5e7aca6a810cdfff 100644 (file)
@@ -492,6 +492,7 @@ public:
       return;
     }
 
+    du->ids = std::move(query);
     du->status_code = 502;
     sendDoHUnitToTheMainThread(du, "cross-protocol error response");
     du->release();
@@ -637,19 +638,20 @@ static int processDOHQuery(DOHUnit* du)
         proxyProtocolPayload = getProxyProtocolPayload(dq);
       }
 
-      auto cpq = std::make_unique<DoHCrossProtocolQuery>(du);
-      du->get();
-      cpq->query.d_proxyProtocolPayload = std::move(proxyProtocolPayload);
-      du->tcp = true;
       du->ids.origID = htons(queryId);
       du->ids.cs = &cs;
       setIDStateFromDNSQuestion(du->ids, dq, std::move(qname));
 
+      /* this moves du->ids, careful! */
+      du->get();
+      auto cpq = std::make_unique<DoHCrossProtocolQuery>(du);
+      cpq->query.d_proxyProtocolPayload = std::move(proxyProtocolPayload);
+      du->tcp = true;
       if (du->downstream->passCrossProtocolQuery(std::move(cpq))) {
         return 0;
       }
       else {
-        du->release();
+        /* do not release du here, it belongs to the DoHCrossProtocolQuery object */
         du->status_code = 502;
         return -1;
       }