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",
|
"lib/vtls/.checksrc",
|
||||||
"src/.checksrc",
|
"src/.checksrc",
|
||||||
"tests/libtest/.checksrc",
|
"tests/libtest/.checksrc",
|
||||||
|
"tests/server/.checksrc",
|
||||||
]
|
]
|
||||||
SPDX-FileCopyrightText = "Daniel Stenberg, <daniel@haxx.se>, et al."
|
SPDX-FileCopyrightText = "Daniel Stenberg, <daniel@haxx.se>, et al."
|
||||||
SPDX-License-Identifier = "curl"
|
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
|
# Makefile.inc provides neat definitions
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
EXTRA_DIST = base64.pl CMakeLists.txt
|
EXTRA_DIST = base64.pl CMakeLists.txt .checksrc
|
||||||
|
|
||||||
CHECKSRC = $(CS_$(V))
|
CHECKSRC = $(CS_$(V))
|
||||||
CS_0 = @echo " RUN " $@;
|
CS_0 = @echo " RUN " $@;
|
||||||
|
|
|
@ -834,60 +834,66 @@ void restore_signal_handlers(bool keep_sigalrm)
|
||||||
#ifdef USE_UNIX_SOCKETS
|
#ifdef USE_UNIX_SOCKETS
|
||||||
|
|
||||||
int bind_unix_socket(curl_socket_t sock, const char *unix_socket,
|
int bind_unix_socket(curl_socket_t sock, const char *unix_socket,
|
||||||
struct sockaddr_un *sau) {
|
struct sockaddr_un *sau)
|
||||||
int error;
|
{
|
||||||
int rc;
|
int error;
|
||||||
|
int rc;
|
||||||
|
size_t len = strlen(unix_socket);
|
||||||
|
|
||||||
memset(sau, 0, sizeof(struct sockaddr_un));
|
memset(sau, 0, sizeof(struct sockaddr_un));
|
||||||
sau->sun_family = AF_UNIX;
|
sau->sun_family = AF_UNIX;
|
||||||
strncpy(sau->sun_path, unix_socket, sizeof(sau->sun_path) - 1);
|
if(len >= sizeof(sau->sun_path) - 1) {
|
||||||
rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
|
logmsg("Too long unix socket domain path (%zd)", len);
|
||||||
if(0 != rc && SOCKERRNO == EADDRINUSE) {
|
return -1;
|
||||||
struct_stat statbuf;
|
}
|
||||||
/* socket already exists. Perhaps it is stale? */
|
strcpy(sau->sun_path, unix_socket);
|
||||||
curl_socket_t unixfd = socket(AF_UNIX, SOCK_STREAM, 0);
|
rc = bind(sock, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
|
||||||
if(CURL_SOCKET_BAD == unixfd) {
|
if(0 != rc && SOCKERRNO == EADDRINUSE) {
|
||||||
logmsg("Failed to create socket at %s: (%d) %s",
|
struct_stat statbuf;
|
||||||
unix_socket, SOCKERRNO, sstrerror(SOCKERRNO));
|
/* socket already exists. Perhaps it is stale? */
|
||||||
return -1;
|
curl_socket_t unixfd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||||
}
|
if(CURL_SOCKET_BAD == unixfd) {
|
||||||
/* check whether the server is alive */
|
logmsg("Failed to create socket at %s: (%d) %s",
|
||||||
rc = connect(unixfd, (struct sockaddr*)sau, sizeof(struct sockaddr_un));
|
unix_socket, SOCKERRNO, sstrerror(SOCKERRNO));
|
||||||
error = SOCKERRNO;
|
return -1;
|
||||||
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;
|
/* 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
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user