hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/ipv4/udp.c
....@@ -444,14 +444,24 @@
444444 score = compute_score(sk, net, saddr, sport,
445445 daddr, hnum, dif, sdif);
446446 if (score > badness) {
447
- result = lookup_reuseport(net, sk, skb,
448
- saddr, sport, daddr, hnum);
447
+ badness = score;
448
+ result = lookup_reuseport(net, sk, skb, saddr, sport, daddr, hnum);
449
+ if (!result) {
450
+ result = sk;
451
+ continue;
452
+ }
453
+
449454 /* Fall back to scoring if group has connections */
450
- if (result && !reuseport_has_conns(sk))
455
+ if (!reuseport_has_conns(sk))
451456 return result;
452457
453
- result = result ? : sk;
454
- badness = score;
458
+ /* Reuseport logic returned an error, keep original score. */
459
+ if (IS_ERR(result))
460
+ continue;
461
+
462
+ badness = compute_score(result, net, saddr, sport,
463
+ daddr, hnum, dif, sdif);
464
+
455465 }
456466 }
457467 return result;
....@@ -1584,7 +1594,7 @@
15841594 }
15851595 EXPORT_SYMBOL_GPL(__udp_enqueue_schedule_skb);
15861596
1587
-void udp_destruct_sock(struct sock *sk)
1597
+void udp_destruct_common(struct sock *sk)
15881598 {
15891599 /* reclaim completely the forward allocated memory */
15901600 struct udp_sock *up = udp_sk(sk);
....@@ -1597,10 +1607,14 @@
15971607 kfree_skb(skb);
15981608 }
15991609 udp_rmem_release(sk, total, 0, true);
1610
+}
1611
+EXPORT_SYMBOL_GPL(udp_destruct_common);
16001612
1613
+static void udp_destruct_sock(struct sock *sk)
1614
+{
1615
+ udp_destruct_common(sk);
16011616 inet_sock_destruct(sk);
16021617 }
1603
-EXPORT_SYMBOL_GPL(udp_destruct_sock);
16041618
16051619 int udp_init_sock(struct sock *sk)
16061620 {
....@@ -1608,7 +1622,6 @@
16081622 sk->sk_destruct = udp_destruct_sock;
16091623 return 0;
16101624 }
1611
-EXPORT_SYMBOL_GPL(udp_init_sock);
16121625
16131626 void skb_consume_udp(struct sock *sk, struct sk_buff *skb, int len)
16141627 {