]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
build: avoid overriding system symbols for socket functions
authorViktor Szakats <commit@vsz.me>
Tue, 9 Sep 2025 13:29:12 +0000 (15:29 +0200)
committerViktor Szakats <commit@vsz.me>
Sat, 20 Sep 2025 11:44:59 +0000 (13:44 +0200)
Before this patch `accept4()`, `socket()`, `socketpair()`, `send()` and
`recv()` system symbols were remapped via macros, using the same name,
to local curl debug wrappers. This patch replaces these overrides by
introducing curl-namespaced macros that map either to the system symbols
or to their curl debug wrappers in `CURLDEBUG` (TrackMemory) builds.

This follows a patch that implemented the same for `accept()`.

The old method required tricks to make these redefines work in unity
builds, and avoid them interfering with system headers. These tricks
did not work for system symbols implemented as macros.

The new method allows to setup these mappings once, without interfering
with system headers, upstream macros, or unity builds. It makes builds
more robust.

Also:
- checksrc: ban all mapped functions.
- docs/examples: tidy up checksrc rules.

Follow-up to 9863599d69b79d290928a89bf9160f4e4e023d4e #18502
Follow-up to 3bb5e58c105d7be450b667858d1b8e7ae3ded555 #17827

Closes #18503

24 files changed:
REUSE.toml
docs/examples/.checksrc [new file with mode: 0644]
docs/examples/Makefile.am
docs/examples/http2-upload.c
docs/examples/synctime.c
lib/cf-socket.c
lib/curl_addrinfo.c
lib/curl_mem_undef.h
lib/curl_setup.h
lib/hostip.c
lib/if2ip.c
lib/memdebug.c
lib/memdebug.h
lib/multi.c
lib/socketpair.c
lib/vquic/vquic.c
packages/OS400/os400sys.c
scripts/checksrc.pl
src/tool_cb_rea.c
src/tool_cb_soc.c
src/tool_doswin.c
tests/libtest/lib1960.c
tests/libtest/lib500.c
tests/server/.checksrc

