system-linux: check ioctl return value in system_if_flags()
[project/netifd.git] / system-linux.c
index 3cdf3e4..0b594f6 100644 (file)
@@ -781,7 +781,9 @@ static int system_if_flags(const char *ifname, unsigned add, unsigned rem)
 
        memset(&ifr, 0, sizeof(ifr));
        strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-       ioctl(sock_ioctl, SIOCGIFFLAGS, &ifr);
+       if (ioctl(sock_ioctl, SIOCGIFFLAGS, &ifr) < 0)
+               return -1;
+
        ifr.ifr_flags |= add;
        ifr.ifr_flags &= ~rem;
        return ioctl(sock_ioctl, SIOCSIFFLAGS, &ifr);
@@ -1571,6 +1573,9 @@ int system_if_check(struct device *dev)
        };
        int ret = 1;
 
+       if (!cb)
+               return ret;
+
        msg = nlmsg_alloc_simple(RTM_GETLINK, 0);
        if (!msg)
                goto out;
@@ -2315,9 +2320,14 @@ static int system_add_ip6_tunnel(const char *name, const unsigned int link,
 
 #ifdef IFLA_IPTUN_FMR_MAX
        if ((cur = tb[TUNNEL_ATTR_DATA])) {
-               struct nlattr *fmrs = nla_nest_start(nlm, IFLA_IPTUN_FMRS);
                struct blob_attr *dcur;
                unsigned drem, fmrcnt = 0;
+               struct nlattr *fmrs = nla_nest_start(nlm, IFLA_IPTUN_FMRS);
+
+               if (!fmrs) {
+                       ret = -ENOMEM;
+                       goto failure;
+               }
 
                blobmsg_for_each_attr(dcur, cur, drem) {
                        if (blobmsg_type(dcur) != BLOBMSG_TYPE_ARRAY ||
@@ -2365,6 +2375,10 @@ static int system_add_ip6_tunnel(const char *name, const unsigned int link,
                                offset = blobmsg_get_u32(tb_cur);
 
                                struct nlattr *rule = nla_nest_start(nlm, ++fmrcnt);
+                               if (!rule) {
+                                       ret = -ENOMEM;
+                                       goto failure;
+                               }
 
                                nla_put(nlm, IFLA_IPTUN_FMR_IP6_PREFIX, sizeof(ip6prefix), &ip6prefix);
                                nla_put(nlm, IFLA_IPTUN_FMR_IP4_PREFIX, sizeof(ip4prefix), &ip4prefix);