llc: fix data loss when reading from a socket in llc_ui_recvmsg()
commit239af1970b
upstream. 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:30a584d944
("[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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> (cherry picked from commit 4cfe30f681a3df21b77f3d4c668069d6d0cf9840)
This commit is contained in:
parent
e2c5827264
commit
99ee2d9cf5
|
@ -888,15 +888,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:
|
||||
|
|
Loading…
Reference in New Issue