diff options
| author | Kevin Bowling <kbowling@FreeBSD.org> | 2026-07-28 11:06:23 +0000 |
|---|---|---|
| committer | Kevin Bowling <kbowling@FreeBSD.org> | 2026-07-31 10:56:15 +0000 |
| commit | 6020de5ad154d54c8b9a838f28612c2182330c67 (patch) | |
| tree | 2cf7b2c51ddcf2fa2b7d394de3ef8a455c2f88de | |
| parent | 2a678cfeb5838978ef3a1907c686142d03237e15 (diff) | |
ixv: fix multicast address enumeration
if_foreach_llmaddr() adds each callback return value to its running
count. Returning the incremented count made the address indices grow
as 0, 1, 3, 7, and so on, eventually writing beyond the multicast
address array.
Return one address per callback and stop copying when the array is
full, matching the ixv-1.6.12 driver.
Fixes: ff06a8dbb677 ("Mechanically convert ixgbe(4) to IfAPI")
MFC after: 1 week
| -rw-r--r-- | sys/dev/ixgbe/if_ixv.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/dev/ixgbe/if_ixv.c b/sys/dev/ixgbe/if_ixv.c index 8a1c1aae041d..24e6fa714a7b 100644 --- a/sys/dev/ixgbe/if_ixv.c +++ b/sys/dev/ixgbe/if_ixv.c @@ -842,11 +842,14 @@ ixv_negotiate_api(struct ixgbe_softc *sc) static u_int ixv_if_multi_set_cb(void *cb_arg, struct sockaddr_dl *addr, u_int cnt) { + if (cnt >= MAX_NUM_MULTICAST_ADDRESSES) + return (0); + bcopy(LLADDR(addr), &((u8 *)cb_arg)[cnt * IXGBE_ETH_LENGTH_OF_ADDRESS], IXGBE_ETH_LENGTH_OF_ADDRESS); - return (++cnt); + return (1); } /************************************************************************ @@ -1982,4 +1985,3 @@ ixv_init_device_features(struct ixgbe_softc *sc) if (sc->feat_cap & IXGBE_FEATURE_NEEDS_CTXD) sc->feat_en |= IXGBE_FEATURE_NEEDS_CTXD; } /* ixv_init_device_features */ - |
