Hi Alex,

Thanks for your reply. I will try your patch.

FWIW, we eventually arrived at a very different fix. See attached.

Best.

On Wed, May 10, 2023 at 2:09 PM Alex Rousskov <
rouss...@measurement-factory.com> wrote:

> On 3/23/23 19:56, Hamilton Coutinho wrote:
>
> > We found a way to reproduce the leak: set up squid to run in intercept
> > mode + SSL description + memory pools off (to ease identifying the leak)
> > and then generate requests to sites with invalid certs (eg, CA not
> > installed), for instance: curl -k https://slscr.update.microsoft.com
>
> Thanks a lot for sharing those details! Using them, I was able to
> reproduce one memory leak. Please try the following fix:
> https://github.com/squid-cache/squid/pull/1346
>
> I do not know whether that PR changes port to v5 cleanly or whether the
> same bug exists in v5. I can only speculate that v5 has a similar leak.
>
>
> > squidclient mgr:mem should show ever increasing HttpRequest instances.
>
> > As far as I can tell, the HttpRequest object created
> > in ConnStateData::buildFakeRequest() is never freed because its refcount
> >  > 0.
>
> > Any ideas where an HTTPMSGUNLOCK() might be missing?
>
> Sorry, I do not know. In my master/v7-based tests, HttpRequest objects
> are not leaking. However, I am not testing an intercepting Squid. I
> still have one red flag to investigate, so perhaps I will be able to
> reproduce and fix that HttpRequest leak as well.
>
>
> HTH,
>
> Alex.
>
>
> > On Wed, Jan 18, 2023 at 11:28 AM Hamilton Coutinho wrote:
> >
> >     Hi Alex,
> >
> >     Thanks for the prompt reply! Thanks also for the clarifications.
> >
> >     Agreed, I just realized the requests seem to be failing
> >     with Http::scServiceUnavailable, so my focus turned
> >     to Security::PeerConnector::sslCrtvdHandleReply() and friends.
> >
> >     Best.
> >
> >     On Wed, Jan 18, 2023 at 11:11 AM Alex Rousskov
> >     <rouss...@measurement-factory.com
> >     <mailto:rouss...@measurement-factory.com>> wrote:
> >
> >         On 1/18/23 13:46, Hamilton Coutinho wrote:
> >          > Hi all,
> >          >
> >          > We are observing what seems to be several objects leaking in
> >         the output
> >          > mgr:mem, to the tune of 10s of 1000s
> >          >
> >
>  of HttpRequest, HttpHeaderEntry, Comm::Connection, Security::ErrorDetail, 
> cbdata
> PeekingPeerConnector (31), etc.
> >          >
> >          > We dumped a core and managed to find some HttpRequest objects
> >         and they
> >          > all seem to have failed in the same way, with an
> >         ERR_SECURE_CONNECT_FAIL
> >          > category, for a site that has a certificate signed by a CA
> >         authority not
> >          > available to squid.
> >          >
> >          > If I would guess, the origin of the problem might be in
> >          > Ssl::PeekingPeerConnector::checkForPeekAndSpliceMatched():
> >          >
> >          >      if (finalAction == Ssl::bumpTerminate) {
> >          >          bail(new ErrorState(ERR_SECURE_CONNECT_FAIL,
> >         Http::scForbidden,
> >          > request.getRaw(), al));
> >          >          clientConn->close();
> >          >          clientConn = nullptr;
> >          >
> >          > Wondering if assigning null to clientConn there would be
> >         premature.
> >
> >
> >         FWIW, that connection pointer reset itself looks OK to me.
> >         ConnStateData
> >         and/or others should have a connection closure handler attached
> >         to the
> >         clientConn descriptor. That handler should be notified by Comm
> and
> >         initiate cleanup of the objects responsible for client-Squid
> >         communication.
> >
> >         The bail() call above should inform the requestor about the
> >         error/termination and terminate this AsyncJob. That requestor
> >         should
> >         then close the Squid-server connection and clean up associated
> >         state.
> >
> >         While there may be bugs in those "should..." sequences, please
> >         note that
> >         the pasted code is not related to handling of untrusted origin
> >         servers
> >         (unless your ssl_bump rules specifically activate the terminate
> >         action
> >         upon discovering such an origin server). The pasted code is
> >         reacting to
> >         an "ssl_bump terminate" rule matching.
> >
> >
> >         Cheers,
> >
> >         Alex.
> >
> >         _______________________________________________
> >         squid-dev mailing list
> >         squid-dev@lists.squid-cache.org
> >         <mailto:squid-dev@lists.squid-cache.org>
> >         http://lists.squid-cache.org/listinfo/squid-dev
> >         <http://lists.squid-cache.org/listinfo/squid-dev>
> >
> >
> >
> >     --
> >     Hamilton
> >
> >
> >
> > --
> > Hamilton
> >
> > _______________________________________________
> > squid-dev mailing list
> > squid-dev@lists.squid-cache.org
> > http://lists.squid-cache.org/listinfo/squid-dev
>
> _______________________________________________
> squid-dev mailing list
> squid-dev@lists.squid-cache.org
> http://lists.squid-cache.org/listinfo/squid-dev
>


-- 
Hamilton
diff --git a/src/security/PeerConnector.cc b/src/security/PeerConnector.cc
index 494edabb8..75a59a5f1 100755
--- a/src/security/PeerConnector.cc
+++ b/src/security/PeerConnector.cc
@@ -534,6 +534,13 @@ Security::PeerConnector::disconnect()
     serverConn = nullptr;
 }
 
+void
+Security::PeerConnector::negotiationFinished()
+{
+    debugs(83, 7, this);
+    Must(done());
+}
+
 void
 Security::PeerConnector::callBack()
 {
@@ -544,6 +551,9 @@ Security::PeerConnector::callBack()
     // to call back holds.
     callback = NULL; // this should make done() true
     ScheduleCallHere(cb);
+
+    // Forces another scheduling so we get eventually deleted.
+    CallJobHere(83, 7, CbcPointer<PeerConnector>(this), PeerConnector, negotiationFinished);
 }
 
 void
diff --git a/src/security/PeerConnector.h b/src/security/PeerConnector.h
index 10700d796..03f4be2ab 100755
--- a/src/security/PeerConnector.h
+++ b/src/security/PeerConnector.h
@@ -66,6 +66,8 @@ public:
                   const time_t timeout = 0);
     virtual ~PeerConnector();
 
+    void negotiationFinished();
+
     /// hack: whether the connection requires fwdPconnPool->noteUses()
     bool noteFwdPconnUse;
 
_______________________________________________
squid-dev mailing list
squid-dev@lists.squid-cache.org
http://lists.squid-cache.org/listinfo/squid-dev

Reply via email to