]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tests/server/util.c: remove use of strncpy
authorDaniel Stenberg <daniel@haxx.se>
Wed, 9 Oct 2024 13:56:28 +0000 (15:56 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 10 Oct 2024 05:47:01 +0000 (07:47 +0200)
... and ban the function in code in this directory.

Closes #15213

REUSE.toml
tests/server/.checksrc [new file with mode: 0644]
tests/server/Makefile.am
tests/server/util.c

index 431cbb59997c5c16af7385a013d613d3b651d626..e242452d8ff0e529b18b4f4dc91805f5e4836afe 100644 (file)
@@ -49,6 +49,7 @@ path = [
   "lib/vtls/.checksrc",
   "src/.checksrc",
   "tests/libtest/.checksrc",
+  "tests/server/.checksrc",
 ]
 SPDX-FileCopyrightText = "Daniel Stenberg, <daniel@haxx.se>, et al."
 SPDX-License-Identifier = "curl"
diff --git a/tests/server/.checksrc b/tests/server/.checksrc
new file mode 100644 (file)
index 0000000..8f67fd2
--- /dev/null
@@ -0,0 +1 @@
+enable STRNCPY
index b2e22cf6b7319c0373f2f47474857b1c81561e76..1a844f121bd3d30a3b9bd0e74782799c7a31e22f 100644 (file)
@@ -50,7 +50,7 @@ AM_CPPFLAGS += -DCURL_NO_GETADDRINFO_OVERRIDE
 # Makefile.inc provides neat definitions
 include Makefile.inc
 
-EXTRA_DIST = base64.pl CMakeLists.txt
+EXTRA_DIST = base64.pl CMakeLists.txt .checksrc
 
 CHECKSRC = $(CS_$(V))
 CS_0 = @echo "  RUN     " $@;
index 96f44fe0be3136d6b673bf575ad6fcb7974b3823..a36dc0055d36f409272adb615f905a05be573d9e 100644 (file)
@@ -834,60 +834,66 @@ void restore_signal_handlers(bool keep_sigalrm)
 #ifdef USE_UNIX_SOCKETS
 
 int bind_unix_socket(curl_socket_t sock, const char *unix_socket,
-        struct sockaddr_un *sau) {
-    int error;
-    int rc;
-
-    memset(sau, 0, sizeof(struct sockaddr_un));
-    sau->sun_family = AF_UNIX;
-    strncpy(sau->sun_path, unix_socket, sizeof(sau->sun_path) - 1);
-    rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
-    if(0 != rc && SOCKERRNO == EADDRINUSE) {
-      struct_stat statbuf;
-      /* socket already exists. Perhaps it is stale? */
-      curl_socket_t unixfd = socket(AF_UNIX, SOCK_STREAM, 0);
-      if(CURL_SOCKET_BAD == unixfd) {
-        logmsg("Failed to create socket at %s: (%d) %s",
-               unix_socket, SOCKERRNO, sstrerror(SOCKERRNO));
-        return -1;
-      }
-      /* check whether the server is alive */
-      rc = connect(unixfd, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
-      error = SOCKERRNO;
-      sclose(unixfd);
-      if(0 != rc && ECONNREFUSED != error) {
-        logmsg("Failed to connect to %s: (%d) %s",
-               unix_socket, error, sstrerror(error));
-        return rc;
-      }
-      /* socket server is not alive, now check if it was actually a socket. */
+                     struct sockaddr_un *sau)
+{
+  int error;
+  int rc;
+  size_t len = strlen(unix_socket);
+
+  memset(sau, 0, sizeof(struct sockaddr_un));
+  sau->sun_family = AF_UNIX;
+  if(len >= sizeof(sau->sun_path) - 1) {
+    logmsg("Too long unix socket domain path (%zd)", len);
+    return -1;
+  }
+  strcpy(sau->sun_path, unix_socket);
+  rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
+  if(0 != rc && SOCKERRNO == EADDRINUSE) {
+    struct_stat statbuf;
+    /* socket already exists. Perhaps it is stale? */
+    curl_socket_t unixfd = socket(AF_UNIX, SOCK_STREAM, 0);
+    if(CURL_SOCKET_BAD == unixfd) {
+      logmsg("Failed to create socket at %s: (%d) %s",
+             unix_socket, SOCKERRNO, sstrerror(SOCKERRNO));
+      return -1;
+    }
+    /* check whether the server is alive */
+    rc = connect(unixfd, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
+    error = SOCKERRNO;
+    sclose(unixfd);
+    if(0 != rc && ECONNREFUSED != error) {
+      logmsg("Failed to connect to %s: (%d) %s",
+             unix_socket, error, sstrerror(error));
+      return rc;
+    }
+    /* socket server is not alive, now check if it was actually a socket. */
 #ifdef _WIN32
-      /* Windows does not have lstat function. */
-      rc = curlx_win32_stat(unix_socket, &statbuf);
+    /* Windows does not have lstat function. */
+    rc = curlx_win32_stat(unix_socket, &statbuf);
 #else
-      rc = lstat(unix_socket, &statbuf);
+    rc = lstat(unix_socket, &statbuf);
 #endif
-      if(0 != rc) {
-        logmsg("Error binding socket, failed to stat %s: (%d) %s",
-               unix_socket, errno, strerror(errno));
-        return rc;
-      }
+    if(0 != rc) {
+      logmsg("Error binding socket, failed to stat %s: (%d) %s",
+             unix_socket, errno, strerror(errno));
+      return rc;
+    }
 #ifdef S_IFSOCK
-      if((statbuf.st_mode & S_IFSOCK) != S_IFSOCK) {
-        logmsg("Error binding socket, failed to stat %s", unix_socket);
-        return -1;
-      }
+    if((statbuf.st_mode & S_IFSOCK) != S_IFSOCK) {
+      logmsg("Error binding socket, failed to stat %s", unix_socket);
+      return -1;
+    }
 #endif
-      /* dead socket, cleanup and retry bind */
-      rc = unlink(unix_socket);
-      if(0 != rc) {
-        logmsg("Error binding socket, failed to unlink %s: (%d) %s",
-               unix_socket, errno, strerror(errno));
-        return rc;
-      }
-      /* stale socket is gone, retry bind */
-      rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
+    /* dead socket, cleanup and retry bind */
+    rc = unlink(unix_socket);
+    if(0 != rc) {
+      logmsg("Error binding socket, failed to unlink %s: (%d) %s",
+             unix_socket, errno, strerror(errno));
+      return rc;
     }
-    return rc;
+    /* stale socket is gone, retry bind */
+    rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
+  }
+  return rc;
 }
 #endif