From: Andrew Deason Date: Mon, 2 Nov 2020 19:16:41 +0000 (-0600) Subject: rx: Save errno in pthread rxi_Sendmsg X-Git-Tag: openafs-devel-1_9_1~56 X-Git-Url: http://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=eff7fa4b2eb9a3001dc18dca157ccbd5f19f89b6 rx: Save errno in pthread rxi_Sendmsg Currently, our pthread version of rxi_Sendmsg uses 'errno' in some logic if sendmsg fails, but we do so after calling functions that might alter errno (e.g. fflush). To make sure we get the correct errno value, save the value of errno right after sendmsg returns an error. Reorganize this function a bit to help make the logic easier to follow. Change-Id: I6bf284bd75edb5404bb6771bb99a9381b0f8654d Reviewed-on: https://gerrit.openafs.org/14423 Reviewed-by: Cheyenne Wills Tested-by: BuildBot Reviewed-by: Benjamin Kaduk --- diff --git a/src/rx/rx_pthread.c b/src/rx/rx_pthread.c index 388bca8..3e61245 100644 --- a/src/rx/rx_pthread.c +++ b/src/rx/rx_pthread.c @@ -415,37 +415,37 @@ rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags) int rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags) { - int ret; - ret = sendmsg(socket, msg_p, flags); + int err; + if (sendmsg(socket, msg_p, flags) >= 0) { + return 0; + } + +#ifdef AFS_NT40_ENV + err = WSAGetLastError(); +#else + err = errno; +#endif #ifdef AFS_RXERRQ_ENV - if (ret < 0) { - while (rxi_HandleSocketError(socket) > 0) - ; - return ret; - } + while (rxi_HandleSocketError(socket) > 0) + ; #else # ifdef AFS_LINUX22_ENV /* linux unfortunately returns ECONNREFUSED if the target port * is no longer in use */ /* and EAGAIN if a UDP checksum is incorrect */ - if (ret == -1 && errno != ECONNREFUSED && errno != EAGAIN) { -# else - if (ret == -1) { -# endif - dpf(("rxi_sendmsg failed, error %d\n", errno)); - fflush(stdout); -# ifndef AFS_NT40_ENV - if (errno > 0) - return -errno; -# else - if (WSAGetLastError() > 0) - return -WSAGetLastError(); -# endif - return -1; + if (err == ECONNREFUSED || err == EAGAIN) { + return 0; } +# endif + dpf(("rxi_sendmsg failed, error %d\n", errno)); + fflush(stdout); #endif /* !AFS_RXERRQ_ENV */ - return 0; + + if (err > 0) { + return -err; + } + return -1; } struct rx_ts_info_t * rx_ts_info_init(void) {