From 3491376e5dcc4981381c4af6a66deaf7a3754175 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Thu, 31 Jan 2019 16:48:07 +0300 Subject: [PATCH] Fix SVACE issues - add safe cast ssize_t to uint64_t - fix call logs at the wrong time - add check return code for remove() Change-Id: Id864d60dfe5d55ee7a1e201d983a9afb5128ad2b Signed-off-by: Vyacheslav Cherkashin --- helper/libdaprobe.c | 9 ++---- probe_screenshot/dacapture_wayland.c | 3 +- probe_socket/libdasocket.c | 57 ++++++++++++++++++------------------ 3 files changed, 33 insertions(+), 36 deletions(-) diff --git a/helper/libdaprobe.c b/helper/libdaprobe.c index 283cde1..2c6dab1 100755 --- a/helper/libdaprobe.c +++ b/helper/libdaprobe.c @@ -246,12 +246,8 @@ static int create_socket(void) client_len = sizeof(client_addr); if (connect(gTraceInfo.socket.daemonSock, (struct sockaddr *)&client_addr, client_len) < 0) { - close(gTraceInfo.socket.daemonSock); gTraceInfo.socket.daemonSock = -1; - strerror_r(errno, strerr_buf, sizeof(strerr_buf)); - PRINTERR("cannot connect to da_manager. err <%s>\n", - strerr_buf); ret = -1; goto create_sock_done; } @@ -271,9 +267,9 @@ static int create_socket(void) ret = read_log(gTraceInfo.socket.daemonSock, &log); if (ret) { + PRINTERR("closed by other peer"); close(gTraceInfo.socket.daemonSock); gTraceInfo.socket.daemonSock = -1; - PRINTERR("closed by other peer\n"); application_exit(); return -1; } @@ -296,7 +292,6 @@ static int create_socket(void) PRINTMSG("create_socket connect() success\n"); create_sock_done: - PRINTMSG("socket create done with result = %d", ret); return ret; } @@ -443,9 +438,9 @@ static void *recv_thread(void __unused * data) ret = read_log(gTraceInfo.socket.daemonSock, &log); if (ret) { + PRINTERR("Invalid log format: ret=%d", ret); close(gTraceInfo.socket.daemonSock); gTraceInfo.socket.daemonSock = -1; - PRINTERR("Invalid log format: ret=%d", ret); return NULL; } diff --git a/probe_screenshot/dacapture_wayland.c b/probe_screenshot/dacapture_wayland.c index 041e747..b54c20d 100755 --- a/probe_screenshot/dacapture_wayland.c +++ b/probe_screenshot/dacapture_wayland.c @@ -714,7 +714,8 @@ int captureScreen() } ret = screenshot_send_to_socket(dstpath); - remove(dstpath); + if (remove(dstpath) == -1) + LOGE("Cannot remove file: %s, errno=%d", dstpath, errno); unlock: pthread_mutex_unlock(&captureScreenLock); diff --git a/probe_socket/libdasocket.c b/probe_socket/libdasocket.c index 0cc515b..6f4f900 100644 --- a/probe_socket/libdasocket.c +++ b/probe_socket/libdasocket.c @@ -58,6 +58,20 @@ #define OBJ_DUMMY 0 +static uint64_t get_total_size(ssize_t val) +{ +#if SSIZE_MAX > UINT64_MAX +# error "This config is not supported. SSIZE_MAX is very big." +#endif + + return (val < 0) ? 0 : (uint64_t)val; +} + +static uint32_t get_pack_size(uint64_t total_size) +{ + return total_size > SOCKET_SEND_SIZE ? SOCKET_SEND_SIZE : total_size; +} + void getAddress(const struct sockaddr *sa, char *address) { char buff[INET6_ADDRSTRLEN]; @@ -241,7 +255,7 @@ HANDLER_WRAPPERS(network_feature, ssize_t, send, int, socket, { ssize_t (*sendp)(int socket, const void *message, size_t length, int flags); - ssize_t sret, result; + ssize_t sret; BEFORE_ORIGINAL_SOCK(send, LIBC); char *messagP = (char *)message; @@ -253,12 +267,9 @@ HANDLER_WRAPPERS(network_feature, ssize_t, send, int, socket, length, flags); sret = sendp(socket, message, length, flags); - result = sret; - if (result < 0) - result = 0; - info.msg_total_size = (uint64_t)result; - info.msg_pack_size = result > SOCKET_SEND_SIZE ? SOCKET_SEND_SIZE - : result; + + info.msg_total_size = get_total_size(sret); + info.msg_pack_size = get_pack_size(info.msg_total_size); info.msg_buf = messagP; AFTER_ORIGINAL_LIBC_SOCK_WAIT_FUNC_END('x', sret, OBJ_DUMMY, socket, @@ -273,7 +284,7 @@ HANDLER_WRAPPERS(network_feature, ssize_t, recv, int, socket, void *, buffer, size_t, length, int, flags) { ssize_t (*recvp)(int socket, void *buffer, size_t length, int flags); - ssize_t sret, result; + ssize_t sret; BEFORE_ORIGINAL_SOCK(recv, LIBC); @@ -286,12 +297,9 @@ HANDLER_WRAPPERS(network_feature, ssize_t, recv, int, socket, void *, buffer, length, flags); sret = recvp(socket, buffer, length, flags); - result = sret; - if (result < 0) - result = 0; - info.msg_total_size = (uint64_t)result; - info.msg_pack_size = result > SOCKET_SEND_SIZE ? SOCKET_SEND_SIZE - : result; + + info.msg_total_size = get_total_size(sret); + info.msg_pack_size = get_pack_size(info.msg_total_size); info.msg_buf = bufferP; AFTER_ORIGINAL_LIBC_SOCK_WAIT_FUNC_END('x', sret, OBJ_DUMMY, socket, @@ -309,7 +317,7 @@ HANDLER_WRAPPERS(network_feature, ssize_t, sendto, int, socket, ssize_t (*sendtop)(int socket, const void *message, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t dest_len); - ssize_t sret, result; + ssize_t sret; BEFORE_ORIGINAL_SOCK(sendto, LIBC); @@ -325,12 +333,9 @@ HANDLER_WRAPPERS(network_feature, ssize_t, sendto, int, socket, dest_len); sret = sendtop(socket, message, length, flags, dest_addr, dest_len); - result = sret; - if (result < 0) - result = 0; - info.msg_total_size = (uint64_t)result; - info.msg_pack_size = result > SOCKET_SEND_SIZE ? SOCKET_SEND_SIZE - : result; + + info.msg_total_size = get_total_size(sret); + info.msg_pack_size = get_pack_size(info.msg_total_size); info.msg_buf = bufferP; AFTER_ORIGINAL_LIBC_SOCK_WAIT_FUNC_END('x', sret, OBJ_DUMMY, socket, @@ -351,7 +356,7 @@ HANDLER_WRAPPERS(network_feature, ssize_t, recvfrom, int, socket, ssize_t (*recvfromp)(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len); - ssize_t sret, result; + ssize_t sret; BEFORE_ORIGINAL_SOCK(recvfrom, LIBC); @@ -368,12 +373,8 @@ HANDLER_WRAPPERS(network_feature, ssize_t, recvfrom, int, socket, sret = recvfromp(socket, buffer, length, flags, address, address_len); info.sock = (struct sockaddr *)address; - result = sret; - if (result < 0) - result = 0; - info.msg_total_size = (uint64_t)result; - info.msg_pack_size = result > SOCKET_SEND_SIZE ? SOCKET_SEND_SIZE - : result; + info.msg_total_size = get_total_size(sret); + info.msg_pack_size = get_pack_size(info.msg_total_size); info.msg_buf = bufferP; AFTER_ORIGINAL_LIBC_SOCK_WAIT_FUNC_END('x', sret, OBJ_DUMMY, socket, -- 2.7.4