diff options
author | James E. King, III <jking@apache.org> | 2017-10-28 18:25:45 -0400 |
---|---|---|
committer | James E. King, III <jking@apache.org> | 2017-10-29 07:05:47 -0400 |
commit | 533405e3f85f2925aa1028fc3534e988e5debd32 (patch) | |
tree | 58073ef89cddef4bcae5e9b731ea028bdf105948 /lib/lua | |
parent | 375bfee701d3caa74074f8afb3d6940e52c45c88 (diff) | |
download | thrift-533405e3f85f2925aa1028fc3534e988e5debd32.tar.gz |
THRIFT-4376: fix more high impact coverity defects
Led to the discovery of incorrect lua socket error handling.
This closes #1405
Diffstat (limited to 'lib/lua')
-rw-r--r-- | lib/lua/src/socket.h | 4 | ||||
-rw-r--r-- | lib/lua/src/usocket.c | 44 |
2 files changed, 27 insertions, 21 deletions
diff --git a/lib/lua/src/socket.h b/lib/lua/src/socket.h index 8019ffed8..afb827e47 100644 --- a/lib/lua/src/socket.h +++ b/lib/lua/src/socket.h @@ -51,8 +51,8 @@ T_ERRCODE socket_send(p_socket sock, const char *data, size_t len, int timeout); T_ERRCODE socket_recv(p_socket sock, char *data, size_t len, int timeout, int *received); -void socket_setblocking(p_socket sock); -void socket_setnonblocking(p_socket sock); +T_ERRCODE socket_setblocking(p_socket sock); +T_ERRCODE socket_setnonblocking(p_socket sock); T_ERRCODE socket_accept(p_socket sock, p_socket sibling, p_sa addr, socklen_t *addr_len, int timeout); diff --git a/lib/lua/src/usocket.c b/lib/lua/src/usocket.c index 864fa3654..1a1b549a0 100644 --- a/lib/lua/src/usocket.c +++ b/lib/lua/src/usocket.c @@ -113,7 +113,7 @@ T_ERRCODE socket_create(p_socket sock, int domain, int type, int protocol) { T_ERRCODE socket_destroy(p_socket sock) { // TODO Figure out if I should be free-ing this if (*sock > 0) { - socket_setblocking(sock); + (void)socket_setblocking(sock); close(*sock); *sock = -1; } @@ -121,13 +121,15 @@ T_ERRCODE socket_destroy(p_socket sock) { } T_ERRCODE socket_bind(p_socket sock, p_sa addr, int addr_len) { - int ret = SUCCESS; - socket_setblocking(sock); + int ret = socket_setblocking(sock); + if (ret != SUCCESS) { + return ret; + } if (bind(*sock, addr, addr_len)) { ret = errno; } - socket_setnonblocking(sock); - return ret; + int ret2 = socket_setnonblocking(sock); + return ret == SUCCESS ? ret2 : ret; } T_ERRCODE socket_get_info(p_socket sock, short *port, char *buf, size_t len) { @@ -168,22 +170,25 @@ T_ERRCODE socket_accept(p_socket sock, p_socket client, if (*client > 0) { return SUCCESS; } - err = errno; - } while (err != EINTR); + } while ((err = errno) == EINTR); + if (err == EAGAIN || err == ECONNABORTED) { return socket_wait(sock, WAIT_MODE_R, timeout); } + return err; } T_ERRCODE socket_listen(p_socket sock, int backlog) { - int ret = SUCCESS; - socket_setblocking(sock); + int ret = socket_setblocking(sock); + if (ret != SUCCESS) { + return ret; + } if (listen(*sock, backlog)) { ret = errno; } - socket_setnonblocking(sock); - return ret; + int ret2 = socket_setnonblocking(sock); + return ret == SUCCESS ? ret2 : ret; } //////////////////////////////////////////////////////////////////////////////// @@ -217,12 +222,12 @@ T_ERRCODE socket_send( if (put > 0) { return SUCCESS; } - err = errno; - } while (err != EINTR); + } while ((err = errno) == EINTR); if (err == EAGAIN) { return socket_wait(sock, WAIT_MODE_W, timeout); } + return err; } @@ -232,8 +237,8 @@ T_ERRCODE socket_recv( if (*sock < 0) { return CLOSED; } + *received = 0; - int flags = fcntl(*sock, F_GETFL, 0); do { got = recv(*sock, data, len, 0); if (got > 0) { @@ -246,27 +251,28 @@ T_ERRCODE socket_recv( if (got == 0) { return CLOSED; } - } while (err != EINTR); + } while (err == EINTR); if (err == EAGAIN) { return socket_wait(sock, WAIT_MODE_R, timeout); } + return err; } //////////////////////////////////////////////////////////////////////////////// // Util -void socket_setnonblocking(p_socket sock) { +T_ERRCODE socket_setnonblocking(p_socket sock) { int flags = fcntl(*sock, F_GETFL, 0); flags |= O_NONBLOCK; - fcntl(*sock, F_SETFL, flags); + return fcntl(*sock, F_SETFL, flags) != -1 ? SUCCESS : errno; } -void socket_setblocking(p_socket sock) { +T_ERRCODE socket_setblocking(p_socket sock) { int flags = fcntl(*sock, F_GETFL, 0); flags &= (~(O_NONBLOCK)); - fcntl(*sock, F_SETFL, flags); + return fcntl(*sock, F_SETFL, flags) != -1 ? SUCCESS : errno; } //////////////////////////////////////////////////////////////////////////////// |