summaryrefslogtreecommitdiff
path: root/lib/lua
diff options
context:
space:
mode:
authorJames E. King, III <jking@apache.org>2017-10-28 18:25:45 -0400
committerJames E. King, III <jking@apache.org>2017-10-29 07:05:47 -0400
commit533405e3f85f2925aa1028fc3534e988e5debd32 (patch)
tree58073ef89cddef4bcae5e9b731ea028bdf105948 /lib/lua
parent375bfee701d3caa74074f8afb3d6940e52c45c88 (diff)
downloadthrift-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.h4
-rw-r--r--lib/lua/src/usocket.c44
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;
}
////////////////////////////////////////////////////////////////////////////////