]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Cleanup a variety of SA issues
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 24 Aug 2017 23:54:21 +0000 (19:54 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 25 Aug 2017 00:34:28 +0000 (20:34 -0400)
1) Error check return from setsockopt and sockets
2) Check return codes for str2prefix
3) Clean up some potential NULL References

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_cmd.c
pimd/pim_instance.c
pimd/pim_mroute.c
pimd/pim_msdp_socket.c
pimd/pim_rp.c
pimd/pim_sock.c
pimd/pim_sock.h
pimd/pim_ssm.c
pimd/pim_zebra.c

index ae509f4a9bbbcdaa00c8aeefd425bf92e6a3754a..4a9c53cf2905d13920bc744062303774463d4ef1 100644 (file)
@@ -4895,6 +4895,9 @@ DEFUN (show_ip_mroute_count,
        int idx = 2;
        struct vrf *vrf = pim_cmd_lookup_vrf(vty, argv, argc, &idx);
 
+       if (!vrf)
+               return CMD_WARNING;
+
        show_mroute_count(vrf->info, vty);
        return CMD_SUCCESS;
 }
index 7fc77556ec65debd967b3e3b8ccc352b87f79769..d1f8085b48bf51fcfa73507de8180398309480a3 100644 (file)
@@ -195,11 +195,16 @@ static int pim_vrf_config_write(struct vty *vty)
        RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name)
        {
                pim = vrf->info;
-               if (!pim || vrf->vrf_id != VRF_DEFAULT) {
-                       vty_out(vty, "vrf %s\n", vrf->name);
-                       pim_global_config_write_worker(pim, vty);
-                       vty_out(vty, "!\n");
-               }
+
+               if (!pim)
+                       continue;
+
+               if (vrf->vrf_id == VRF_DEFAULT)
+                       continue;
+
+               vty_out(vty, "vrf %s\n", vrf->name);
+               pim_global_config_write_worker(pim, vty);
+               vty_out(vty, "!\n");
        }
 
        return 0;
index 52d240f54b40a06952e5a17a68c2f9c095ab946a..dca3bf4af313f0710ce08f465c2a1ea69949b270 100644 (file)
@@ -713,21 +713,26 @@ int pim_mroute_socket_enable(struct pim_instance *pim)
 
        fd = socket(AF_INET, SOCK_RAW, IPPROTO_IGMP);
 
+       if (fd < 0) {
+               zlog_warn("Could not create mroute socket: errno=%d: %s", errno,
+                         safe_strerror(errno));
+               return -2;
+       }
+
 #ifdef SO_BINDTODEVICE
-       setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, pim->vrf->name,
-                  strlen(pim->vrf->name));
+       if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, pim->vrf->name,
+                      strlen(pim->vrf->name))) {
+               zlog_warn("Could not setsockopt SO_BINDTODEVICE: %s",
+                         safe_strerror(errno));
+               close(fd);
+               return -3;
+       }
 #endif
 
        if (pimd_privs.change(ZPRIVS_LOWER))
                zlog_err("pim_mroute_socket_enable: could not lower privs, %s",
                         safe_strerror(errno));
 
-       if (fd < 0) {
-               zlog_warn("Could not create mroute socket: errno=%d: %s", errno,
-                         safe_strerror(errno));
-               return -2;
-       }
-
        pim->mroute_socket = fd;
        if (pim_mroute_set(pim, 1)) {
                zlog_warn(
index 9473462e6325ed08db0400d4266b41f0e970e7bb..f245a043534af4557dca3210e35dfab4418e6906 100644 (file)
@@ -156,9 +156,15 @@ int pim_msdp_sock_listen(struct pim_instance *pim)
                if (!ifp) {
                        zlog_err("%s: Unable to lookup vrf interface: %s",
                                 __PRETTY_FUNCTION__, pim->vrf->name);
+                       close(sock);
+                       return -1;
+               }
+               if (pim_socket_bind(sock, ifp)) {
+                       zlog_err("%s: Unable to bind to socket: %s",
+                                __PRETTY_FUNCTION__, safe_strerror(errno));
+                       close(sock);
                        return -1;
                }
-               pim_socket_bind(sock, ifp);
        }
 
        if (pimd_privs.change(ZPRIVS_RAISE)) {
@@ -236,7 +242,13 @@ int pim_msdp_sock_connect(struct pim_msdp_peer *mp)
                                 __PRETTY_FUNCTION__, mp->pim->vrf->name);
                        return -1;
                }
