* [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths
@ 2026-03-26 3:44 Yang Yang
2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Yang Yang @ 2026-03-26 3:44 UTC (permalink / raw)
To: davem, edumazet, kuba, pabeni, razor, idosch
Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb,
netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98,
bird, n05ec
Hi,
This series hardens ND option parsing in bridge and vxlan paths.
Patch 1 linearizes the request skb in br_nd_send() before walking ND
options. Patch 2 adds explicit ND option length validation in
br_nd_send(). Patch 3 adds matching ND option length validation in
vxlan_na_create().
Thanks.
Yang Yang (3):
bridge: br_nd_send: linearize skb before parsing ND options
bridge: br_nd_send: validate ND option lengths
vxlan: validate ND option lengths in vxlan_na_create
drivers/net/vxlan/vxlan_core.c | 6 ++++--
net/bridge/br_arp_nd_proxy.c | 18 +++++++++++-------
2 files changed, 15 insertions(+), 9 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options 2026-03-26 3:44 [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths Yang Yang @ 2026-03-26 3:44 ` Yang Yang 2026-03-26 16:29 ` Ido Schimmel 2026-03-27 6:37 ` Nikolay Aleksandrov 2026-03-26 3:44 ` [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths Yang Yang 2026-03-26 3:44 ` [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create Yang Yang 2 siblings, 2 replies; 10+ messages in thread From: Yang Yang @ 2026-03-26 3:44 UTC (permalink / raw) To: davem, edumazet, kuba, pabeni, razor, idosch Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb, netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird, n05ec br_nd_send() parses neighbour discovery options from ns->opt[] and assumes that these options are in the linear part of request. Its callers only guarantee that the ICMPv6 header and target address are available, so the option area can still be non-linear. Parsing ns->opt[] in that case can access data past the linear buffer. Linearize request before option parsing and derive ns from the linear network header. Fixes: ed842faeb2bd ("bridge: suppress nd pkts on BR_NEIGH_SUPPRESS ports") 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> --- net/bridge/br_arp_nd_proxy.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/net/bridge/br_arp_nd_proxy.c b/net/bridge/br_arp_nd_proxy.c index 1e2b51769eec8..af3d1e33f50b8 100644 --- a/net/bridge/br_arp_nd_proxy.c +++ b/net/bridge/br_arp_nd_proxy.c @@ -251,12 +251,12 @@ struct nd_msg *br_is_nd_neigh_msg(const struct sk_buff *skb, struct nd_msg *msg) static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p, struct sk_buff *request, struct neighbour *n, - __be16 vlan_proto, u16 vlan_tci, struct nd_msg *ns) + __be16 vlan_proto, u16 vlan_tci) { struct net_device *dev = request->dev; struct net_bridge_vlan_group *vg; + struct nd_msg *na, *ns; struct sk_buff *reply; - struct nd_msg *na; struct ipv6hdr *pip6; int na_olen = 8; /* opt hdr + ETH_ALEN for target */ int ns_olen; @@ -264,7 +264,7 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p, u8 *daddr; u16 pvid; - if (!dev) + if (!dev || skb_linearize(request)) return; len = LL_RESERVED_SPACE(dev) + sizeof(struct ipv6hdr) + @@ -281,6 +281,8 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p, skb_set_mac_header(reply, 0); daddr = eth_hdr(request)->h_source; + ns = (struct nd_msg *)(skb_network_header(request) + + sizeof(struct ipv6hdr)); /* Do we need option processing ? */ ns_olen = request->len - (skb_network_offset(request) + @@ -472,9 +474,9 @@ void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br, if (vid != 0) br_nd_send(br, p, skb, n, skb->vlan_proto, - skb_vlan_tag_get(skb), msg); + skb_vlan_tag_get(skb)); else - br_nd_send(br, p, skb, n, 0, 0, msg); + br_nd_send(br, p, skb, n, 0, 0); replied = true; } -- 2.43.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options 2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang @ 2026-03-26 16:29 ` Ido Schimmel 2026-03-27 6:37 ` Nikolay Aleksandrov 1 sibling, 0 replies; 10+ messages in thread From: Ido Schimmel @ 2026-03-26 16:29 UTC (permalink / raw) To: Yang Yang Cc: davem, edumazet, kuba, pabeni, razor, andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb, netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird On Thu, Mar 26, 2026 at 03:44:39AM +0000, Yang Yang wrote: > br_nd_send() parses neighbour discovery options from ns->opt[] and > assumes that these options are in the linear part of request. > > Its callers only guarantee that the ICMPv6 header and target address > are available, so the option area can still be non-linear. Parsing > ns->opt[] in that case can access data past the linear buffer. > > Linearize request before option parsing and derive ns from the linear > network header. > > Fixes: ed842faeb2bd ("bridge: suppress nd pkts on BR_NEIGH_SUPPRESS ports") > 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> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options 2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang 2026-03-26 16:29 ` Ido Schimmel @ 2026-03-27 6:37 ` Nikolay Aleksandrov 1 sibling, 0 replies; 10+ messages in thread From: Nikolay Aleksandrov @ 2026-03-27 6:37 UTC (permalink / raw) To: Yang Yang, davem, edumazet, kuba, pabeni, idosch Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb, netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird On 26/03/2026 05:44, Yang Yang wrote: > br_nd_send() parses neighbour discovery options from ns->opt[] and > assumes that these options are in the linear part of request. > > Its callers only guarantee that the ICMPv6 header and target address > are available, so the option area can still be non-linear. Parsing > ns->opt[] in that case can access data past the linear buffer. > > Linearize request before option parsing and derive ns from the linear > network header. > > Fixes: ed842faeb2bd ("bridge: suppress nd pkts on BR_NEIGH_SUPPRESS ports") > 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> > --- > net/bridge/br_arp_nd_proxy.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/net/bridge/br_arp_nd_proxy.c b/net/bridge/br_arp_nd_proxy.c > index 1e2b51769eec8..af3d1e33f50b8 100644 > --- a/net/bridge/br_arp_nd_proxy.c > +++ b/net/bridge/br_arp_nd_proxy.c > @@ -251,12 +251,12 @@ struct nd_msg *br_is_nd_neigh_msg(const struct sk_buff *skb, struct nd_msg *msg) > > static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p, > struct sk_buff *request, struct neighbour *n, > - __be16 vlan_proto, u16 vlan_tci, struct nd_msg *ns) > + __be16 vlan_proto, u16 vlan_tci) > { > struct net_device *dev = request->dev; > struct net_bridge_vlan_group *vg; > + struct nd_msg *na, *ns; > struct sk_buff *reply; > - struct nd_msg *na; > struct ipv6hdr *pip6; > int na_olen = 8; /* opt hdr + ETH_ALEN for target */ > int ns_olen; > @@ -264,7 +264,7 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p, > u8 *daddr; > u16 pvid; > > - if (!dev) > + if (!dev || skb_linearize(request)) > return; > > len = LL_RESERVED_SPACE(dev) + sizeof(struct ipv6hdr) + > @@ -281,6 +281,8 @@ static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p, > skb_set_mac_header(reply, 0); > > daddr = eth_hdr(request)->h_source; > + ns = (struct nd_msg *)(skb_network_header(request) + > + sizeof(struct ipv6hdr)); > > /* Do we need option processing ? */ > ns_olen = request->len - (skb_network_offset(request) + > @@ -472,9 +474,9 @@ void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br, > if (vid != 0) > br_nd_send(br, p, skb, n, > skb->vlan_proto, > - skb_vlan_tag_get(skb), msg); > + skb_vlan_tag_get(skb)); > else > - br_nd_send(br, p, skb, n, 0, 0, msg); > + br_nd_send(br, p, skb, n, 0, 0); > replied = true; > } > Acked-by: Nikolay Aleksandrov <razor@blackwall.org> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths 2026-03-26 3:44 [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths Yang Yang 2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang @ 2026-03-26 3:44 ` Yang Yang 2026-03-26 16:30 ` Ido Schimmel 2026-03-27 6:37 ` Nikolay Aleksandrov 2026-03-26 3:44 ` [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create Yang Yang 2 siblings, 2 replies; 10+ messages in thread From: Yang Yang @ 2026-03-26 3:44 UTC (permalink / raw) To: davem, edumazet, kuba, pabeni, razor, idosch Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb, netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird, n05ec 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: ed842faeb2bd ("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> --- net/bridge/br_arp_nd_proxy.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/net/bridge/br_arp_nd_proxy.c b/net/bridge/br_arp_nd_proxy.c index af3d1e33f50b8..6b5595868a39c 100644 --- a/net/bridge/br_arp_nd_proxy.c +++ b/net/bridge/br_arp_nd_proxy.c @@ -288,12 +288,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; } } -- 2.43.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths 2026-03-26 3:44 ` [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths Yang Yang @ 2026-03-26 16:30 ` Ido Schimmel 2026-03-27 6:37 ` Nikolay Aleksandrov 1 sibling, 0 replies; 10+ messages in thread From: Ido Schimmel @ 2026-03-26 16:30 UTC (permalink / raw) To: Yang Yang Cc: davem, edumazet, kuba, pabeni, razor, andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb, netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird On Thu, Mar 26, 2026 at 03:44:40AM +0000, Yang Yang wrote: > 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: ed842faeb2bd ("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> The AI review [1] is correct that the length check for the ND_OPT_SOURCE_LL_ADDR option is not strictly necessary, but it makes it clear that the access is valid and it's harmless. The other comment is about another existing issue in the code, but it's less severe and shouldn't delay this patch. [1] https://sashiko.dev/#/patchset/20260326034441.2037420-1-n05ec%40lzu.edu.cn ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths 2026-03-26 3:44 ` [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths Yang Yang 2026-03-26 16:30 ` Ido Schimmel @ 2026-03-27 6:37 ` Nikolay Aleksandrov 1 sibling, 0 replies; 10+ messages in thread From: Nikolay Aleksandrov @ 2026-03-27 6:37 UTC (permalink / raw) To: Yang Yang, davem, edumazet, kuba, pabeni, idosch Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb, netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird On 26/03/2026 05:44, Yang Yang wrote: > 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: ed842faeb2bd ("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> > --- > net/bridge/br_arp_nd_proxy.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/net/bridge/br_arp_nd_proxy.c b/net/bridge/br_arp_nd_proxy.c > index af3d1e33f50b8..6b5595868a39c 100644 > --- a/net/bridge/br_arp_nd_proxy.c > +++ b/net/bridge/br_arp_nd_proxy.c > @@ -288,12 +288,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; > } > } Acked-by: Nikolay Aleksandrov <razor@blackwall.org> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create 2026-03-26 3:44 [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths Yang Yang 2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang 2026-03-26 3:44 ` [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths Yang Yang @ 2026-03-26 3:44 ` Yang Yang 2026-03-26 16:30 ` Ido Schimmel 2026-03-27 6:38 ` Nikolay Aleksandrov 2 siblings, 2 replies; 10+ messages in thread From: Yang Yang @ 2026-03-26 3:44 UTC (permalink / raw) To: davem, edumazet, kuba, pabeni, razor, idosch Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb, netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird, n05ec vxlan_na_create() 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: 4b29dba9c085 ("vxlan: fix nonfunctional neigh_reduce()") 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> --- drivers/net/vxlan/vxlan_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c index 17c941aac32db..a94ac82a61364 100644 --- a/drivers/net/vxlan/vxlan_core.c +++ b/drivers/net/vxlan/vxlan_core.c @@ -1965,12 +1965,14 @@ static struct sk_buff *vxlan_na_create(struct sk_buff *request, 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 NULL; } 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; } } -- 2.43.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create 2026-03-26 3:44 ` [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create Yang Yang @ 2026-03-26 16:30 ` Ido Schimmel 2026-03-27 6:38 ` Nikolay Aleksandrov 1 sibling, 0 replies; 10+ messages in thread From: Ido Schimmel @ 2026-03-26 16:30 UTC (permalink / raw) To: Yang Yang Cc: davem, edumazet, kuba, pabeni, razor, andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb, netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird On Thu, Mar 26, 2026 at 03:44:41AM +0000, Yang Yang wrote: > vxlan_na_create() 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: 4b29dba9c085 ("vxlan: fix nonfunctional neigh_reduce()") > 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> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create 2026-03-26 3:44 ` [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create Yang Yang 2026-03-26 16:30 ` Ido Schimmel @ 2026-03-27 6:38 ` Nikolay Aleksandrov 1 sibling, 0 replies; 10+ messages in thread From: Nikolay Aleksandrov @ 2026-03-27 6:38 UTC (permalink / raw) To: Yang Yang, davem, edumazet, kuba, pabeni, idosch Cc: andrew+netdev, horms, florian.fainelli, roopa, dlstevens, nb, netdev, bridge, linux-kernel, yifanwucs, tomapufckgml, tanyuan98, bird On 26/03/2026 05:44, Yang Yang wrote: > vxlan_na_create() 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: 4b29dba9c085 ("vxlan: fix nonfunctional neigh_reduce()") > 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> > --- > drivers/net/vxlan/vxlan_core.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c > index 17c941aac32db..a94ac82a61364 100644 > --- a/drivers/net/vxlan/vxlan_core.c > +++ b/drivers/net/vxlan/vxlan_core.c > @@ -1965,12 +1965,14 @@ static struct sk_buff *vxlan_na_create(struct sk_buff *request, > 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 NULL; > } > 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; > } > } Acked-by: Nikolay Aleksandrov <razor@blackwall.org> ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-03-27 6:38 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-03-26 3:44 [PATCH net 0/3] bridge/vxlan: harden ND option parsing paths Yang Yang 2026-03-26 3:44 ` [PATCH net 1/3] bridge: br_nd_send: linearize skb before parsing ND options Yang Yang 2026-03-26 16:29 ` Ido Schimmel 2026-03-27 6:37 ` Nikolay Aleksandrov 2026-03-26 3:44 ` [PATCH net 2/3] bridge: br_nd_send: validate ND option lengths Yang Yang 2026-03-26 16:30 ` Ido Schimmel 2026-03-27 6:37 ` Nikolay Aleksandrov 2026-03-26 3:44 ` [PATCH net 3/3] vxlan: validate ND option lengths in vxlan_na_create Yang Yang 2026-03-26 16:30 ` Ido Schimmel 2026-03-27 6:38 ` Nikolay Aleksandrov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox