Skip to content

Commit

Permalink
macsec: dynamically allocate space for sglist
Browse files Browse the repository at this point in the history
We call skb_cow_data, which is good anyway to ensure we can actually
modify the skb as such (another error from prior). Now that we have the
number of fragments required, we can safely allocate exactly that amount
of memory.

Fixes: c09440f ("macsec: introduce IEEE 802.1AE driver")
Signed-off-by: Jason A. Donenfeld <[email protected]>
Acked-by: Sabrina Dubroca <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
zx2c4 authored and davem330 committed Apr 26, 2017
1 parent b43bd72 commit 5294b83
Showing 1 changed file with 22 additions and 7 deletions.
29 changes: 22 additions & 7 deletions drivers/net/macsec.c
Original file line number Diff line number Diff line change
Expand Up @@ -617,7 +617,8 @@ static void macsec_encrypt_done(struct crypto_async_request *base, int err)

static struct aead_request *macsec_alloc_req(struct crypto_aead *tfm,
unsigned char **iv,
struct scatterlist **sg)
struct scatterlist **sg,
int num_frags)
{
size_t size, iv_offset, sg_offset;
struct aead_request *req;
Expand All @@ -629,7 +630,7 @@ static struct aead_request *macsec_alloc_req(struct crypto_aead *tfm,

size = ALIGN(size, __alignof__(struct scatterlist));
sg_offset = size;
size += sizeof(struct scatterlist) * (MAX_SKB_FRAGS + 1);
size += sizeof(struct scatterlist) * num_frags;

tmp = kmalloc(size, GFP_ATOMIC);
if (!tmp)
Expand All @@ -649,6 +650,7 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb,
{
int ret;
struct scatterlist *sg;
struct sk_buff *trailer;
unsigned char *iv;
struct ethhdr *eth;
struct macsec_eth_header *hh;
Expand Down Expand Up @@ -723,7 +725,14 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb,
return ERR_PTR(-EINVAL);
}

req = macsec_alloc_req(tx_sa->key.tfm, &iv, &sg);
ret = skb_cow_data(skb, 0, &trailer);
if (unlikely(ret < 0)) {
macsec_txsa_put(tx_sa);
kfree_skb(skb);
return ERR_PTR(ret);
}

req = macsec_alloc_req(tx_sa->key.tfm, &iv, &sg, ret);
if (!req) {
macsec_txsa_put(tx_sa);
kfree_skb(skb);
Expand All @@ -732,7 +741,7 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb,

macsec_fill_iv(iv, secy->sci, pn);

sg_init_table(sg, MAX_SKB_FRAGS + 1);
sg_init_table(sg, ret);
skb_to_sgvec(skb, sg, 0, skb->len);

if (tx_sc->encrypt) {
Expand Down Expand Up @@ -917,6 +926,7 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,
{
int ret;
struct scatterlist *sg;
struct sk_buff *trailer;
unsigned char *iv;
struct aead_request *req;
struct macsec_eth_header *hdr;
Expand All @@ -927,7 +937,12 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,
if (!skb)
return ERR_PTR(-ENOMEM);

req = macsec_alloc_req(rx_sa->key.tfm, &iv, &sg);
ret = skb_cow_data(skb, 0, &trailer);
if (unlikely(ret < 0)) {
kfree_skb(skb);
return ERR_PTR(ret);
}
req = macsec_alloc_req(rx_sa->key.tfm, &iv, &sg, ret);
if (!req) {
kfree_skb(skb);
return ERR_PTR(-ENOMEM);
Expand All @@ -936,7 +951,7 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,
hdr = (struct macsec_eth_header *)skb->data;
macsec_fill_iv(iv, sci, ntohl(hdr->packet_number));

sg_init_table(sg, MAX_SKB_FRAGS + 1);
sg_init_table(sg, ret);
skb_to_sgvec(skb, sg, 0, skb->len);

if (hdr->tci_an & MACSEC_TCI_E) {
Expand Down Expand Up @@ -2716,7 +2731,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,
}

#define MACSEC_FEATURES \
(NETIF_F_SG | NETIF_F_HIGHDMA)
(NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST)
static struct lock_class_key macsec_netdev_addr_lock_key;

static int macsec_dev_init(struct net_device *dev)
Expand Down

0 comments on commit 5294b83

Please sign in to comment.