diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-08 08:42:37 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-08 08:42:37 +0100 |
commit | 68ae54243cacee6beeb69842c7d562435acd5ad1 (patch) | |
tree | 0991e9bfa88bcdff63be362ad62627aacf532b37 /networking/tc.c | |
parent | 237a900bc5654c865298b33a70dee60e2cd05dbc (diff) | |
download | busybox-w32-68ae54243cacee6beeb69842c7d562435acd5ad1.tar.gz busybox-w32-68ae54243cacee6beeb69842c7d562435acd5ad1.tar.bz2 busybox-w32-68ae54243cacee6beeb69842c7d562435acd5ad1.zip |
ip: fix crash in "ip neigh show"
parse_rtattr() was using tb[] array without initializing it.
Based on patch by Balaji Punnuru <balaji_punnuru@cable.comcast.com>
function old new delta
parse_rtattr 85 107 +22
print_route 1630 1617 -13
print_linkinfo 807 794 -13
iproute_get 835 822 -13
print_rule 680 665 -15
ll_remember_index 263 248 -15
print_addrinfo 1223 1197 -26
ipaddr_list_or_flush 1253 1223 -30
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/7 up/down: 22/-125) Total: -103 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/tc.c')
-rw-r--r-- | networking/tc.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/networking/tc.c b/networking/tc.c index 4e375a066..4fa3e47bf 100644 --- a/networking/tc.c +++ b/networking/tc.c | |||
@@ -66,17 +66,21 @@ enum | |||
66 | 66 | ||
67 | /* nullifies tb on error */ | 67 | /* nullifies tb on error */ |
68 | #define __parse_rtattr_nested_compat(tb, max, rta, len) \ | 68 | #define __parse_rtattr_nested_compat(tb, max, rta, len) \ |
69 | ({if ((RTA_PAYLOAD(rta) >= len) && \ | 69 | ({ \ |
70 | (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr))) { \ | 70 | if ((RTA_PAYLOAD(rta) >= len) \ |
71 | rta = RTA_DATA(rta) + RTA_ALIGN(len); \ | 71 | && (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr)) \ |
72 | parse_rtattr_nested(tb, max, rta); \ | 72 | ) { \ |
73 | } else \ | 73 | rta = RTA_DATA(rta) + RTA_ALIGN(len); \ |
74 | memset(tb, 0, sizeof(struct rtattr *) * (max + 1)); \ | 74 | parse_rtattr_nested(tb, max, rta); \ |
75 | }) | 75 | } else \ |
76 | memset(tb, 0, sizeof(struct rtattr *) * (max + 1)); \ | ||
77 | }) | ||
76 | 78 | ||
77 | #define parse_rtattr_nested_compat(tb, max, rta, data, len) \ | 79 | #define parse_rtattr_nested_compat(tb, max, rta, data, len) \ |
78 | ({data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ | 80 | ({ \ |
79 | __parse_rtattr_nested_compat(tb, max, rta, len); }) | 81 | data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ |
82 | __parse_rtattr_nested_compat(tb, max, rta, len); \ | ||
83 | }) | ||
80 | 84 | ||
81 | #define show_details (0) /* not implemented. Does anyone need it? */ | 85 | #define show_details (0) /* not implemented. Does anyone need it? */ |
82 | #define use_iec (0) /* not currently documented in the upstream manpage */ | 86 | #define use_iec (0) /* not currently documented in the upstream manpage */ |