From e691f179b6c6fc26536e68958f19ff6983a03274 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 24 Aug 2017 19:54:21 -0400 Subject: [PATCH] pimd: Cleanup a variety of SA issues 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 --- pimd/pim_cmd.c | 3 +++ pimd/pim_instance.c | 15 ++++++++++----- pimd/pim_mroute.c | 21 +++++++++++++-------- pimd/pim_msdp_socket.c | 16 ++++++++++++++-- pimd/pim_rp.c | 4 +++- pimd/pim_sock.c | 9 ++++----- pimd/pim_sock.h | 2 +- pimd/pim_ssm.c | 5 ++++- pimd/pim_zebra.c | 7 +++++++ 9 files changed, 59 insertions(+), 23 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index ae509f4a9b..4a9c53cf29 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -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; } diff --git a/pimd/pim_instance.c b/pimd/pim_instance.c index 7fc77556ec..d1f8085b48 100644 --- a/pimd/pim_instance.c +++ b/pimd/pim_instance.c @@ -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; diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index 52d240f54b..dca3bf4af3 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -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( diff --git a/pimd/pim_msdp_socket.c b/pimd/pim_msdp_socket.c index 9473462e63..f245a04353 100644 --- a/pimd/pim_msdp_socket.c +++ b/pimd/pim_msdp_socket.c @@ -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); diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 05592992a9..e2c411a307 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -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) { diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c index a4d3d7e4b3..a5a842ceee 100644 --- a/pimd/pim_sock.c +++ b/pimd/pim_sock.c @@ -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; } /* diff --git a/pimd/pim_sock.h b/pimd/pim_sock.h index aa46cd6200..358dd39a44 100644 --- a/pimd/pim_sock.h +++ b/pimd/pim_sock.h @@ -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); diff --git a/pimd/pim_ssm.c b/pimd/pim_ssm.c index 8d270e6205..71bb6f2abd 100644 --- a/pimd/pim_ssm.c +++ b/pimd/pim_ssm.c @@ -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; } diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 7b060aef4b..a1107e2424 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -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); } -- 2.39.5