From f4831daa9b2a97e8a2921d6b62cc4dfdd0d8646e Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 7 Mar 2025 09:32:57 +0100 Subject: [PATCH] url: call protocol handler's disconnect in Curl_conn_free For the case when the connection struct is all setup, the protocol handler allocates data in its setup_connection function, but the connection struct is discarded again before used further because a connection reuse is prefered. Then the handler's disconnect function was not previously called, which then would lead to a memory leak. I added test case 698 that reproduces the leak and the fix. Reported-by: Philippe Antoine Closes #16604 --- lib/url.c | 4 +++ tests/data/Makefile.am | 2 +- tests/data/test698 | 58 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 tests/data/test698 diff --git a/lib/url.c b/lib/url.c index 3b1ce3568e..e6bd969c45 100644 --- a/lib/url.c +++ b/lib/url.c @@ -557,6 +557,10 @@ void Curl_conn_free(struct Curl_easy *data, struct connectdata *conn) DEBUGASSERT(conn); + if(conn->handler && conn->handler->disconnect && + !conn->bits.shutdown_handler) + conn->handler->disconnect(data, conn, TRUE); + for(i = 0; i < CURL_ARRAYSIZE(conn->cfilter); ++i) { Curl_conn_cf_discard_all(data, conn, (int)i); } diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 04ac6b5a59..4d3f20ac86 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -101,7 +101,7 @@ test654 test655 test656 test658 test659 test660 test661 test662 test663 \ test664 test665 test666 test667 test668 test669 test670 test671 test672 \ test673 test674 test675 test676 test677 test678 test679 test680 test681 \ test682 test683 test684 test685 test686 test687 test688 test689 test690 \ -test691 test692 test693 test694 test695 test696 test697 \ +test691 test692 test693 test694 test695 test696 test697 test698 \ \ test700 test701 test702 test703 test704 test705 test706 test707 test708 \ test709 test710 test711 test712 test713 test714 test715 test716 test717 \ diff --git a/tests/data/test698 b/tests/data/test698 new file mode 100644 index 0000000000..5fdf10541d --- /dev/null +++ b/tests/data/test698 @@ -0,0 +1,58 @@ + + + +FTP +ACCT + + +# Server-side + + +data + to + see +that FTP +works + so does it? + + +REPLY PASS 332 please provide account name +REPLY ACCT 230 thank you + + + +# Client-side + + +ftp + + +FTP with ACCT and connection reuse + + +ftp://%HOSTIP:%FTPPORT/%TESTNUMBER --ftp-account "one count" ftp://%HOSTIP:%FTPPORT/%TESTNUMBER + + + + +# Verify data after the test has been "shot" + + +QUIT + + +USER anonymous +PASS ftp@example.com +ACCT one count +PWD +EPSV +TYPE I +SIZE %TESTNUMBER +RETR %TESTNUMBER +EPSV +SIZE %TESTNUMBER +RETR %TESTNUMBER +QUIT + + + -- 2.47.3