asyn-thread: create a socketpair to wait on
Resolves: RHEL-34906
This commit is contained in:
parent
f88ede2fb2
commit
216f671561
146
0062-curl-7.61.1-socketpair-to-wait-on.patch
Normal file
146
0062-curl-7.61.1-socketpair-to-wait-on.patch
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
From eb9a604f8d7db859555adc0ddacdabd1ed986106 Mon Sep 17 00:00:00 2001
|
||||||
|
From: amkatyal <amkatyal@cisco.com>
|
||||||
|
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
|
@ -178,6 +178,9 @@ Patch60: 0060-curl-7.61.1-lowercase-headernames.patch
|
|||||||
# provide common cleanup method for push headers (CVE-2024-2398)
|
# provide common cleanup method for push headers (CVE-2024-2398)
|
||||||
Patch61: 0061-curl-7.61.1-CVE-2024-2398.patch
|
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
|
# patch making libcurl multilib ready
|
||||||
Patch101: 0101-curl-7.32.0-multilib.patch
|
Patch101: 0101-curl-7.32.0-multilib.patch
|
||||||
|
|
||||||
@ -412,6 +415,7 @@ git apply %{PATCH52}
|
|||||||
%patch59 -p1
|
%patch59 -p1
|
||||||
%patch60 -p1
|
%patch60 -p1
|
||||||
%patch61 -p1
|
%patch61 -p1
|
||||||
|
%patch62 -p1
|
||||||
|
|
||||||
# make tests/*.py use Python 3
|
# make tests/*.py use Python 3
|
||||||
sed -e '1 s|^#!/.*python|#!%{__python3}|' -i tests/*.py
|
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
|
%{_libdir}/libcurl.so.4.[0-9].[0-9].minimal
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Oct 30 2024 Jacek Migacz <jmigacz@redhat.com> - 7.61.1-34.el8_10.3
|
||||||
|
- asyn-thread: create a socketpair to wait on (RHEL-34906)
|
||||||
|
|
||||||
* Wed Aug 14 2024 Jacek Migacz <jmigacz@redhat.com> - 7.61.1-34.el8_10.2
|
* Wed Aug 14 2024 Jacek Migacz <jmigacz@redhat.com> - 7.61.1-34.el8_10.2
|
||||||
- provide common cleanup method for push headers (CVE-2024-2398)
|
- provide common cleanup method for push headers (CVE-2024-2398)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user