From: Joshua Rogers Date: Tue, 9 Sep 2025 02:38:48 +0000 (+0000) Subject: urn: free urn object on initial error (#2195) X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=80b0bdd653c4621dcf6a09192dab61c072171ae6;p=thirdparty%2Fsquid.git urn: free urn object on initial error (#2195) 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. --- diff --git a/src/urn.cc b/src/urn.cc index b9152c6be0..985528cc2a 100644 --- a/src/urn.cc +++ b/src/urn.cc @@ -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);