diff --git a/lib/filter.c b/lib/filter.c index 46e0bbe804..2b9ba87137 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -1335,25 +1335,9 @@ filter_set_zebra (struct vty *vty, const char *name_str, const char *type_str, return CMD_SUCCESS; } -/* Zebra access-list */ -DEFUN (access_list, - access_list_cmd, - "access-list WORD A.B.C.D/M", - "Add an access list entry\n" - "IP zebra access-list name\n" - "Specify packets to reject\n" - "Specify packets to forward\n" - "Prefix to match. e.g. 10.0.0.0/8\n") -{ - int idx_word = 1; - int idx_permit_deny = 2; - int idx_ipv4_prefixlen = 3; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, 0, 1); -} - DEFUN (access_list_exact, access_list_exact_cmd, - "access-list WORD A.B.C.D/M exact-match", + "access-list WORD A.B.C.D/M [exact-match]", "Add an access list entry\n" "IP zebra access-list name\n" "Specify packets to reject\n" @@ -1361,10 +1345,18 @@ DEFUN (access_list_exact, "Prefix to match. e.g. 10.0.0.0/8\n" "Exact match of the prefixes\n") { + int idx; + int exact = 0; int idx_word = 1; int idx_permit_deny = 2; int idx_ipv4_prefixlen = 3; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, 1, 1); + idx = idx_ipv4_prefixlen; + + if (argv_find (argv, argc, "exact-match", &idx)) + exact = 1; + + return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, + AFI_IP, argv[idx_ipv4_prefixlen]->arg, exact, 1); } DEFUN (access_list_any, @@ -1381,25 +1373,9 @@ DEFUN (access_list_any, return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, "0.0.0.0/0", 0, 1); } -DEFUN (no_access_list, - no_access_list_cmd, - "no access-list WORD A.B.C.D/M", - NO_STR - "Add an access list entry\n" - "IP zebra access-list name\n" - "Specify packets to reject\n" - "Specify packets to forward\n" - "Prefix to match. e.g. 10.0.0.0/8\n") -{ - int idx_word = 2; - int idx_permit_deny = 3; - int idx_ipv4_prefixlen = 4; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, 0, 0); -} - DEFUN (no_access_list_exact, no_access_list_exact_cmd, - "no access-list WORD A.B.C.D/M exact-match", + "no access-list WORD A.B.C.D/M [exact-match]", NO_STR "Add an access list entry\n" "IP zebra access-list name\n" @@ -1408,10 +1384,17 @@ DEFUN (no_access_list_exact, "Prefix to match. e.g. 10.0.0.0/8\n" "Exact match of the prefixes\n") { + int idx; + int exact = 0; int idx_word = 2; int idx_permit_deny = 3; int idx_ipv4_prefixlen = 4; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, 1, 0); + idx = idx_ipv4_prefixlen; + + if (argv_find (argv, argc, "exact-match", &idx)) + exact = 1; + + return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP, argv[idx_ipv4_prefixlen]->arg, exact, 0); } DEFUN (no_access_list_any, @@ -1526,27 +1509,10 @@ DEFUN (no_access_list_remark_comment, { return no_access_list_remark (self, vty, argc, argv); } - - -DEFUN (ipv6_access_list, - ipv6_access_list_cmd, - "ipv6 access-list WORD X:X::X:X/M", - IPV6_STR - "Add an access list entry\n" - "IPv6 zebra access-list\n" - "Specify packets to reject\n" - "Specify packets to forward\n" - "IPv6 prefix\n") -{ - int idx = 0; - char *alname = argv_find (argv, argc, "WORD", &idx) ? argv[idx]->arg : NULL; - char *prefix = argv_find (argv, argc, "X:X::X:X/M", &idx) ? argv[idx]->arg : NULL; - return filter_set_zebra (vty, alname, argv[3]->text, AFI_IP6, prefix, 0, 1); -} DEFUN (ipv6_access_list_exact, ipv6_access_list_exact_cmd, - "ipv6 access-list WORD X:X::X:X/M exact-match", + "ipv6 access-list WORD X:X::X:X/M [exact-match]", IPV6_STR "Add an access list entry\n" "IPv6 zebra access-list\n" @@ -1555,10 +1521,18 @@ DEFUN (ipv6_access_list_exact, "IPv6 prefix\n" "Exact match of the prefixes\n") { - int idx = 0; - char *alname = argv_find (argv, argc, "WORD", &idx) ? argv[idx]->arg : NULL; - char *prefix = argv_find (argv, argc, "X:X::X:X/M", &idx) ? argv[idx]->arg : NULL; - return filter_set_zebra (vty, alname, argv[3]->text, AFI_IP6, prefix, 1, 1); + int idx; + int exact = 0; + int idx_word = 2; + int idx_allow = 3; + int idx_addr = 4; + idx = idx_addr; + + if (argv_find (argv, argc, "exact-match", &idx)) + exact = 1; + + return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_allow]->text, + AFI_IP6, argv[idx_addr]->arg, exact, 1); } DEFUN (ipv6_access_list_any, @@ -1576,26 +1550,9 @@ DEFUN (ipv6_access_list_any, return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP6, "::/0", 0, 1); } -DEFUN (no_ipv6_access_list, - no_ipv6_access_list_cmd, - "no ipv6 access-list WORD X:X::X:X/M", - NO_STR - IPV6_STR - "Add an access list entry\n" - "IPv6 zebra access-list\n" - "Specify packets to reject\n" - "Specify packets to forward\n" - "Prefix to match. e.g. 3ffe:506::/32\n") -{ - int idx_word = 3; - int idx_permit_deny = 4; - int idx_ipv6_prefixlen = 5; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP6, argv[idx_ipv6_prefixlen]->arg, 0, 0); -} - DEFUN (no_ipv6_access_list_exact, no_ipv6_access_list_exact_cmd, - "no ipv6 access-list WORD X:X::X:X/M exact-match", + "no ipv6 access-list WORD X:X::X:X/M [exact-match]", NO_STR IPV6_STR "Add an access list entry\n" @@ -1605,10 +1562,18 @@ DEFUN (no_ipv6_access_list_exact, "Prefix to match. e.g. 3ffe:506::/32\n" "Exact match of the prefixes\n") { + int idx; + int exact = 0; int idx_word = 3; int idx_permit_deny = 4; int idx_ipv6_prefixlen = 5; - return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, AFI_IP6, argv[idx_ipv6_prefixlen]->arg, 1, 0); + idx = idx_ipv6_prefixlen; + + if (argv_find (argv, argc, "exact-match", &idx)) + exact = 1; + + return filter_set_zebra (vty, argv[idx_word]->arg, argv[idx_permit_deny]->arg, + AFI_IP6, argv[idx_ipv6_prefixlen]->arg, exact, 0); } DEFUN (no_ipv6_access_list_any, @@ -2059,10 +2024,8 @@ access_list_init_ipv4 (void) install_element (ENABLE_NODE, &show_ip_access_list_name_cmd); /* Zebra access-list */ - install_element (CONFIG_NODE, &access_list_cmd); install_element (CONFIG_NODE, &access_list_exact_cmd); install_element (CONFIG_NODE, &access_list_any_cmd); - install_element (CONFIG_NODE, &no_access_list_cmd); install_element (CONFIG_NODE, &no_access_list_exact_cmd); install_element (CONFIG_NODE, &no_access_list_any_cmd); @@ -2152,11 +2115,9 @@ access_list_init_ipv6 (void) install_element (ENABLE_NODE, &show_ipv6_access_list_cmd); install_element (ENABLE_NODE, &show_ipv6_access_list_name_cmd); - install_element (CONFIG_NODE, &ipv6_access_list_cmd); install_element (CONFIG_NODE, &ipv6_access_list_exact_cmd); install_element (CONFIG_NODE, &ipv6_access_list_any_cmd); install_element (CONFIG_NODE, &no_ipv6_access_list_exact_cmd); - install_element (CONFIG_NODE, &no_ipv6_access_list_cmd); install_element (CONFIG_NODE, &no_ipv6_access_list_any_cmd); install_element (CONFIG_NODE, &no_ipv6_access_list_all_cmd); diff --git a/lib/if.c b/lib/if.c index 20f792b8f8..6ee84e126c 100644 --- a/lib/if.c +++ b/lib/if.c @@ -374,7 +374,7 @@ if_lookup_exact_address_vrf (void *src, int family, vrf_id_t vrf_id) } else if (family == AF_INET6) { - if (IPV6_ADDR_SAME (&p->u.prefix4, (struct in6_addr *)src)) + if (IPV6_ADDR_SAME (&p->u.prefix6, (struct in6_addr *)src)) return ifp; } } diff --git a/lib/ptm_lib.c b/lib/ptm_lib.c index 0666797fad..a93d7b8476 100644 --- a/lib/ptm_lib.c +++ b/lib/ptm_lib.c @@ -458,7 +458,7 @@ ptm_lib_register(char *client_name, hdl = calloc(1, sizeof(*hdl)); if (hdl) { - strcpy(hdl->client_name, client_name); + strncpy(hdl->client_name, client_name, PTMLIB_MAXNAMELEN - 1); hdl->cmd_cb = cmd_cb; hdl->notify_cb = notify_cb; hdl->response_cb = response_cb; diff --git a/lib/thread.c b/lib/thread.c index de7066bb82..28245d11a2 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -719,7 +719,7 @@ funcname_thread_add_read_write (int dir, struct thread_master *m, #else if (FD_ISSET (fd, fdset)) { - zlog (NULL, LOG_WARNING, "There is already %s fd [%d]", (dir = THREAD_READ) ? "read" : "write", fd); + zlog (NULL, LOG_WARNING, "There is already %s fd [%d]", (dir == THREAD_READ) ? "read" : "write", fd); return NULL; } diff --git a/lib/vty.c b/lib/vty.c index b6f493b6c9..2660ca3251 100644 --- a/lib/vty.c +++ b/lib/vty.c @@ -2230,7 +2230,7 @@ void vty_close (struct vty *vty) { int i; - bool was_stdio; + bool was_stdio = false; /* Cancel threads.*/ if (vty->t_read) diff --git a/lib/zclient.c b/lib/zclient.c index 92662fd70f..cea4b098fc 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -1146,11 +1146,15 @@ struct interface * zebra_interface_link_params_read (struct stream *s) { struct if_link_params *iflp; - uint32_t ifindex = stream_getl (s); + ifindex_t ifindex; + + assert (s); + + ifindex = stream_getl (s); struct interface *ifp = if_lookup_by_index (ifindex); - if (ifp == NULL || s == NULL) + if (ifp == NULL) { zlog_err ("%s: unknown ifindex %u, shouldn't happen", __func__, ifindex); diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 7e85253f9a..7f276b22ce 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -1374,8 +1374,8 @@ pim_show_state(struct vty *vty, const char *src_or_group, const char *group, u_c for (ALL_LIST_ELEMENTS_RO(pim_channel_oil_list, node, c_oil)) { char grp_str[INET_ADDRSTRLEN]; char src_str[INET_ADDRSTRLEN]; - char in_ifname[16]; - char out_ifname[16]; + char in_ifname[INTERFACE_NAMSIZ+1]; + char out_ifname[INTERFACE_NAMSIZ+1]; int oif_vif_index; struct interface *ifp_in; first_oif = 1; @@ -3036,8 +3036,8 @@ static void show_mroute(struct vty *vty, u_char uj) for (ALL_LIST_ELEMENTS_RO(qpim_static_route_list, node, s_route)) { char grp_str[INET_ADDRSTRLEN]; char src_str[INET_ADDRSTRLEN]; - char in_ifname[16]; - char out_ifname[16]; + char in_ifname[INTERFACE_NAMSIZ+1]; + char out_ifname[INTERFACE_NAMSIZ+1]; int oif_vif_index; struct interface *ifp_in; char proto[100]; @@ -4871,7 +4871,7 @@ DEFUN (debug_pim_packets, DEBUG_PIM_J_P_PACKETS_STR DEBUG_PIM_PIM_REG_PACKETS_STR) { - int idx; + int idx = 0; if (argv_find (argv, argc, "hello", &idx)) { PIM_DO_DEBUG_PIM_HELLO; diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 490a05be37..29b4e8a63b 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -132,6 +132,7 @@ pim_register_stop_recv (uint8_t *buf, int buf_size) upstream->join_state = PIM_UPSTREAM_PRUNE; pim_channel_del_oif (upstream->channel_oil, pim_regiface, PIM_OIF_FLAG_PROTO_PIM); pim_upstream_start_register_stop_timer (upstream, 0); + break; case PIM_UPSTREAM_JOIN_PENDING: upstream->join_state = PIM_UPSTREAM_PRUNE; pim_upstream_start_register_stop_timer (upstream, 0); @@ -152,10 +153,9 @@ pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct if (PIM_DEBUG_PIM_REG) { - char rp_str[INET_ADDRSTRLEN]; - strcpy (rp_str, inet_ntoa (rpg->rpf_addr.u.prefix4)); zlog_debug ("Sending %s %sRegister Packet to %s", - up->sg_str, null_register ? "NULL " : "", rp_str); + up->sg_str, null_register ? "NULL " : "", + inet_ntoa (rpg->rpf_addr.u.prefix4)); } ifp = rpg->source_nexthop.interface; diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c index 11cd61b592..df0095d29e 100644 --- a/pimd/pim_sock.c +++ b/pimd/pim_sock.c @@ -139,6 +139,7 @@ int pim_socket_mcast(int protocol, struct in_addr ifaddr, int ifindex, u_char lo ret = pim_socket_bind (fd, ifp); if (ret) { + close (fd); zlog_warn("Could not set fd: %d for interface: %s to device", fd, ifp->name); return PIM_SOCK_ERR_BIND; diff --git a/ripd/rip_interface.c b/ripd/rip_interface.c index 9f8b279eb8..772ba49f93 100644 --- a/ripd/rip_interface.c +++ b/ripd/rip_interface.c @@ -585,24 +585,26 @@ rip_if_down(struct interface *ifp) struct list *list = NULL; struct listnode *listnode = NULL, *nextnode = NULL; if (rip) - for (rp = route_top (rip->table); rp; rp = route_next (rp)) - if ((list = rp->info) != NULL) - for (ALL_LIST_ELEMENTS (list, listnode, nextnode, rinfo)) - if (rinfo->ifindex == ifp->ifindex) - rip_ecmp_delete (rinfo); + { + for (rp = route_top (rip->table); rp; rp = route_next (rp)) + if ((list = rp->info) != NULL) + for (ALL_LIST_ELEMENTS (list, listnode, nextnode, rinfo)) + if (rinfo->ifindex == ifp->ifindex) + rip_ecmp_delete (rinfo); - ri = ifp->info; + ri = ifp->info; - if (ri->running) - { - if (IS_RIP_DEBUG_EVENT) - zlog_debug ("turn off %s", ifp->name); + if (ri->running) + { + if (IS_RIP_DEBUG_EVENT) + zlog_debug ("turn off %s", ifp->name); - /* Leave from multicast group. */ - rip_multicast_leave (ifp, rip->sock); + /* Leave from multicast group. */ + rip_multicast_leave (ifp, rip->sock); - ri->running = 0; - } + ri->running = 0; + } + } return 0; } diff --git a/zebra/zserv.c b/zebra/zserv.c index 6d53c00b29..37c048f627 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -92,6 +92,7 @@ zserv_flush_data(struct thread *thread) zlog_warn("%s: buffer_flush_available failed on zserv client fd %d, " "closing", __func__, client->sock); zebra_client_close(client); + client = NULL; break; case BUFFER_PENDING: client->t_write = thread_add_write(zebrad.master, zserv_flush_data, @@ -101,7 +102,8 @@ zserv_flush_data(struct thread *thread) break; } - client->last_write_time = monotime(NULL); + if (client) + client->last_write_time = monotime(NULL); return 0; }