pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/33588 )
Change subject: socket: Cache errno before calling further functions ......................................................................
socket: Cache errno before calling further functions
No issue is in principle expected with previous code since snprintf doesn't seem to be setting errno according to "man snprintf", but better be safe, specially in case someone calls the functions calling snprintf in the future, or if snprintf sets errno in other implementations.
Change-Id: I6969be10db867b4821e05aed50bc22a7ccd4a633 --- M src/core/socket.c 1 file changed, 26 insertions(+), 6 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/88/33588/1
diff --git a/src/core/socket.c b/src/core/socket.c index 02e16bc..5a31c8f 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -561,19 +561,21 @@ rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (rc < 0) { + int err = errno; _SOCKADDR_TO_STR(sastr, local); LOGP(DLGLOBAL, LOGL_ERROR, "cannot setsockopt socket: " OSMO_SOCKADDR_STR_FMT ": %s\n", - OSMO_SOCKADDR_STR_FMT_ARGS(sastr), strerror(errno)); + OSMO_SOCKADDR_STR_FMT_ARGS(sastr), strerror(err)); close(sfd); return rc; } }
if (bind(sfd, &local->u.sa, sizeof(struct osmo_sockaddr)) == -1) { + int err = errno; _SOCKADDR_TO_STR(sastr, local); LOGP(DLGLOBAL, LOGL_ERROR, "unable to bind socket: " OSMO_SOCKADDR_STR_FMT ": %s\n", - OSMO_SOCKADDR_STR_FMT_ARGS(sastr), strerror(errno)); + OSMO_SOCKADDR_STR_FMT_ARGS(sastr), strerror(err)); close(sfd); return -1; } @@ -594,9 +596,10 @@
rc = connect(sfd, &remote->u.sa, sizeof(struct osmo_sockaddr)); if (rc != 0 && errno != EINPROGRESS) { + int err = errno; _SOCKADDR_TO_STR(sastr, remote); LOGP(DLGLOBAL, LOGL_ERROR, "unable to connect socket: " OSMO_SOCKADDR_STR_FMT ": %s\n", - OSMO_SOCKADDR_STR_FMT_ARGS(sastr), strerror(errno)); + OSMO_SOCKADDR_STR_FMT_ARGS(sastr), strerror(err)); close(sfd); return rc; } @@ -798,12 +801,13 @@ rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (rc < 0) { + int err = errno; multiaddr_snprintf(strbuf, sizeof(strbuf), local_hosts, local_hosts_cnt); LOGP(DLGLOBAL, LOGL_ERROR, "cannot setsockopt socket:" " %s:%u: %s\n", strbuf, local_port, - strerror(errno)); + strerror(err)); goto ret_close; }
@@ -821,9 +825,10 @@
rc = sctp_bindx(sfd, (struct sockaddr *)addrs_buf, local_hosts_cnt, SCTP_BINDX_ADD_ADDR); if (rc == -1) { + int err = errno; multiaddr_snprintf(strbuf, sizeof(strbuf), local_hosts, local_hosts_cnt); LOGP(DLGLOBAL, LOGL_NOTICE, "unable to bind socket: %s:%u: %s\n", - strbuf, local_port, strerror(errno)); + strbuf, local_port, strerror(err)); rc = -ENODEV; goto ret_close; } @@ -843,9 +848,10 @@
rc = sctp_connectx(sfd, (struct sockaddr *)addrs_buf, remote_hosts_cnt, NULL); if (rc != 0 && errno != EINPROGRESS) { + int err = errno; multiaddr_snprintf(strbuf, sizeof(strbuf), remote_hosts, remote_hosts_cnt); LOGP(DLGLOBAL, LOGL_ERROR, "unable to connect socket: %s:%u: %s\n", - strbuf, remote_port, strerror(errno)); + strbuf, remote_port, strerror(err)); rc = -ENODEV; goto ret_close; }