summaryrefslogtreecommitdiffstats
path: root/net/rose
diff options
context:
space:
mode:
authorWillem de Bruijn <willemb@google.com>2016-07-12 18:18:56 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-13 11:53:40 -0700
commitf4979fcea7fd36d8e2f556abef86f80e0d5af1ba (patch)
treee44115be36c8eef0769d4defe66168635c64137a /net/rose
parent22cb99fb76fb56b38f59770fbf22be03bb796d8d (diff)
downloadlinux-0-day-f4979fcea7fd36d8e2f556abef86f80e0d5af1ba.tar.gz
linux-0-day-f4979fcea7fd36d8e2f556abef86f80e0d5af1ba.tar.xz
rose: limit sk_filter trim to payload
Sockets can have a filter program attached that drops or trims incoming packets based on the filter program return value. Rose requires data packets to have at least ROSE_MIN_LEN bytes. It verifies this on arrival in rose_route_frame and unconditionally pulls the bytes in rose_recvmsg. The filter can trim packets to below this value in-between, causing pull to fail, leaving the partial header at the time of skb_copy_datagram_msg. Place a lower bound on the size to which sk_filter may trim packets by introducing sk_filter_trim_cap and call this for rose packets. Signed-off-by: Willem de Bruijn <willemb@google.com> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rose')
-rw-r--r--net/rose/rose_in.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/net/rose/rose_in.c b/net/rose/rose_in.c
index 79c4abcfa6b4e..0a6394754e81d 100644
--- a/net/rose/rose_in.c
+++ b/net/rose/rose_in.c
@@ -164,7 +164,8 @@ static int rose_state3_machine(struct sock *sk, struct sk_buff *skb, int framety
rose_frames_acked(sk, nr);
if (ns == rose->vr) {
rose_start_idletimer(sk);
- if (sock_queue_rcv_skb(sk, skb) == 0) {
+ if (sk_filter_trim_cap(sk, skb, ROSE_MIN_LEN) == 0 &&
+ __sock_queue_rcv_skb(sk, skb) == 0) {
rose->vr = (rose->vr + 1) % ROSE_MODULUS;
queued = 1;
} else {