From 993bab898d4aff3a29bc041e6b45488b5a9cfa12 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Thu, 5 Oct 2017 21:47:11 -0300 Subject: [PATCH 1/3] lib, ldpd: fix "argument cannot be negative" coverity warnings Signed-off-by: Renato Westphal --- ldpd/ldpd.c | 13 +++++++++---- lib/libfrr.c | 30 +++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c index a79e63229f..843d160d62 100644 --- a/ldpd/ldpd.c +++ b/ldpd/ldpd.c @@ -450,10 +450,15 @@ start_child(enum ldpd_process p, char *argv0, int fd_async, int fd_sync) } nullfd = open("/dev/null", O_RDONLY | O_NOCTTY); - dup2(nullfd, 0); - dup2(nullfd, 1); - dup2(nullfd, 2); - close(nullfd); + if (nullfd == -1) { + zlog_err("%s: failed to open /dev/null: %s", __func__, + safe_strerror(errno)); + } else { + dup2(nullfd, 0); + dup2(nullfd, 1); + dup2(nullfd, 2); + close(nullfd); + } if (dup2(fd_async, LDPD_FD_ASYNC) == -1) fatal("cannot setup imsg async fd"); diff --git a/lib/libfrr.c b/lib/libfrr.c index 2859f062c1..6cb8711edf 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -768,6 +768,8 @@ void frr_vty_serv(void) static void frr_terminal_close(int isexit) { + int nullfd; + if (daemon_ctl_sock != -1) { close(daemon_ctl_sock); daemon_ctl_sock = -1; @@ -783,11 +785,16 @@ static void frr_terminal_close(int isexit) fflush(stdout); } - int nullfd = open("/dev/null", O_RDONLY | O_NOCTTY); - dup2(nullfd, 0); - dup2(nullfd, 1); - dup2(nullfd, 2); - close(nullfd); + nullfd = open("/dev/null", O_RDONLY | O_NOCTTY); + if (nullfd == -1) { + zlog_err("%s: failed to open /dev/null: %s", __func__, + safe_strerror(errno)); + } else { + dup2(nullfd, 0); + dup2(nullfd, 1); + dup2(nullfd, 2); + close(nullfd); + } } static struct thread *daemon_ctl_thread = NULL; @@ -849,10 +856,15 @@ void frr_run(struct thread_master *master) } } else if (di->daemon_mode) { int nullfd = open("/dev/null", O_RDONLY | O_NOCTTY); - dup2(nullfd, 0); - dup2(nullfd, 1); - dup2(nullfd, 2); - close(nullfd); + if (nullfd == -1) { + zlog_err("%s: failed to open /dev/null: %s", __func__, + safe_strerror(errno)); + } else { + dup2(nullfd, 0); + dup2(nullfd, 1); + dup2(nullfd, 2); + close(nullfd); + } if (daemon_ctl_sock != -1) close(daemon_ctl_sock); From 8034beff9f153e265040b94a355c1057d56d59f0 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Thu, 5 Oct 2017 22:31:54 -0300 Subject: [PATCH 2/3] *: use argv[]->text instead of argv[]->arg when appropriate Incomplete commands like "debug ospf6 route mem" were being ignored. The changes in ripd and ripngd are intended to make the code easier to read, no bugs were fixed in these two daemons. Signed-off-by: Renato Westphal --- bgpd/bgp_evpn_vty.c | 16 ++++++++-------- ospf6d/ospf6_route.c | 16 ++++++++-------- ripd/rip_debug.c | 16 ++++------------ ripngd/ripng_debug.c | 16 ++++------------ 4 files changed, 24 insertions(+), 40 deletions(-) diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c index 145890846b..07b86c05d6 100644 --- a/bgpd/bgp_evpn_vty.c +++ b/bgpd/bgp_evpn_vty.c @@ -3102,11 +3102,11 @@ DEFUN (bgp_evpn_vni_rt, if (!bgp || !vpn) return CMD_WARNING; - if (!strcmp(argv[1]->arg, "import")) + if (!strcmp(argv[1]->text, "import")) rt_type = RT_TYPE_IMPORT; - else if (!strcmp(argv[1]->arg, "export")) + else if (!strcmp(argv[1]->text, "export")) rt_type = RT_TYPE_EXPORT; - else if (!strcmp(argv[1]->arg, "both")) + else if (!strcmp(argv[1]->text, "both")) rt_type = RT_TYPE_BOTH; else { vty_out(vty, "%% Invalid Route Target type\n"); @@ -3164,11 +3164,11 @@ DEFUN (no_bgp_evpn_vni_rt, if (!bgp || !vpn) return CMD_WARNING; - if (!strcmp(argv[2]->arg, "import")) + if (!strcmp(argv[2]->text, "import")) rt_type = RT_TYPE_IMPORT; - else if (!strcmp(argv[2]->arg, "export")) + else if (!strcmp(argv[2]->text, "export")) rt_type = RT_TYPE_EXPORT; - else if (!strcmp(argv[2]->arg, "both")) + else if (!strcmp(argv[2]->text, "both")) rt_type = RT_TYPE_BOTH; else { vty_out(vty, "%% Invalid Route Target type\n"); @@ -3257,9 +3257,9 @@ DEFUN (no_bgp_evpn_vni_rt_without_val, if (!bgp || !vpn) return CMD_WARNING; - if (!strcmp(argv[2]->arg, "import")) { + if (!strcmp(argv[2]->text, "import")) { rt_type = RT_TYPE_IMPORT; - } else if (!strcmp(argv[2]->arg, "export")) { + } else if (!strcmp(argv[2]->text, "export")) { rt_type = RT_TYPE_EXPORT; } else { vty_out(vty, "%% Invalid Route Target type\n"); diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c index 724258d2fe..5b78dda688 100644 --- a/ospf6d/ospf6_route.c +++ b/ospf6d/ospf6_route.c @@ -1469,13 +1469,13 @@ DEFUN (debug_ospf6_route, int idx_type = 3; unsigned char level = 0; - if (!strncmp(argv[idx_type]->arg, "table", 5)) + if (!strcmp(argv[idx_type]->text, "table")) level = OSPF6_DEBUG_ROUTE_TABLE; - else if (!strncmp(argv[idx_type]->arg, "intra", 5)) + else if (!strcmp(argv[idx_type]->text, "intra-area")) level = OSPF6_DEBUG_ROUTE_INTRA; - else if (!strncmp(argv[idx_type]->arg, "inter", 5)) + else if (!strcmp(argv[idx_type]->text, "inter-area")) level = OSPF6_DEBUG_ROUTE_INTER; - else if (!strncmp(argv[idx_type]->arg, "memor", 5)) + else if (!strcmp(argv[idx_type]->text, "memory")) level = OSPF6_DEBUG_ROUTE_MEMORY; OSPF6_DEBUG_ROUTE_ON(level); return CMD_SUCCESS; @@ -1496,13 +1496,13 @@ DEFUN (no_debug_ospf6_route, int idx_type = 4; unsigned char level = 0; - if (!strncmp(argv[idx_type]->arg, "table", 5)) + if (!strcmp(argv[idx_type]->text, "table")) level = OSPF6_DEBUG_ROUTE_TABLE; - else if (!strncmp(argv[idx_type]->arg, "intra", 5)) + else if (!strcmp(argv[idx_type]->text, "intra-area")) level = OSPF6_DEBUG_ROUTE_INTRA; - else if (!strncmp(argv[idx_type]->arg, "inter", 5)) + else if (!strcmp(argv[idx_type]->text, "inter-area")) level = OSPF6_DEBUG_ROUTE_INTER; - else if (!strncmp(argv[idx_type]->arg, "memor", 5)) + else if (!strcmp(argv[idx_type]->text, "memory")) level = OSPF6_DEBUG_ROUTE_MEMORY; OSPF6_DEBUG_ROUTE_OFF(level); return CMD_SUCCESS; diff --git a/ripd/rip_debug.c b/ripd/rip_debug.c index 56ba8e7f3e..2ce289e38f 100644 --- a/ripd/rip_debug.c +++ b/ripd/rip_debug.c @@ -93,13 +93,9 @@ DEFUN (debug_rip_packet_direct, { int idx_recv_send = 3; rip_debug_packet |= RIP_DEBUG_PACKET; - if (strncmp("send", argv[idx_recv_send]->arg, - strlen(argv[idx_recv_send]->arg)) - == 0) + if (strcmp("send", argv[idx_recv_send]->text) == 0) rip_debug_packet |= RIP_DEBUG_SEND; - if (strncmp("recv", argv[idx_recv_send]->arg, - strlen(argv[idx_recv_send]->arg)) - == 0) + if (strcmp("recv", argv[idx_recv_send]->text) == 0) rip_debug_packet |= RIP_DEBUG_RECV; return CMD_SUCCESS; } @@ -150,16 +146,12 @@ DEFUN (no_debug_rip_packet_direct, "RIP option set for send packet\n") { int idx_recv_send = 4; - if (strncmp("send", argv[idx_recv_send]->arg, - strlen(argv[idx_recv_send]->arg)) - == 0) { + if (strcmp("send", argv[idx_recv_send]->text) == 0) { if (IS_RIP_DEBUG_RECV) rip_debug_packet &= ~RIP_DEBUG_SEND; else rip_debug_packet = 0; - } else if (strncmp("recv", argv[idx_recv_send]->arg, - strlen(argv[idx_recv_send]->arg)) - == 0) { + } else if (strcmp("recv", argv[idx_recv_send]->text) == 0) { if (IS_RIP_DEBUG_SEND) rip_debug_packet &= ~RIP_DEBUG_RECV; else diff --git a/ripngd/ripng_debug.c b/ripngd/ripng_debug.c index 9ebc302b1b..c8cad23add 100644 --- a/ripngd/ripng_debug.c +++ b/ripngd/ripng_debug.c @@ -94,13 +94,9 @@ DEFUN (debug_ripng_packet_direct, { int idx_recv_send = 3; ripng_debug_packet |= RIPNG_DEBUG_PACKET; - if (strncmp("send", argv[idx_recv_send]->arg, - strlen(argv[idx_recv_send]->arg)) - == 0) + if (strcmp("send", argv[idx_recv_send]->text) == 0) ripng_debug_packet |= RIPNG_DEBUG_SEND; - if (strncmp("recv", argv[idx_recv_send]->arg, - strlen(argv[idx_recv_send]->arg)) - == 0) + if (strcmp("recv", argv[idx_recv_send]->text) == 0) ripng_debug_packet |= RIPNG_DEBUG_RECV; return CMD_SUCCESS; @@ -152,16 +148,12 @@ DEFUN (no_debug_ripng_packet_direct, "Debug option set for send packet\n") { int idx_recv_send = 4; - if (strncmp("send", argv[idx_recv_send]->arg, - strlen(argv[idx_recv_send]->arg)) - == 0) { + if (strcmp("send", argv[idx_recv_send]->text) == 0) { if (IS_RIPNG_DEBUG_RECV) ripng_debug_packet &= ~RIPNG_DEBUG_SEND; else ripng_debug_packet = 0; - } else if (strncmp("recv", argv[idx_recv_send]->arg, - strlen(argv[idx_recv_send]->arg)) - == 0) { + } else if (strcmp("recv", argv[idx_recv_send]->text) == 0) { if (IS_RIPNG_DEBUG_SEND) ripng_debug_packet &= ~RIPNG_DEBUG_RECV; else From 8526b84200a7e733fa507e2805cae4755423d09e Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Thu, 5 Oct 2017 22:38:19 -0300 Subject: [PATCH 3/3] zebra: fix display of negative route metrics and tags Signed-off-by: Renato Westphal --- zebra/zebra_vty.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 04cd17cedb..d86cc88b42 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -455,7 +455,7 @@ static void vty_show_ip_route_detail(struct vty *vty, struct route_node *rn, vty_out(vty, ", distance %u, metric %u", re->distance, re->metric); if (re->tag) - vty_out(vty, ", tag %d", re->tag); + vty_out(vty, ", tag %u", re->tag); if (re->mtu) vty_out(vty, ", mtu %u", re->mtu); if (re->vrf_id != VRF_DEFAULT) { @@ -829,7 +829,7 @@ static void vty_show_ip_route(struct vty *vty, struct route_node *rn, /* Distance and metric display. */ if (re->type != ZEBRA_ROUTE_CONNECT) - len += vty_out(vty, " [%d/%d]", re->distance, + len += vty_out(vty, " [%u/%u]", re->distance, re->metric); } else { vty_out(vty, " %c%*c",