mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-04 18:27:36 +00:00
Merge tag 'net-6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Paolo Abeni: "Quite smaller than usual. Notably it includes the fix for the unix regression from the past weeks. The TCP window fix will require some follow-up, already queued. Current release - regressions: - af_unix: fix garbage collection of embryos Previous releases - regressions: - af_unix: fix race between GC and receive path - ipv6: sr: fix missing sk_buff release in seg6_input_core - tcp: remove 64 KByte limit for initial tp->rcv_wnd value - eth: r8169: fix rx hangup - eth: lan966x: remove ptp traps in case the ptp is not enabled - eth: ixgbe: fix link breakage vs cisco switches - eth: ice: prevent ethtool from corrupting the channels Previous releases - always broken: - openvswitch: set the skbuff pkt_type for proper pmtud support - tcp: Fix shift-out-of-bounds in dctcp_update_alpha() Misc: - a bunch of selftests stabilization patches" * tag 'net-6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (25 commits) r8169: Fix possible ring buffer corruption on fragmented Tx packets. idpf: Interpret .set_channels() input differently ice: Interpret .set_channels() input differently nfc: nci: Fix handling of zero-length payload packets in nci_rx_work() net: relax socket state check at accept time. tcp: remove 64 KByte limit for initial tp->rcv_wnd value net: ti: icssg_prueth: Fix NULL pointer dereference in prueth_probe() tls: fix missing memory barrier in tls_init net: fec: avoid lock evasion when reading pps_enable Revert "ixgbe: Manual AN-37 for troublesome link partners for X550 SFI" testing: net-drv: use stats64 for testing net: mana: Fix the extra HZ in mana_hwc_send_request net: lan966x: Remove ptp traps in case the ptp is not enabled. openvswitch: Set the skbuff pkt_type for proper pmtud support. selftest: af_unix: Make SCM_RIGHTS into OOB data. af_unix: Fix garbage collection of embryos carrying OOB with SCM_RIGHTS tcp: Fix shift-out-of-bounds in dctcp_update_alpha(). selftests/net: use tc rule to filter the na packet ipv6: sr: fix memleak in seg6_hmac_init_algo af_unix: Update unix_sk(sk)->oob_skb under sk_receive_queue lock. ...
This commit is contained in:
@@ -2170,13 +2170,15 @@ static int queue_oob(struct socket *sock, struct msghdr *msg, struct sock *other
|
||||
maybe_add_creds(skb, sock, other);
|
||||
skb_get(skb);
|
||||
|
||||
scm_stat_add(other, skb);
|
||||
|
||||
spin_lock(&other->sk_receive_queue.lock);
|
||||
if (ousk->oob_skb)
|
||||
consume_skb(ousk->oob_skb);
|
||||
|
||||
WRITE_ONCE(ousk->oob_skb, skb);
|
||||
__skb_queue_tail(&other->sk_receive_queue, skb);
|
||||
spin_unlock(&other->sk_receive_queue.lock);
|
||||
|
||||
scm_stat_add(other, skb);
|
||||
skb_queue_tail(&other->sk_receive_queue, skb);
|
||||
sk_send_sigurg(other);
|
||||
unix_state_unlock(other);
|
||||
other->sk_data_ready(other);
|
||||
@@ -2567,8 +2569,10 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state)
|
||||
|
||||
mutex_lock(&u->iolock);
|
||||
unix_state_lock(sk);
|
||||
spin_lock(&sk->sk_receive_queue.lock);
|
||||
|
||||
if (sock_flag(sk, SOCK_URGINLINE) || !u->oob_skb) {
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
unix_state_unlock(sk);
|
||||
mutex_unlock(&u->iolock);
|
||||
return -EINVAL;
|
||||
@@ -2580,6 +2584,8 @@ static int unix_stream_recv_urg(struct unix_stream_read_state *state)
|
||||
WRITE_ONCE(u->oob_skb, NULL);
|
||||
else
|
||||
skb_get(oob_skb);
|
||||
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
unix_state_unlock(sk);
|
||||
|
||||
chunk = state->recv_actor(oob_skb, 0, chunk, state);
|
||||
@@ -2608,6 +2614,10 @@ static struct sk_buff *manage_oob(struct sk_buff *skb, struct sock *sk,
|
||||
consume_skb(skb);
|
||||
skb = NULL;
|
||||
} else {
|
||||
struct sk_buff *unlinked_skb = NULL;
|
||||
|
||||
spin_lock(&sk->sk_receive_queue.lock);
|
||||
|
||||
if (skb == u->oob_skb) {
|
||||
if (copied) {
|
||||
skb = NULL;
|
||||
@@ -2619,13 +2629,19 @@ static struct sk_buff *manage_oob(struct sk_buff *skb, struct sock *sk,
|
||||
} else if (flags & MSG_PEEK) {
|
||||
skb = NULL;
|
||||
} else {
|
||||
skb_unlink(skb, &sk->sk_receive_queue);
|
||||
__skb_unlink(skb, &sk->sk_receive_queue);
|
||||
WRITE_ONCE(u->oob_skb, NULL);
|
||||
if (!WARN_ON_ONCE(skb_unref(skb)))
|
||||
kfree_skb(skb);
|
||||
unlinked_skb = skb;
|
||||
skb = skb_peek(&sk->sk_receive_queue);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock(&sk->sk_receive_queue.lock);
|
||||
|
||||
if (unlinked_skb) {
|
||||
WARN_ON_ONCE(skb_unref(unlinked_skb));
|
||||
kfree_skb(unlinked_skb);
|
||||
}
|
||||
}
|
||||
return skb;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user