]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
urn: free urn object on initial error (#2195)
authorJoshua Rogers <MegaManSec@users.noreply.github.com>
Tue, 9 Sep 2025 02:38:48 +0000 (02:38 +0000)
committerFrancesco Chemolli <5175948+kinkie@users.noreply.github.com>
Tue, 9 Sep 2025 09:20:58 +0000 (10:20 +0100)
Previously, the object wasn't freed if an error occurred
when setting the uri.

Also sets the location header to the first url, regardless
of qsort shifting the buffer.

src/urn.cc

index b9152c6be0d98c5dcf612a7584f460be44763d82..985528cc2a65a1be68b6108564ed953ed424f208 100644 (file)
@@ -168,8 +168,10 @@ UrnState::start(HttpRequest * r, StoreEntry * e)
     entry->lock("UrnState::start");
     setUriResFromRequest(r);
 
-    if (urlres_r == nullptr)
+    if (urlres_r == nullptr) {
+        delete this;
         return;
+    }
 
     auto urlEntry = storeGetPublic(urlres, Http::METHOD_GET);
 
@@ -301,6 +303,11 @@ urnHandleReply(void *data, StoreIOBuffer result)
     debugs(53, 3, "urnFindMinRtt: Counted " << i << " URLs");
 
     min_u = urnFindMinRtt(urls, urnState->request->method, nullptr);
+    char *min_url = nullptr;
+    if (min_u) {
+        min_url = xstrdup(min_u->url);
+    }
+
     qsort(urls, urlcnt, sizeof(*urls), url_entry_sort);
     e->buffer();
     SBuf body;
@@ -335,8 +342,9 @@ urnHandleReply(void *data, StoreIOBuffer result)
     const auto rep = new HttpReply;
     rep->setHeaders(Http::scFound, nullptr, "text/html", mb->length(), 0, squid_curtime);
 
-    if (min_u) {
-        rep->header.putStr(Http::HdrType::LOCATION, min_u->url);
+    if (min_url) {
+        rep->header.putStr(Http::HdrType::LOCATION, min_url);
+        safe_free(min_url);
     }
 
     rep->body.set(body);