Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9cef310f authored by Alex Juncu's avatar Alex Juncu Committed by David S. Miller
Browse files

llc: llc_cmsg_rcv was getting called after sk_eat_skb.



Received non stream protocol packets were calling llc_cmsg_rcv that used a
skb after that skb was released by sk_eat_skb. This caused received STP
packets to generate kernel panics.

Signed-off-by: default avatarAlexandru Juncu <ajuncu@ixiacom.com>
Signed-off-by: default avatarKunjan Naik <knaik@ixiacom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a03ffcf8
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -833,15 +833,15 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
		copied += used;
		len -= used;

		/* For non stream protcols we get one packet per recvmsg call */
		if (sk->sk_type != SOCK_STREAM)
			goto copy_uaddr;

		if (!(flags & MSG_PEEK)) {
			sk_eat_skb(sk, skb, 0);
			*seq = 0;
		}

		/* For non stream protcols we get one packet per recvmsg call */
		if (sk->sk_type != SOCK_STREAM)
			goto copy_uaddr;

		/* Partial read */
		if (used + offset < skb->len)
			continue;
@@ -857,6 +857,12 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
	}
	if (llc_sk(sk)->cmsg_flags)
		llc_cmsg_rcv(msg, skb);

	if (!(flags & MSG_PEEK)) {
			sk_eat_skb(sk, skb, 0);
			*seq = 0;
	}

	goto out;
}