diff options
author | Bjorn Andersson <bjorn.andersson@sonymobile.com> | 2015-12-29 11:17:05 -0800 |
---|---|---|
committer | Bjorn Andersson <bjorn.andersson@sonymobile.com> | 2015-12-29 11:17:05 -0800 |
commit | 292997420c6fc385f31e568620476b0b71de97be (patch) | |
tree | 383672a502accb1287de1747c36db420cbea7695 /libnetutils | |
parent | 0f0498ad508e6747dc7b72a6e63de2f2befa2e1c (diff) | |
download | core-292997420c6fc385f31e568620476b0b71de97be.tar.gz core-292997420c6fc385f31e568620476b0b71de97be.tar.bz2 core-292997420c6fc385f31e568620476b0b71de97be.zip |
libnetutils: Check socket() return value
Add a check for socket() errors and make sure to preserve errno over the
subsequent close() calls.
Change-Id: If52d76cd3cb45044eaaf7fea9bfd4471dc66a078
Diffstat (limited to 'libnetutils')
-rw-r--r-- | libnetutils/ifc_utils.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/libnetutils/ifc_utils.c b/libnetutils/ifc_utils.c index 956ed30c3..e0a9f7f88 100644 --- a/libnetutils/ifc_utils.c +++ b/libnetutils/ifc_utils.c @@ -253,6 +253,7 @@ int ifc_act_on_address(int action, const char *name, const char *address, int prefixlen) { int ifindex, s, len, ret; struct sockaddr_storage ss; + int saved_errno; void *addr; size_t addrlen; struct { @@ -317,15 +318,21 @@ int ifc_act_on_address(int action, const char *name, const char *address, memcpy(RTA_DATA(rta), addr, addrlen); s = socket(PF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE); + if (s < 0) { + return -errno; + } + if (send(s, &req, req.n.nlmsg_len, 0) < 0) { + saved_errno = errno; close(s); - return -errno; + return -saved_errno; } len = recv(s, buf, sizeof(buf), 0); + saved_errno = errno; close(s); if (len < 0) { - return -errno; + return -saved_errno; } // Parse the acknowledgement to find the return code. |