diff --git a/src/checks.c b/src/checks.c index 3085eab93..9643a2b0d 100644 --- a/src/checks.c +++ b/src/checks.c @@ -176,9 +176,7 @@ int event_srv_chk_r(int fd) socklen_t lskerr = sizeof(skerr); result = len = -1; - - getsockopt(fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr); - if (!skerr) { + if (!getsockopt(fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr) && !skerr) { #ifndef MSG_NOSIGNAL len = recv(fd, reply, sizeof(reply), 0); #else diff --git a/src/standard.c b/src/standard.c index 64357a2b2..a32267bb6 100644 --- a/src/standard.c +++ b/src/standard.c @@ -96,6 +96,8 @@ struct sockaddr_in *str2sa(char *str) memset(&sa, 0, sizeof(sa)); str = strdup(str); + if (str == NULL) + goto out_nofree; if ((c = strrchr(str,':')) != NULL) { *c++ = '\0'; @@ -120,6 +122,7 @@ struct sockaddr_in *str2sa(char *str) sa.sin_family = AF_INET; free(str); + out_nofree: return &sa; } @@ -137,6 +140,8 @@ int str2net(char *str, struct in_addr *addr, struct in_addr *mask) memset(mask, 0, sizeof(*mask)); memset(addr, 0, sizeof(*addr)); str = strdup(str); + if (str == NULL) + return 0; if ((c = strrchr(str, '/')) != NULL) { *c++ = '\0'; diff --git a/src/stream_sock.c b/src/stream_sock.c index f0f80d1e2..2f91b0fbc 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -86,8 +86,8 @@ int stream_sock_read(int fd) { int skerr; socklen_t lskerr = sizeof(skerr); - getsockopt(fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr); - if (skerr) + ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr); + if (ret == -1 || skerr) ret = -1; else ret = recv(fd, b->r, max, 0); @@ -171,8 +171,8 @@ int stream_sock_write(int fd) { if (fdtab[fd].state == FD_STCONN) { int skerr; socklen_t lskerr = sizeof(skerr); - getsockopt(fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr); - if (skerr) { + ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr); + if (ret == -1 || skerr) { b->flags |= BF_WRITE_ERROR; fdtab[fd].state = FD_STERROR; task_wakeup(&rq, fdtab[fd].owner); @@ -195,8 +195,8 @@ int stream_sock_write(int fd) { int skerr; socklen_t lskerr = sizeof(skerr); - getsockopt(fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr); - if (skerr) + ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr); + if (ret == -1 || skerr) ret = -1; else ret = send(fd, b->w, max, MSG_DONTWAIT);