Skip to content

Commit cc9b17a

Browse files
jasowangdavem330
authored andcommitted
net: sock: validate data_len before allocating skb in sock_alloc_send_pskb()
We need to validate the number of pages consumed by data_len, otherwise frags array could be overflowed by userspace. So this patch validate data_len and return -EMSGSIZE when data_len may occupies more frags than MAX_SKB_FRAGS. Signed-off-by: Jason Wang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 914bec1 commit cc9b17a

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

net/core/sock.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1592,6 +1592,11 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
15921592
gfp_t gfp_mask;
15931593
long timeo;
15941594
int err;
1595+
int npages = (data_len + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
1596+
1597+
err = -EMSGSIZE;
1598+
if (npages > MAX_SKB_FRAGS)
1599+
goto failure;
15951600

15961601
gfp_mask = sk->sk_allocation;
15971602
if (gfp_mask & __GFP_WAIT)
@@ -1610,14 +1615,12 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
16101615
if (atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) {
16111616
skb = alloc_skb(header_len, gfp_mask);
16121617
if (skb) {
1613-
int npages;
16141618
int i;
16151619

16161620
/* No pages, we're done... */
16171621
if (!data_len)
16181622
break;
16191623

1620-
npages = (data_len + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
16211624
skb->truesize += data_len;
16221625
skb_shinfo(skb)->nr_frags = npages;
16231626
for (i = 0; i < npages; i++) {

0 commit comments

Comments
 (0)