diff options
author | Anders Roxell <anders.roxell@linaro.org> | 2014-10-15 11:25:39 +0200 |
---|---|---|
committer | Anders Roxell <anders.roxell@linaro.org> | 2014-10-15 11:25:39 +0200 |
commit | bdadcbff64075ac4710ee46ecef35088d2482820 (patch) | |
tree | 9947575eefba2cc906f1d16d13af9655d1c66b38 /net/packet | |
parent | 91796d4550097f3518ca77bf26023d6699b7ab8f (diff) | |
parent | d7892a4c389d54bccb9bce8e65eb053a33bbe290 (diff) |
Merge tag 'v3.14.22' into v3.14-rt
This is the 3.14.22 stable release
Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
Conflicts:
net/core/skbuff.c
Diffstat (limited to 'net/packet')
-rw-r--r-- | net/packet/af_packet.c | 17 | ||||
-rw-r--r-- | net/packet/internal.h | 1 |
2 files changed, 18 insertions, 0 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 5a2708ced63e..b5b541a35959 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -636,6 +636,7 @@ static void init_prb_bdqc(struct packet_sock *po, p1->tov_in_jiffies = msecs_to_jiffies(p1->retire_blk_tov); p1->blk_sizeof_priv = req_u->req3.tp_sizeof_priv; + p1->max_frame_len = p1->kblk_size - BLK_PLUS_PRIV(p1->blk_sizeof_priv); prb_init_ft_ops(p1, req_u); prb_setup_retire_blk_timer(po, tx_ring); prb_open_block(p1, pbd); @@ -1947,6 +1948,18 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, if ((int)snaplen < 0) snaplen = 0; } + } else if (unlikely(macoff + snaplen > + GET_PBDQC_FROM_RB(&po->rx_ring)->max_frame_len)) { + u32 nval; + + nval = GET_PBDQC_FROM_RB(&po->rx_ring)->max_frame_len - macoff; + pr_err_once("tpacket_rcv: packet too big, clamped from %u to %u. macoff=%u\n", + snaplen, nval, macoff); + snaplen = nval; + if (unlikely((int)snaplen < 0)) { + snaplen = 0; + macoff = GET_PBDQC_FROM_RB(&po->rx_ring)->max_frame_len; + } } spin_lock(&sk->sk_receive_queue.lock); h.raw = packet_current_rx_frame(po, skb, @@ -3780,6 +3793,10 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, goto out; if (unlikely(req->tp_block_size & (PAGE_SIZE - 1))) goto out; + if (po->tp_version >= TPACKET_V3 && + (int)(req->tp_block_size - + BLK_PLUS_PRIV(req_u->req3.tp_sizeof_priv)) <= 0) + goto out; if (unlikely(req->tp_frame_size < po->tp_hdrlen + po->tp_reserve)) goto out; diff --git a/net/packet/internal.h b/net/packet/internal.h index eb9580a6b25f..cdddf6a30399 100644 --- a/net/packet/internal.h +++ b/net/packet/internal.h @@ -29,6 +29,7 @@ struct tpacket_kbdq_core { char *pkblk_start; char *pkblk_end; int kblk_size; + unsigned int max_frame_len; unsigned int knum_blocks; uint64_t knxt_seq_num; char *prev; |