]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.9.28/macsec-dynamically-allocate-space-for-sglist.patch
Linux 4.9.28
[thirdparty/kernel/stable-queue.git] / releases / 4.9.28 / macsec-dynamically-allocate-space-for-sglist.patch
1 From foo@baz Thu May 11 11:08:24 CEST 2017
2 From: "Jason A. Donenfeld" <Jason@zx2c4.com>
3 Date: Tue, 25 Apr 2017 19:08:18 +0200
4 Subject: macsec: dynamically allocate space for sglist
5
6 From: "Jason A. Donenfeld" <Jason@zx2c4.com>
7
8
9 [ Upstream commit 5294b83086cc1c35b4efeca03644cf9d12282e5b ]
10
11 We call skb_cow_data, which is good anyway to ensure we can actually
12 modify the skb as such (another error from prior). Now that we have the
13 number of fragments required, we can safely allocate exactly that amount
14 of memory.
15
16 Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver")
17 Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
18 Acked-by: Sabrina Dubroca <sd@queasysnail.net>
19 Signed-off-by: David S. Miller <davem@davemloft.net>
20 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
21 ---
22 drivers/net/macsec.c | 29 ++++++++++++++++++++++-------
23 1 file changed, 22 insertions(+), 7 deletions(-)
24
25 --- a/drivers/net/macsec.c
26 +++ b/drivers/net/macsec.c
27 @@ -617,7 +617,8 @@ static void macsec_encrypt_done(struct c
28
29 static struct aead_request *macsec_alloc_req(struct crypto_aead *tfm,
30 unsigned char **iv,
31 - struct scatterlist **sg)
32 + struct scatterlist **sg,
33 + int num_frags)
34 {
35 size_t size, iv_offset, sg_offset;
36 struct aead_request *req;
37 @@ -629,7 +630,7 @@ static struct aead_request *macsec_alloc
38
39 size = ALIGN(size, __alignof__(struct scatterlist));
40 sg_offset = size;
41 - size += sizeof(struct scatterlist) * (MAX_SKB_FRAGS + 1);
42 + size += sizeof(struct scatterlist) * num_frags;
43
44 tmp = kmalloc(size, GFP_ATOMIC);
45 if (!tmp)
46 @@ -649,6 +650,7 @@ static struct sk_buff *macsec_encrypt(st
47 {
48 int ret;
49 struct scatterlist *sg;
50 + struct sk_buff *trailer;
51 unsigned char *iv;
52 struct ethhdr *eth;
53 struct macsec_eth_header *hh;
54 @@ -723,7 +725,14 @@ static struct sk_buff *macsec_encrypt(st
55 return ERR_PTR(-EINVAL);
56 }
57
58 - req = macsec_alloc_req(tx_sa->key.tfm, &iv, &sg);
59 + ret = skb_cow_data(skb, 0, &trailer);
60 + if (unlikely(ret < 0)) {
61 + macsec_txsa_put(tx_sa);
62 + kfree_skb(skb);
63 + return ERR_PTR(ret);
64 + }
65 +
66 + req = macsec_alloc_req(tx_sa->key.tfm, &iv, &sg, ret);
67 if (!req) {
68 macsec_txsa_put(tx_sa);
69 kfree_skb(skb);
70 @@ -732,7 +741,7 @@ static struct sk_buff *macsec_encrypt(st
71
72 macsec_fill_iv(iv, secy->sci, pn);
73
74 - sg_init_table(sg, MAX_SKB_FRAGS + 1);
75 + sg_init_table(sg, ret);
76 skb_to_sgvec(skb, sg, 0, skb->len);
77
78 if (tx_sc->encrypt) {
79 @@ -914,6 +923,7 @@ static struct sk_buff *macsec_decrypt(st
80 {
81 int ret;
82 struct scatterlist *sg;
83 + struct sk_buff *trailer;
84 unsigned char *iv;
85 struct aead_request *req;
86 struct macsec_eth_header *hdr;
87 @@ -924,7 +934,12 @@ static struct sk_buff *macsec_decrypt(st
88 if (!skb)
89 return ERR_PTR(-ENOMEM);
90
91 - req = macsec_alloc_req(rx_sa->key.tfm, &iv, &sg);
92 + ret = skb_cow_data(skb, 0, &trailer);
93 + if (unlikely(ret < 0)) {
94 + kfree_skb(skb);
95 + return ERR_PTR(ret);
96 + }
97 + req = macsec_alloc_req(rx_sa->key.tfm, &iv, &sg, ret);
98 if (!req) {
99 kfree_skb(skb);
100 return ERR_PTR(-ENOMEM);
101 @@ -933,7 +948,7 @@ static struct sk_buff *macsec_decrypt(st
102 hdr = (struct macsec_eth_header *)skb->data;
103 macsec_fill_iv(iv, sci, ntohl(hdr->packet_number));
104
105 - sg_init_table(sg, MAX_SKB_FRAGS + 1);
106 + sg_init_table(sg, ret);
107 skb_to_sgvec(skb, sg, 0, skb->len);
108
109 if (hdr->tci_an & MACSEC_TCI_E) {
110 @@ -2709,7 +2724,7 @@ static netdev_tx_t macsec_start_xmit(str
111 }
112
113 #define MACSEC_FEATURES \
114 - (NETIF_F_SG | NETIF_F_HIGHDMA)
115 + (NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST)
116 static struct lock_class_key macsec_netdev_addr_lock_key;
117
118 static int macsec_dev_init(struct net_device *dev)