]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
batman-adv: dat: fix tie-break for candidate selection
authorSven Eckelmann <sven@narfation.org>
Thu, 2 Jul 2026 17:32:40 +0000 (19:32 +0200)
committerSven Eckelmann <sven@narfation.org>
Mon, 6 Jul 2026 05:18:59 +0000 (07:18 +0200)
The original version of the candidate selection for DAT attempted to
compare both candidate and max_orig_node to identify which has the smaller
MAC address. This comparison is required as tie-break when a hash collision
happened.

But the used function returned 0 when the function was not equal and a
non-zero value when it was equal. As result, the actually selected
node was dependent on the order of entries in the orig_hash and not
actually on the mac addresses. The last originator in the hash collision
would always win.

To have a proper ordering, it must diff the actual MAC address bytes and
reject the candidate when the diff is not smaller than 0.

Cc: stable@vger.kernel.org
Fixes: 785ea1144182 ("batman-adv: Distributed ARP Table - create DHT helper functions")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
net/batman-adv/distributed-arp-table.c

index c40c9e02391befb5e9a01a2bea16d6d263578bda..a6fe4820f65b9883b1d6622e15d2b1d1f809e612 100644 (file)
@@ -546,7 +546,7 @@ static bool batadv_is_orig_node_eligible(struct batadv_dat_candidate *res,
         * the one with the lowest address
         */
        if (tmp_max == max && max_orig_node &&
-           batadv_compare_eth(candidate->orig, max_orig_node->orig))
+           memcmp(candidate->orig, max_orig_node->orig, ETH_ALEN) >= 0)
                goto out;
 
        ret = true;