Unverified Commit a1304cba authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Mark Brown
Browse files

ASoC: cros_ec_codec: allocate shash_desc dynamically



The wov_hotword_model_put() function has multiple large variables on
its stack, the largest of which is the result of SHASH_DESC_ON_STACK().
In total, this exceeds the warning limit for 32-bit architectures:

sound/soc/codecs/cros_ec_codec.c:776:12: error: stack frame size of 1152 bytes in function 'wov_hotword_model_put' [-Werror,-Wframe-larger-than=]

The function already has a dynamic crypto_alloc_shash() allocation, so
using kmalloc() for the descriptor is correct as well and does not
introduce any additional failure scenarios. With this, the stack usage
of wov_hotword_model_put() gets reduced to 480 bytes in my test
configuration.

Fixes: b6bc07d4 ("ASoC: cros_ec_codec: support WoV")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Reviewed-by: default avatarTzung-Bi Shih <tzungbi@google.com>
Link: https://lore.kernel.org/r/20200507213405.1869430-1-arnd@arndb.de


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 2d6201ee
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -108,22 +108,23 @@ static int calculate_sha256(struct cros_ec_codec_priv *priv,
			    uint8_t *buf, uint32_t size, uint8_t *digest)
{
	struct crypto_shash *tfm;
	struct shash_desc *desc;

	tfm = crypto_alloc_shash("sha256", CRYPTO_ALG_TYPE_SHASH, 0);
	if (IS_ERR(tfm)) {
		dev_err(priv->dev, "can't alloc shash\n");
		return PTR_ERR(tfm);
	}

	{
		SHASH_DESC_ON_STACK(desc, tfm);

	desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(tfm), GFP_KERNEL);
	if (!desc) {
		crypto_free_shash(tfm);
		return -ENOMEM;
	}
	desc->tfm = tfm;

	crypto_shash_digest(desc, buf, size, digest);
	shash_desc_zero(desc);
	}

	kfree(desc);
	crypto_free_shash(tfm);

#ifdef DEBUG