summaryrefslogtreecommitdiffstats
path: root/libnetutils
diff options
context:
space:
mode:
authorBjorn Andersson <bjorn.andersson@sonymobile.com>2015-12-29 11:17:05 -0800
committerBjorn Andersson <bjorn.andersson@sonymobile.com>2015-12-29 11:17:05 -0800
commit292997420c6fc385f31e568620476b0b71de97be (patch)
tree383672a502accb1287de1747c36db420cbea7695 /libnetutils
parent0f0498ad508e6747dc7b72a6e63de2f2befa2e1c (diff)
downloadcore-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.c11
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.