From 216f671561554cbc5c2995122b4b4f4b7392fccd Mon Sep 17 00:00:00 2001 From: Jacek Migacz Date: Wed, 30 Oct 2024 12:06:08 +0100 Subject: [PATCH] asyn-thread: create a socketpair to wait on Resolves: RHEL-34906 --- 0062-curl-7.61.1-socketpair-to-wait-on.patch | 146 +++++++++++++++++++ curl.spec | 7 + 2 files changed, 153 insertions(+) create mode 100644 0062-curl-7.61.1-socketpair-to-wait-on.patch diff --git a/0062-curl-7.61.1-socketpair-to-wait-on.patch b/0062-curl-7.61.1-socketpair-to-wait-on.patch new file mode 100644 index 0000000..eda14f8 --- /dev/null +++ b/0062-curl-7.61.1-socketpair-to-wait-on.patch @@ -0,0 +1,146 @@ +From eb9a604f8d7db859555adc0ddacdabd1ed986106 Mon Sep 17 00:00:00 2001 +From: amkatyal +Date: Fri, 26 Jul 2019 21:28:41 +0530 +Subject: [PATCH] asyn-thread: create a socketpair to wait on + +Closes #4157 +--- + lib/asyn-thread.c | 76 ++++++++++++++++++++++++++++++++++++++++------- + lib/multi.c | 0 + 2 files changed, 65 insertions(+), 11 deletions(-) + mode change 100644 => 100755 lib/asyn-thread.c + mode change 100644 => 100755 lib/multi.c + +diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c +old mode 100644 +new mode 100755 +index 5f33c9affd0f27..f17638e44e6b18 +--- a/lib/asyn-thread.c ++++ b/lib/asyn-thread.c +@@ -163,6 +163,9 @@ struct thread_sync_data { + char *hostname; /* hostname to resolve, Curl_async.hostname + duplicate */ + int port; ++#ifdef HAVE_SOCKETPAIR ++ curl_socket_t sock_pair[2]; /* socket pair */ ++#endif + int sock_error; + Curl_addrinfo *res; + #ifdef HAVE_GETADDRINFO +@@ -197,6 +200,16 @@ void destroy_thread_sync_data(struct thread_sync_data * tsd) + if(tsd->res) + Curl_freeaddrinfo(tsd->res); + ++#ifdef HAVE_SOCKETPAIR ++ /* close socket pair */ ++ if(tsd->sock_pair[0] != CURL_SOCKET_BAD) { ++ sclose(tsd->sock_pair[0]); ++ } ++ ++ if(tsd->sock_pair[1] != CURL_SOCKET_BAD) { ++ sclose(tsd->sock_pair[1]); ++ } ++#endif + memset(tsd, 0, sizeof(*tsd)); + } + +@@ -230,6 +243,14 @@ int init_thread_sync_data(struct thread_data * td, + + Curl_mutex_init(tsd->mtx); + ++#ifdef HAVE_SOCKETPAIR ++ /* create socket pair */ ++ if(socketpair(AF_LOCAL, SOCK_STREAM, 0, &tsd->sock_pair[0]) < 0) { ++ tsd->sock_pair[0] = CURL_SOCKET_BAD; ++ tsd->sock_pair[1] = CURL_SOCKET_BAD; ++ goto err_exit; ++ } ++#endif + tsd->sock_error = CURL_ASYNC_SUCCESS; + + /* Copying hostname string because original can be destroyed by parent +@@ -297,6 +318,9 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg) + struct thread_data *td = tsd->td; + char service[12]; + int rc; ++#ifdef HAVE_SOCKETPAIR ++ char buf[1]; ++#endif + + snprintf(service, sizeof(service), "%d", tsd->port); + +@@ -298,6 +322,16 @@ static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg) + free(td); + } + else { ++#ifdef HAVE_SOCKETPAIR ++ if(tsd->sock_pair[1] != CURL_SOCKET_BAD) { ++ /* DNS has been resolved, signal client task */ ++ buf[0] = 1; ++ if(write(tsd->sock_pair[1], buf, sizeof(buf)) < 0) { ++ /* update sock_erro to errno */ ++ tsd->sock_error = SOCKERRNO; ++ } ++ } ++#endif + tsd->done = 1; + Curl_mutex_release(tsd->mtx); + } +@@ -595,23 +629,43 @@ int Curl_resolver_getsock(struct connectdata *conn, + curl_socket_t *socks, + int numsocks) + { ++ int ret_val = 0; + time_t milli; + timediff_t ms; + struct Curl_easy *data = conn->data; + struct resdata *reslv = (struct resdata *)data->state.resolver; ++#ifdef HAVE_SOCKETPAIR ++ struct thread_data *td = (struct thread_data*)conn->async.os_specific; ++ int loop_idx; ++#else + (void)socks; + (void)numsocks; +- ms = Curl_timediff(Curl_now(), reslv->start); +- if(ms < 3) +- milli = 0; +- else if(ms <= 50) +- milli = ms/3; +- else if(ms <= 250) +- milli = 50; +- else +- milli = 200; +- Curl_expire(data, milli, EXPIRE_ASYNC_NAME); +- return 0; ++#endif ++ ++#ifdef HAVE_SOCKETPAIR ++ if(td) { ++ /* return read fd to client for polling the DNS resolution status */ ++ socks[0] = td->tsd.sock_pair[0]; ++ ret_val = GETSOCK_READSOCK(0); ++ } ++ else { ++#endif ++ ms = Curl_timediff(Curl_now(), reslv->start); ++ if(ms < 3) ++ milli = 0; ++ else if(ms <= 50) ++ milli = ms/3; ++ else if(ms <= 250) ++ milli = 50; ++ else ++ milli = 200; ++ Curl_expire(data, milli, EXPIRE_ASYNC_NAME); ++#ifdef HAVE_SOCKETPAIR ++ } ++#endif ++ ++ ++ return ret_val; + } + + #ifndef HAVE_GETADDRINFO +diff --git a/lib/multi.c b/lib/multi.c +old mode 100644 +new mode 100755 diff --git a/curl.spec b/curl.spec index 6a05e4d..cb09b16 100644 --- a/curl.spec +++ b/curl.spec @@ -178,6 +178,9 @@ Patch60: 0060-curl-7.61.1-lowercase-headernames.patch # provide common cleanup method for push headers (CVE-2024-2398) Patch61: 0061-curl-7.61.1-CVE-2024-2398.patch +# asyn-thread: create a socketpair to wait on +Patch62: 0062-curl-7.61.1-socketpair-to-wait-on.patch + # patch making libcurl multilib ready Patch101: 0101-curl-7.32.0-multilib.patch @@ -412,6 +415,7 @@ git apply %{PATCH52} %patch59 -p1 %patch60 -p1 %patch61 -p1 +%patch62 -p1 # make tests/*.py use Python 3 sed -e '1 s|^#!/.*python|#!%{__python3}|' -i tests/*.py @@ -574,6 +578,9 @@ rm -f ${RPM_BUILD_ROOT}%{_libdir}/libcurl.la %{_libdir}/libcurl.so.4.[0-9].[0-9].minimal %changelog +* Wed Oct 30 2024 Jacek Migacz - 7.61.1-34.el8_10.3 +- asyn-thread: create a socketpair to wait on (RHEL-34906) + * Wed Aug 14 2024 Jacek Migacz - 7.61.1-34.el8_10.2 - provide common cleanup method for push headers (CVE-2024-2398)