mirror of
https://github.com/curl/curl.git
synced 2025-09-10 22:22:43 +03:00
tests/server/util.c: remove use of strncpy
... and ban the function in code in this directory. Closes #15213
This commit is contained in:
parent
08949637d5
commit
45b388fdc7
|
@ -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"
|
||||
|
|
1
tests/server/.checksrc
Normal file
1
tests/server/.checksrc
Normal file
|
@ -0,0 +1 @@
|
|||
enable STRNCPY
|
|
@ -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 " $@;
|
||||
|
|
|
@ -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;
|
||||
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;
|
||||
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. */
|
||||
#ifdef _WIN32
|
||||
/* Windows does not have lstat function. */
|
||||
rc = curlx_win32_stat(unix_socket, &statbuf);
|
||||
#else
|
||||
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;
|
||||
}
|
||||
#ifdef S_IFSOCK
|
||||
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));
|
||||
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;
|
||||
}
|
||||
return rc;
|
||||
/* 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);
|
||||
#else
|
||||
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;
|
||||
}
|
||||
#ifdef S_IFSOCK
|
||||
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));
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue
Block a user