Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6ed29e4b authored by Kees Cook's avatar Kees Cook Committed by Jordan Crouse
Browse files

libceph: Remove VLA usage of skcipher

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: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Git-Commit: 69d6302b65a83ce04720158f3f6fc2c9fb46c941
Git-Repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git


Change-Id: Ic0dedbad02494fdc1475ee40ded392221a62a69a
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent 4d78d339
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -46,9 +46,9 @@ 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);
@@ -56,7 +56,7 @@ static int set_secret(struct ceph_crypto_key *key, void *buf)
		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;

@@ -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;
	}
}
@@ -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);
@@ -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);

+1 −1
Original line number Diff line number Diff line
@@ -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,