ip: fix crash in "ip neigh show"
No binary (build failed)
—
(log yok)
| @@ -113,7 +113,7 @@ static NOINLINE int print_linkinfo(const struct nlmsghdr *n) | |
| if (G_filter.up && !(ifi->ifi_flags & IFF_UP)) | |
| return 0; | |
| - | memset(tb, 0, sizeof(tb)); |
| + | //memset(tb, 0, sizeof(tb)); - parse_rtattr does this |
| parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), len); | |
| if (tb[IFLA_IFNAME] == NULL) { | |
| bb_error_msg("nil ifname"); | |
| @@ -227,7 +227,7 @@ static int FAST_FUNC print_addrinfo(const struct sockaddr_nl *who UNUSED_PARAM, | |
| if (G_filter.flushb && n->nlmsg_type != RTM_NEWADDR) | |
| return 0; | |
| - | memset(rta_tb, 0, sizeof(rta_tb)); |
| + | //memset(rta_tb, 0, sizeof(rta_tb)); - parse_rtattr does this |
| parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(ifa), n->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa))); | |
| if (!rta_tb[IFA_LOCAL]) | |
| @@ -535,7 +535,7 @@ int FAST_FUNC ipaddr_list_or_flush(char **argv, int flush) | |
| continue; | |
| if (G_filter.pfx.family || G_filter.label) { | |
| struct rtattr *tb[IFA_MAX+1]; | |
| - | memset(tb, 0, sizeof(tb)); |
| + | //memset(tb, 0, sizeof(tb)); - parse_rtattr does this |
| parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), IFA_PAYLOAD(n)); | |
| if (!tb[IFA_LOCAL]) | |
| tb[IFA_LOCAL] = tb[IFA_ADDRESS]; | |
| @@ -110,11 +110,13 @@ static int FAST_FUNC print_neigh(const struct sockaddr_nl *who UNUSED_PARAM, | |
| return 0; | |
| if (G_filter.index && G_filter.index != r->ndm_ifindex) | |
| return 0; | |
| - | if (!(G_filter.state&r->ndm_state) && |
| - | !(r->ndm_flags & NTF_PROXY) && |
| - | (r->ndm_state || !(G_filter.state & 0x100)) && |
| - | (r->ndm_family != AF_DECnet)) |
| + | if (!(G_filter.state&r->ndm_state) |
| + | && !(r->ndm_flags & NTF_PROXY) |
| + | && (r->ndm_state || !(G_filter.state & 0x100)) |
| + | && (r->ndm_family != AF_DECnet) |
| + | ) { |
| return 0; | |
| + | } |
| parse_rtattr(tb, NDA_MAX, NDA_RTA(r), n->nlmsg_len - NLMSG_LENGTH(sizeof(*r))); | |
| @@ -83,7 +83,7 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM, | |
| if (len < 0) | |
| bb_error_msg_and_die("wrong nlmsg len %d", len); | |
| - | memset(tb, 0, sizeof(tb)); |
| + | //memset(tb, 0, sizeof(tb)); - parse_rtattr does this |
| parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len); | |
| #if HAVE_RTA_TABLE | |
| @@ -1081,7 +1081,7 @@ static int iproute_get(char **argv) | |
| bb_error_msg_and_die("wrong len %d", len); | |
| } | |
| - | memset(tb, 0, sizeof(tb)); |
| + | //memset(tb, 0, sizeof(tb)); - parse_rtattr does this |
| parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len); | |
| if (tb[RTA_PREFSRC]) { | |
| @@ -63,7 +63,7 @@ static int FAST_FUNC print_rule(const struct sockaddr_nl *who UNUSED_PARAM, | |
| if (len < 0) | |
| return -1; | |
| - | memset(tb, 0, sizeof(tb)); |
| + | //memset(tb, 0, sizeof(tb)); - parse_rtattr does this |
| parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len); | |
| if (r->rtm_family == AF_INET) | |
| @@ -401,6 +401,8 @@ int FAST_FUNC rta_addattr_l(struct rtattr *rta, int maxlen, int type, void *data | |
| void FAST_FUNC parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len) | |
| { | |
| + | memset(tb, 0, (max + 1) * sizeof(tb[0])); |
| + | |
| while (RTA_OK(rta, len)) { | |
| if (rta->rta_type <= max) { | |
| tb[rta->rta_type] = rta; | |
| @@ -51,7 +51,7 @@ int FAST_FUNC ll_remember_index(const struct sockaddr_nl *who UNUSED_PARAM, | |
| if (n->nlmsg_len < NLMSG_LENGTH(sizeof(ifi))) | |
| return -1; | |
| - | memset(tb, 0, sizeof(tb)); |
| + | //memset(tb, 0, sizeof(tb)); - parse_rtattr does this |
| parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), IFLA_PAYLOAD(n)); | |
| if (tb[IFLA_IFNAME] == NULL) | |
| return 0; | |
| @@ -66,17 +66,21 @@ enum | |
| /* nullifies tb on error */ | |
| #define __parse_rtattr_nested_compat(tb, max, rta, len) \ | |
| - | ({if ((RTA_PAYLOAD(rta) >= len) && \ |
| - | (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr))) { \ |
| - | rta = RTA_DATA(rta) + RTA_ALIGN(len); \ |
| - | parse_rtattr_nested(tb, max, rta); \ |
| - | } else \ |
| - | memset(tb, 0, sizeof(struct rtattr *) * (max + 1)); \ |
| - | }) |
| + | ({ \ |
| + | if ((RTA_PAYLOAD(rta) >= len) \ |
| + | && (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr)) \ |
| + | ) { \ |
| + | rta = RTA_DATA(rta) + RTA_ALIGN(len); \ |
| + | parse_rtattr_nested(tb, max, rta); \ |
| + | } else \ |
| + | memset(tb, 0, sizeof(struct rtattr *) * (max + 1)); \ |
| + | }) |
| #define parse_rtattr_nested_compat(tb, max, rta, data, len) \ | |
| - | ({data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ |
| - | __parse_rtattr_nested_compat(tb, max, rta, len); }) |
| + | ({ \ |
| + | data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ |
| + | __parse_rtattr_nested_compat(tb, max, rta, len); \ |
| + | }) |
| #define show_details (0) /* not implemented. Does anyone need it? */ | |
| #define use_iec (0) /* not currently documented in the upstream manpage */ | |