diff options
Diffstat (limited to 'net/packet/af_packet.c')
-rw-r--r-- | net/packet/af_packet.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 9b27d0cd766d..e6445d8f3f57 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -4226,6 +4226,8 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, | |||
4226 | } | 4226 | } |
4227 | 4227 | ||
4228 | if (req->tp_block_nr) { | 4228 | if (req->tp_block_nr) { |
4229 | unsigned int min_frame_size; | ||
4230 | |||
4229 | /* Sanity tests and some calculations */ | 4231 | /* Sanity tests and some calculations */ |
4230 | err = -EBUSY; | 4232 | err = -EBUSY; |
4231 | if (unlikely(rb->pg_vec)) | 4233 | if (unlikely(rb->pg_vec)) |
@@ -4248,12 +4250,12 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, | |||
4248 | goto out; | 4250 | goto out; |
4249 | if (unlikely(!PAGE_ALIGNED(req->tp_block_size))) | 4251 | if (unlikely(!PAGE_ALIGNED(req->tp_block_size))) |
4250 | goto out; | 4252 | goto out; |
4253 | min_frame_size = po->tp_hdrlen + po->tp_reserve; | ||
4251 | if (po->tp_version >= TPACKET_V3 && | 4254 | if (po->tp_version >= TPACKET_V3 && |
4252 | req->tp_block_size <= | 4255 | req->tp_block_size < |
4253 | BLK_PLUS_PRIV((u64)req_u->req3.tp_sizeof_priv) + sizeof(struct tpacket3_hdr)) | 4256 | BLK_PLUS_PRIV((u64)req_u->req3.tp_sizeof_priv) + min_frame_size) |
4254 | goto out; | 4257 | goto out; |
4255 | if (unlikely(req->tp_frame_size < po->tp_hdrlen + | 4258 | if (unlikely(req->tp_frame_size < min_frame_size)) |
4256 | po->tp_reserve)) | ||
4257 | goto out; | 4259 | goto out; |
4258 | if (unlikely(req->tp_frame_size & (TPACKET_ALIGNMENT - 1))) | 4260 | if (unlikely(req->tp_frame_size & (TPACKET_ALIGNMENT - 1))) |
4259 | goto out; | 4261 | goto out; |