This can be used to attach a socket to an skb,
taking a reference on sk->sk_refcnt.
This helper might be a NOP if sk->sk_refcnt is zero.
Use it from tcp_make_synack().
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Brian Vazquez <brianvv@google.com>
Link: https://patch.msgid.link/20241010174817.1543642-4-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 #ifdef CONFIG_INET
 void sock_edemux(struct sk_buff *skb);
 void sock_pfree(struct sk_buff *skb);
+
+static inline void skb_set_owner_edemux(struct sk_buff *skb, struct sock *sk)
+{
+       skb_orphan(skb);
+       if (refcount_inc_not_zero(&sk->sk_refcnt)) {
+               skb->sk = sk;
+               skb->destructor = sock_edemux;
+       }
+}
 #else
 #define sock_edemux sock_efree
 #endif
 
 void skb_set_owner_w(struct sk_buff *skb, struct sock *sk)
 {
        skb_orphan(skb);
-       skb->sk = sk;
 #ifdef CONFIG_INET
-       if (unlikely(!sk_fullsock(sk))) {
-               skb->destructor = sock_edemux;
-               sock_hold(sk);
-               return;
-       }
+       if (unlikely(!sk_fullsock(sk)))
+               return skb_set_owner_edemux(skb, sk);
 #endif
+       skb->sk = sk;
        skb->destructor = sock_wfree;
        skb_set_hash_from_sk(skb, sk);
        /*
 
 
        switch (synack_type) {
        case TCP_SYNACK_NORMAL:
-               skb_set_owner_w(skb, req_to_sk(req));
+               skb_set_owner_edemux(skb, req_to_sk(req));
                break;
        case TCP_SYNACK_COOKIE:
                /* Under synflood, we do not attach skb to a socket,