Skip to content

Commit

Permalink
libceph: Remove VLA usage of skcipher
Browse files Browse the repository at this point in the history
In the quest to remove all stack VLA usage from the kernel[1], this
replaces struct crypto_skcipher and SKCIPHER_REQUEST_ON_STACK() usage
with struct crypto_sync_skcipher and SYNC_SKCIPHER_REQUEST_ON_STACK(),
which uses a fixed stack size.

[1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com

Cc: Ilya Dryomov <idryomov@gmail.com>
Cc: "Yan, Zheng" <zyan@redhat.com>
Cc: Sage Weil <sage@redhat.com>
Cc: ceph-devel@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Kees Cook authored and Herbert Xu committed Sep 28, 2018
1 parent dc568ba commit 69d6302
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 7 deletions.
12 changes: 6 additions & 6 deletions net/ceph/crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,17 @@ static int set_secret(struct ceph_crypto_key *key, void *buf)
goto fail;
}

/* crypto_alloc_skcipher() allocates with GFP_KERNEL */
/* crypto_alloc_sync_skcipher() allocates with GFP_KERNEL */
noio_flag = memalloc_noio_save();
key->tfm = crypto_alloc_skcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC);
key->tfm = crypto_alloc_sync_skcipher("cbc(aes)", 0, 0);
memalloc_noio_restore(noio_flag);
if (IS_ERR(key->tfm)) {
ret = PTR_ERR(key->tfm);
key->tfm = NULL;
goto fail;
}

ret = crypto_skcipher_setkey(key->tfm, key->key, key->len);
ret = crypto_sync_skcipher_setkey(key->tfm, key->key, key->len);
if (ret)
goto fail;

Expand Down Expand Up @@ -136,7 +136,7 @@ void ceph_crypto_key_destroy(struct ceph_crypto_key *key)
if (key) {
kfree(key->key);
key->key = NULL;
crypto_free_skcipher(key->tfm);
crypto_free_sync_skcipher(key->tfm);
key->tfm = NULL;
}
}
Expand Down Expand Up @@ -216,7 +216,7 @@ static void teardown_sgtable(struct sg_table *sgt)
static int ceph_aes_crypt(const struct ceph_crypto_key *key, bool encrypt,
void *buf, int buf_len, int in_len, int *pout_len)
{
SKCIPHER_REQUEST_ON_STACK(req, key->tfm);
SYNC_SKCIPHER_REQUEST_ON_STACK(req, key->tfm);
struct sg_table sgt;
struct scatterlist prealloc_sg;
char iv[AES_BLOCK_SIZE] __aligned(8);
Expand All @@ -232,7 +232,7 @@ static int ceph_aes_crypt(const struct ceph_crypto_key *key, bool encrypt,
return ret;

memcpy(iv, aes_iv, AES_BLOCK_SIZE);
skcipher_request_set_tfm(req, key->tfm);
skcipher_request_set_sync_tfm(req, key->tfm);
skcipher_request_set_callback(req, 0, NULL, NULL);
skcipher_request_set_crypt(req, sgt.sgl, sgt.sgl, crypt_len, iv);

Expand Down
2 changes: 1 addition & 1 deletion net/ceph/crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ struct ceph_crypto_key {
struct ceph_timespec created;
int len;
void *key;
struct crypto_skcipher *tfm;
struct crypto_sync_skcipher *tfm;
};

int ceph_crypto_key_clone(struct ceph_crypto_key *dst,
Expand Down

0 comments on commit 69d6302

Please sign in to comment.