]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
llc: fix data loss when reading from a socket in llc_ui_recvmsg()
authorIlia Gavrilov <Ilia.Gavrilov@infotecs.ru>
Thu, 15 May 2025 12:20:15 +0000 (12:20 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 19 May 2025 11:12:54 +0000 (12:12 +0100)
For SOCK_STREAM sockets, if user buffer size (len) is less
than skb size (skb->len), the remaining data from skb
will be lost after calling kfree_skb().

To fix this, move the statement for partial reading
above skb deletion.

Found by InfoTeCS on behalf of Linux Verification Center (linuxtesting.org)

Fixes: 30a584d944fb ("[LLX]: SOCK_DGRAM interface fixes")
Cc: stable@vger.kernel.org
Signed-off-by: Ilia Gavrilov <Ilia.Gavrilov@infotecs.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/llc/af_llc.c

index 0259cde394ba09795a6bf0d44c4ea6767e200aea..cc77ec5769d82829cfb7a92096af8b79088df4f2 100644 (file)
@@ -887,15 +887,15 @@ static int llc_ui_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
                if (sk->sk_type != SOCK_STREAM)
                        goto copy_uaddr;
 
+               /* Partial read */
+               if (used + offset < skb_len)
+                       continue;
+
                if (!(flags & MSG_PEEK)) {
                        skb_unlink(skb, &sk->sk_receive_queue);
                        kfree_skb(skb);
                        *seq = 0;
                }
-
-               /* Partial read */
-               if (used + offset < skb_len)
-                       continue;
        } while (len > 0);
 
 out: