mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-07-08 18:13:59 +02:00
bridge: br_nd_send: validate ND option lengths
commit850837965aupstream. br_nd_send() walks ND options according to option-provided lengths. A malformed option can make the parser advance beyond the computed option span or use a too-short source LLADDR option payload. Validate option lengths against the remaining NS option area before advancing, and only read source LLADDR when the option is large enough for an Ethernet address. Fixes:ed842faeb2("bridge: suppress nd pkts on BR_NEIGH_SUPPRESS ports") Cc: stable@vger.kernel.org Reported-by: Yifan Wu <yifanwucs@gmail.com> Reported-by: Juefei Pu <tomapufckgml@gmail.com> Tested-by: Ao Zhou <n05ec@lzu.edu.cn> Co-developed-by: Yuan Tan <tanyuan98@outlook.com> Signed-off-by: Yuan Tan <tanyuan98@outlook.com> Suggested-by: Xin Liu <bird@lzu.edu.cn> Signed-off-by: Yang Yang <n05ec@lzu.edu.cn> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Acked-by: Nikolay Aleksandrov <razor@blackwall.org> Link: https://patch.msgid.link/20260326034441.2037420-3-n05ec@lzu.edu.cn Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0b7f1d1352
commit
c49b9256bb
@@ -285,12 +285,14 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p,
|
||||
ns_olen = request->len - (skb_network_offset(request) +
|
||||
sizeof(struct ipv6hdr)) - sizeof(*ns);
|
||||
for (i = 0; i < ns_olen - 1; i += (ns->opt[i + 1] << 3)) {
|
||||
if (!ns->opt[i + 1]) {
|
||||
if (!ns->opt[i + 1] || i + (ns->opt[i + 1] << 3) > ns_olen) {
|
||||
kfree_skb(reply);
|
||||
return;
|
||||
}
|
||||
if (ns->opt[i] == ND_OPT_SOURCE_LL_ADDR) {
|
||||
daddr = ns->opt + i + sizeof(struct nd_opt_hdr);
|
||||
if ((ns->opt[i + 1] << 3) >=
|
||||
sizeof(struct nd_opt_hdr) + ETH_ALEN)
|
||||
daddr = ns->opt + i + sizeof(struct nd_opt_hdr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user