-               pim_socket_bind(mp->fd, ifp);
+               if (pim_socket_bind(mp->fd, ifp)) {
+                       zlog_err("%s: Unable to bind to socket: %s",
+                                __PRETTY_FUNCTION__, safe_strerror(errno));
+                       close(mp->fd);
+                       mp->fd = -1;
+                       return -1;
+               }
        }
 
        set_nonblocking(mp->fd);
index 05592992a9515df25a56e794df8566cc45f8282e..e2c411a307bf09a3372cf0470199e32b602d2fa2 100644 (file)
@@ -542,7 +542,9 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
        }
        pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info);
 
-       str2prefix("224.0.0.0/4", &g_all);
+       if (!str2prefix("224.0.0.0/4", &g_all))
+               return PIM_RP_BAD_ADDRESS;
+
        rp_all = pim_rp_find_match_group(pim, &g_all);
 
        if (rp_all == rp_info) {
index a4d3d7e4b36566f4a86e09134e0af8f6e1411956..a5a842ceee8a2d1e7e92d26b920d48037a728c79 100644 (file)
@@ -65,22 +65,21 @@ int pim_socket_raw(int protocol)
        return fd;
 }
 
-int pim_socket_ip_hdr(int fd)
+void pim_socket_ip_hdr(int fd)
 {
        const int on = 1;
-       int ret;
 
        if (pimd_privs.change(ZPRIVS_RAISE))
                zlog_err("%s: could not raise privs, %s", __PRETTY_FUNCTION__,
                         safe_strerror(errno));
 
-       ret = setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
+       if (setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)))
+               zlog_err("%s: Could not turn on IP_HDRINCL option: %s",
+                        __PRETTY_FUNCTION__, safe_strerror(errno));
 
        if (pimd_privs.change(ZPRIVS_LOWER))
                zlog_err("%s: could not lower privs, %s", __PRETTY_FUNCTION__,
                         safe_strerror(errno));
-
-       return ret;
 }
 
 /*
index aa46cd620072e19aefa380cd821228b2e5778f9c..358dd39a44de01167693a48e621915f8e3e5b7a1 100644 (file)
@@ -36,7 +36,7 @@
 #define PIM_SOCK_ERR_BIND    (-11) /* Can't bind to interface */
 
 int pim_socket_bind(int fd, struct interface *ifp);
-int pim_socket_ip_hdr(int fd);
+void pim_socket_ip_hdr(int fd);
 int pim_socket_raw(int protocol);
 int pim_socket_mcast(int protocol, struct in_addr ifaddr, struct interface *ifp,
                     u_char loop);
index 8d270e620563fc8fbb8d0d9e754ec65b54329d3e..71bb6f2abd346be5a85d04b37f54a547970e75d1 100644 (file)
@@ -71,7 +71,10 @@ static int pim_is_grp_standard_ssm(struct prefix *group)
        static struct prefix group_ssm;
 
        if (first) {
-               str2prefix(PIM_SSM_STANDARD_RANGE, &group_ssm);
+               if (!str2prefix(PIM_SSM_STANDARD_RANGE, &group_ssm))
+                       zlog_err("%s: Failure to Read Group Address: %s",
+                                __PRETTY_FUNCTION__, PIM_SSM_STANDARD_RANGE);
+
                first = 0;
        }
 
index 7b060aef4b6d5e06fe6deec7b3af688188ad2867..a1107e2424886628f97b9aed4aa3572a06ab7fb6 100644 (file)
@@ -184,6 +184,13 @@ static int pim_zebra_if_state_up(int command, struct zclient *zclient,
                            && (ifp->vrf_id != vrf->vrf_id)) {
                                struct interface *master = if_lookup_by_name(
                                        vrf->name, vrf->vrf_id);
+
+                               if (!master) {
+                                       zlog_debug("%s: Unable to find Master interface for %s",
+                                                  __PRETTY_FUNCTION__,
+                                                  vrf->name);
+                                       return 0;
+                               }
                                zclient_interface_set_master(zclient, master,
                                                             ifp);
                        }