index 81c214863fcd74cc71d33ca0a0d7cb408b9b4639..6e8a272e795ccc35530883923e8a662cf70cb9db 100644 (file)
@@ -40,6 +40,7 @@ path = [
   "tests/data/test**",
   "tests/valgrind.supp",
   # checksrc control files
+  "docs/examples/.checksrc",
   "lib/.checksrc",
   "lib/curlx/.checksrc",
   "lib/vauth/.checksrc",
diff --git a/docs/examples/.checksrc b/docs/examples/.checksrc
new file mode 100644 (file)
index 0000000..0b626e6
--- /dev/null
@@ -0,0 +1,3 @@
+allowfunc gmtime
+allowfunc localtime
+allowfunc socket
index 27d4ce741bd4a83010df758a54f1dd4ac4cd7b0d..89ebcc9840f6ebdbd9931d07aecf0b3ae81a1fdd 100644 (file)
@@ -24,7 +24,7 @@
 
 AUTOMAKE_OPTIONS = foreign nostdinc
 
-EXTRA_DIST = CMakeLists.txt README.md Makefile.example $(COMPLICATED_EXAMPLES)
+EXTRA_DIST = CMakeLists.txt .checksrc README.md Makefile.example $(COMPLICATED_EXAMPLES)
 
 # Specify our include paths here, and do it relative to $(top_srcdir) and
 # $(top_builddir), to ensure that these paths which belong to the library
index 128a4b0beda1b267f76dede3b42b107e2dcfc445..d13c5e58063cd7181f06f6bec896fbc949633456 100644 (file)
@@ -161,7 +161,6 @@ int my_trace(CURL *handle, curl_infotype type,
     known_offset = 1;
   }
   secs = epoch_offset + tv.tv_sec;
-  /* !checksrc! disable BANNEDFUNC 1 */
   now = localtime(&secs);  /* not thread safe but we do not care */
   curl_msnprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld",
                  now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
index ba5f09cb075a751f0fd050cc7906ce2bc686aebb..8d7af7c8c4c33d4285d232eb7c92482072663345 100644 (file)
@@ -298,10 +298,8 @@ int main(int argc, char *argv[])
 
     /* Calculating time diff between GMT and localtime */
     tt       = time(0);
-    /* !checksrc! disable BANNEDFUNC 1 */
     lt       = localtime(&tt);
     tt_local = mktime(lt);
-    /* !checksrc! disable BANNEDFUNC 1 */
     gmt      = gmtime(&tt);
     tt_gmt   = mktime(gmt);
     tzonediffFloat = difftime(tt_local, tt_gmt);
index d7463345ad875a93d97e4e88940e3199d1a71289..365ddb62a144ff4b3d629bbffab434f725d6fb44 100644 (file)
@@ -369,7 +369,7 @@ static CURLcode socket_open(struct Curl_easy *data,
   }
   else {
     /* opensocket callback not set, so simply create the socket now */
-    *sockfd = socket(addr->family, addr->socktype, addr->protocol);
+    *sockfd = CURL_SOCKET(addr->family, addr->socktype, addr->protocol);
   }
 
   if(*sockfd == CURL_SOCKET_BAD)
@@ -2113,8 +2113,8 @@ static CURLcode cf_tcp_accept_connect(struct Curl_cfilter *cf,
   if(!getsockname(ctx->sock, (struct sockaddr *) &add, &size)) {
     size = sizeof(add);
 #ifdef HAVE_ACCEPT4
-    s_accepted = accept4(ctx->sock, (struct sockaddr *) &add, &size,
-                         SOCK_NONBLOCK | SOCK_CLOEXEC);
+    s_accepted = CURL_ACCEPT4(ctx->sock, (struct sockaddr *) &add, &size,
+                              SOCK_NONBLOCK | SOCK_CLOEXEC);
 #else
     s_accepted = CURL_ACCEPT(ctx->sock, (struct sockaddr *) &add, &size);
 #endif
index 22212ac86f8e691324b6171d41138b7c1e67a777..c4ad71a02e1a2702d9bd23516be953d53acf27c9 100644 (file)
@@ -507,9 +507,11 @@ curl_dbg_freeaddrinfo(struct addrinfo *freethis,
     if(env)
       r_freeaddrinfo(freethis);
     else
+      /* !checksrc! disable BANNEDFUNC 1 */
       freeaddrinfo(freethis);
   }
 #else
+  /* !checksrc! disable BANNEDFUNC 1 */
   freeaddrinfo(freethis);
 #endif
 }
@@ -540,8 +542,10 @@ curl_dbg_getaddrinfo(const char *hostname,
   if(env)
     res = r_getaddrinfo(hostname, service, hints, result);
   else
+    /* !checksrc! disable BANNEDFUNC 1 */
     res = getaddrinfo(hostname, service, hints, result);
 #else
+  /* !checksrc! disable BANNEDFUNC 1 */
   int res = getaddrinfo(hostname, service, hints, result);
 #endif
   if(res == 0)
index f3cca294e9a53a2247bfbb333142efc73e4c17b1..a70a9fcf5379c76bf50593215dd609a4c2ca0391 100644 (file)
 
 #ifdef CURLDEBUG
 
-#undef send
-#undef recv
-
-#undef socket
-#ifdef HAVE_ACCEPT4
-#undef accept4
-#endif
-#ifdef HAVE_SOCKETPAIR
-#undef socketpair
-#endif
-
 #undef fopen
 #ifdef CURL_FOPEN
 #define fopen(fname, mode) CURL_FOPEN(fname, mode)
index 93cbb570568df1c8861bf85a3ec29a0f5d268643..e49c57231d2fbe793a5acccf16814893208c9a3b 100644 (file)
@@ -1083,9 +1083,21 @@ CURL_EXTERN ALLOC_FUNC
   curl_dbg_getaddrinfo(host, serv, hint, res, __LINE__, __FILE__)
 #define CURL_FREEADDRINFO(data) \
   curl_dbg_freeaddrinfo(data, __LINE__, __FILE__)
-
+#define CURL_SOCKET(domain,type,protocol) \
+  curl_dbg_socket((int)domain, type, protocol, __LINE__, __FILE__)
+#ifdef HAVE_SOCKETPAIR
+#define CURL_SOCKETPAIR(domain,type,protocol,socket_vector) \
+  curl_dbg_socketpair((int)domain, type, protocol, socket_vector, \
+                      __LINE__, __FILE__)
+#endif
 #define CURL_ACCEPT(sock,addr,len) \
   curl_dbg_accept(sock, addr, len, __LINE__, __FILE__)
+#ifdef HAVE_ACCEPT4
+#define CURL_ACCEPT4(sock,addr,len,flags) \
+  curl_dbg_accept4(sock, addr, len, flags, __LINE__, __FILE__)
+#endif
+#define CURL_SEND(a,b,c,d) curl_dbg_send(a,b,c,d, __LINE__, __FILE__)
+#define CURL_RECV(a,b,c,d) curl_dbg_recv(a,b,c,d, __LINE__, __FILE__)
 
 #else /* !CURLDEBUG */
 
@@ -1094,8 +1106,16 @@ CURL_EXTERN ALLOC_FUNC
 
 #define CURL_GETADDRINFO getaddrinfo
 #define CURL_FREEADDRINFO freeaddrinfo
-
+#define CURL_SOCKET socket
+#ifdef HAVE_SOCKETPAIR
+#define CURL_SOCKETPAIR socketpair
+#endif
 #define CURL_ACCEPT accept
+#ifdef HAVE_ACCEPT4
+#define CURL_ACCEPT4 accept4
+#endif
+#define CURL_SEND send
+#define CURL_RECV recv
 
 #endif /* CURLDEBUG */
 
index b6be2ca1f27563f758df808faf37b3c7cf22eb60..fd8f706e7f253a79f73db3bf791a0472f25f5a97 100644 (file)
@@ -709,7 +709,7 @@ bool Curl_ipv6works(struct Curl_easy *data)
   else {
     int ipv6_works = -1;
     /* probe to see if we have a working IPv6 stack */
-    curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
+    curl_socket_t s = CURL_SOCKET(PF_INET6, SOCK_DGRAM, 0);
     if(s == CURL_SOCKET_BAD)
       /* an IPv6 address was requested but we cannot get/use one */
       ipv6_works = 0;
index 91ee59c02a72c4624d3352f97713063df7d0c330..e501921d067be080c629e551a5a853500c1cad9a 100644 (file)
@@ -208,7 +208,7 @@ if2ip_result_t Curl_if2ip(int af,
   if(len >= sizeof(req.ifr_name))
     return IF2IP_NOT_FOUND;
 
-  dummy = socket(AF_INET, SOCK_STREAM, 0);
+  dummy = CURL_SOCKET(AF_INET, SOCK_STREAM, 0);
   if(CURL_SOCKET_BAD == dummy)
     return IF2IP_NOT_FOUND;
 
index 0d8d39603c4d8f3805e0587c62d87d1b2dab6019..cffd4b2cf61b8d775f64d34f7f5edfd44d203d1e 100644 (file)
@@ -311,7 +311,8 @@ curl_socket_t curl_dbg_socket(int domain, int type, int protocol,
   if(countcheck("socket", line, source))
     return CURL_SOCKET_BAD;
 
-  sockfd = (socket)(domain, type, protocol);
+  /* !checksrc! disable BANNEDFUNC 1 */
+  sockfd = socket(domain, type, protocol);
 
   if(source && (sockfd != CURL_SOCKET_BAD))
     curl_dbg_log("FD %s:%d socket() = %" FMT_SOCKET_T "\n",
@@ -328,7 +329,8 @@ SEND_TYPE_RETV curl_dbg_send(SEND_TYPE_ARG1 sockfd,
   SEND_TYPE_RETV rc;
   if(countcheck("send", line, source))
     return -1;
-  rc = (send)(sockfd, buf, len, flags);
+  /* !checksrc! disable BANNEDFUNC 1 */
+  rc = send(sockfd, buf, len, flags);
   if(source)
     curl_dbg_log("SEND %s:%d send(%lu) = %ld\n",
                 source, line, (unsigned long)len, (long)rc);
@@ -342,7 +344,8 @@ RECV_TYPE_RETV curl_dbg_recv(RECV_TYPE_ARG1 sockfd, RECV_TYPE_ARG2 buf,
   RECV_TYPE_RETV rc;
   if(countcheck("recv", line, source))
     return -1;
-  rc = (recv)(sockfd, buf, len, flags);
+  /* !checksrc! disable BANNEDFUNC 1 */
+  rc = recv(sockfd, buf, len, flags);
   if(source)
     curl_dbg_log("RECV %s:%d recv(%lu) = %ld\n",
                 source, line, (unsigned long)len, (long)rc);
@@ -354,7 +357,8 @@ int curl_dbg_socketpair(int domain, int type, int protocol,
                         curl_socket_t socket_vector[2],
                         int line, const char *source)
 {
-  int res = (socketpair)(domain, type, protocol, socket_vector);
+  /* !checksrc! disable BANNEDFUNC 1 */
+  int res = socketpair(domain, type, protocol, socket_vector);
 
   if(source && (res == 0))
     curl_dbg_log("FD %s:%d socketpair() = "
@@ -371,6 +375,7 @@ curl_socket_t curl_dbg_accept(curl_socket_t s, void *saddr, void *saddrlen,
   struct sockaddr *addr = (struct sockaddr *)saddr;
   curl_socklen_t *addrlen = (curl_socklen_t *)saddrlen;
 
+  /* !checksrc! disable BANNEDFUNC 1 */
   curl_socket_t sockfd = accept(s, addr, addrlen);
 
   if(source && (sockfd != CURL_SOCKET_BAD))
@@ -388,7 +393,8 @@ curl_socket_t curl_dbg_accept4(curl_socket_t s, void *saddr, void *saddrlen,
   struct sockaddr *addr = (struct sockaddr *)saddr;
   curl_socklen_t *addrlen = (curl_socklen_t *)saddrlen;
 
-  curl_socket_t sockfd = (accept4)(s, addr, addrlen, flags);
+  /* !checksrc! disable BANNEDFUNC 1 */
+  curl_socket_t sockfd = accept4(s, addr, addrlen, flags);
 
   if(source && (sockfd != CURL_SOCKET_BAD))
     curl_dbg_log("FD %s:%d accept() = %" FMT_SOCKET_T "\n",
index eabdd9c258cfa1d82bd12aa15444ae04379436c8..96ceb61759e5cd5e214d2693592b3427ec3c6f12 100644 (file)
 #define realloc(ptr,size) curl_dbg_realloc(ptr, size, __LINE__, __FILE__)
 #undef free
 #define free(ptr) curl_dbg_free(ptr, __LINE__, __FILE__)
-#undef send
-#define send(a,b,c,d) curl_dbg_send(a,b,c,d, __LINE__, __FILE__)
-#undef recv
-#define recv(a,b,c,d) curl_dbg_recv(a,b,c,d, __LINE__, __FILE__)
 
 #ifdef _WIN32
 #undef Curl_tcsdup
 #endif
 #endif /* _WIN32 */
 
-#undef socket
-#define socket(domain,type,protocol) \
-  curl_dbg_socket((int)domain, type, protocol, __LINE__, __FILE__)
-#ifdef HAVE_ACCEPT4
-#undef accept4 /* for those with accept4 as a macro */
-#define accept4(sock,addr,len,flags) \
-  curl_dbg_accept4(sock, addr, len, flags, __LINE__, __FILE__)
-#endif
-#ifdef HAVE_SOCKETPAIR
-#define socketpair(domain,type,protocol,socket_vector) \
-  curl_dbg_socketpair((int)domain, type, protocol, socket_vector, \
-                      __LINE__, __FILE__)
-#endif
-
 #undef fopen
 #define fopen(file,mode) curl_dbg_fopen(file,mode,__LINE__,__FILE__)
 #undef fdopen
index 918928d03cc59ff6a9aa00fc3311816b536e9ca4..442956f844169d82af0f6b88f4ec53c65f4cfe7b 100644 (file)
@@ -1277,7 +1277,7 @@ static void reset_socket_fdwrite(curl_socket_t s)
   int t;
   int l = (int)sizeof(t);
   if(!getsockopt(s, SOL_SOCKET, SO_TYPE, (char *)&t, &l) && t == SOCK_STREAM)
-    send(s, NULL, 0, 0);
+    CURL_SEND(s, NULL, 0, 0);
 }
 #endif
 
index 4151a9bb979a8f0faefadd1b7d31a86f8022d98d..d2fd41141b242343bfdea910277780828eeb9bd6 100644 (file)
@@ -91,7 +91,7 @@ int Curl_socketpair(int domain, int type, int protocol,
 #ifdef SOCK_NONBLOCK
   type = nonblocking ? type | SOCK_NONBLOCK : type;
 #endif
-  if(socketpair(domain, type, protocol, socks))
+  if(CURL_SOCKETPAIR(domain, type, protocol, socks))
     return -1;
 #ifndef SOCK_NONBLOCK
   if(nonblocking) {
@@ -154,7 +154,7 @@ int Curl_socketpair(int domain, int type, int protocol,
   (void)type;
   (void)protocol;
 
-  listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+  listener = CURL_SOCKET(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   if(listener == CURL_SOCKET_BAD)
     return -1;
 
@@ -188,7 +188,7 @@ int Curl_socketpair(int domain, int type, int protocol,
     goto error;
   if(listen(listener, 1) == -1)
     goto error;
-  socks[0] = socket(AF_INET, SOCK_STREAM, 0);
+  socks[0] = CURL_SOCKET(AF_INET, SOCK_STREAM, 0);
   if(socks[0] == CURL_SOCKET_BAD)
     goto error;
   if(connect(socks[0], &a.addr, sizeof(a.inaddr)) == -1)
index 3a0ac872383f8df42d746c55245083a5d77bdc46..47fbf63af05a055f3607d1c24d23655f95447e4b 100644 (file)
@@ -196,8 +196,8 @@ static CURLcode do_sendmsg(struct Curl_cfilter *cf,
 
   *psent = 0;
 
-  while((sent = send(qctx->sockfd,
-                     (const char *)pkt, (SEND_TYPE_ARG3)pktlen, 0)) == -1 &&
+  while((sent = CURL_SEND(qctx->sockfd, (const char *)pkt,
+                          (SEND_TYPE_ARG3)pktlen, 0)) == -1 &&
         SOCKERRNO == SOCKEINTR)
     ;
 
index 7be72085498b48b16c924757b54547868c96eff3..bc227a0e69fcf942863cfb6ee0eb2d0f967a7bc7 100644 (file)
@@ -333,6 +333,7 @@ Curl_getaddrinfo_a(const char *nodename, const char *servname,
     eservname[i] = '\0';
   }
 
+  /* !checksrc! disable BANNEDFUNC 1 */
   status = getaddrinfo(enodename, eservname, hints, res);
   free(enodename);
   free(eservname);
index 28ad6315ba4c35260c7c82ad4d1ccfa7b2839cd7..0eeab72323f96448ddaa3a4c67304f204a1c63c9 100755 (executable)
@@ -77,6 +77,14 @@ my %banfunc = (
     "_waccess" => 1,
     "_access" => 1,
     "access" => 1,
+    "accept" => 1,
+    "accept4" => 1,
+    "freeaddrinfo" => 1,
+    "getaddrinfo" => 1,
+    "recv" => 1,
+    "send" => 1,
+    "socket" => 1,
+    "socketpair" => 1,
     );
 
 my %warnings_extended = (
index 0a3e9ef0ee2ce05d78b32d699ad723af437121c8..b7bd9a72273215b84de3a1db37468382414dc3af 100644 (file)
@@ -92,7 +92,7 @@ size_t tool_read_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
    execute */
   if(per->uploadfile && !strcmp(per->uploadfile, ".") && per->infd > 0) {
 #if defined(_WIN32) && !defined(CURL_WINDOWS_UWP) && !defined(UNDER_CE)
-    rc = recv(per->infd, buffer, curlx_uztosi(sz * nmemb), 0);
+    rc = CURL_RECV(per->infd, buffer, curlx_uztosi(sz * nmemb), 0);
     if(rc < 0) {
       if(SOCKERRNO == SOCKEWOULDBLOCK) {
         CURL_SETERRNO(0);
index 22048ee6bbf95b496a6a5dc7723ae7265e20d544..d89870297cdbdc9ca8c5da2d20d778dbd18506aa 100644 (file)
@@ -54,5 +54,5 @@ curl_socket_t tool_socket_open_mptcp_cb(void *clientp,
     return CURL_SOCKET_BAD;
 #endif
 
-  return socket(addr->family, addr->socktype, protocol);
+  return CURL_SOCKET(addr->family, addr->socktype, protocol);
 }
index bfe013d8e56e0afa040053e2237b4316a2a09f5b..0450e5707ba2dad0d64ab7d6074dc46757604a53 100644 (file)
@@ -785,7 +785,7 @@ static DWORD WINAPI win_stdin_thread_func(void *thread_data)
       break;
     if(n == 0)
       break;
-    nwritten = send(socket_w, buffer, n, 0);
+    nwritten = CURL_SEND(socket_w, buffer, n, 0);
     if(nwritten == SOCKET_ERROR)
       break;
     if((DWORD)nwritten != n)
@@ -889,7 +889,7 @@ curl_socket_t win32_stdin_read_thread(void)
     }
 
     /* Connect to the thread and rearrange our own STDIN handles */
-    socket_r = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    socket_r = CURL_SOCKET(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     if(socket_r == CURL_SOCKET_BAD) {
       errorf("socket error: %08lx", GetLastError());
       break;
index 5cdc0224260c5dfbe3f8f368834d66342b9caa8e..1ee9277bef62711dac3cf3a160a7360c1bb5cc34 100644 (file)
@@ -96,7 +96,7 @@ static CURLcode test_lib1960(const char *URL)
    * over this socket as "already connected" to libcurl and make sure that
    * this works.
    */
-  client_fd = socket(AF_INET, SOCK_STREAM, 0);
+  client_fd = CURL_SOCKET(AF_INET, SOCK_STREAM, 0);
   if(client_fd == CURL_SOCKET_BAD) {
     curl_mfprintf(stderr, "socket creation error\n");
     goto test_cleanup;
index 0586c1407f9c0190e364d28da66c17ae65bdb133..7081ec625d28ca87bced0380f1c028aad03ee772 100644 (file)
@@ -35,7 +35,7 @@ static curl_socket_t tst_opensocket(void *clientp,
   (void)clientp;
   (void)purpose;
   curl_mprintf("[OPEN] counter: %d\n", ++testcounter);
-  return socket(addr->family, addr->socktype, addr->protocol);
+  return CURL_SOCKET(addr->family, addr->socktype, addr->protocol);
 }
 
 static int tst_closesocket(void *clientp, curl_socket_t sock)
index 8b1bcabe7789b5ec1659c3ba156e877278c865a8..be8f12cec014d5fcef2cbe8f234a7ab0fa0ebcc0 100644 (file)
@@ -1 +1,7 @@
+allowfunc accept
+allowfunc freeaddrinfo
+allowfunc getaddrinfo
+allowfunc recv
+allowfunc send
+allowfunc socket
 allowfunc strtoul