]> git.itanic.dy.fi Git - linux-stable/commitdiff
ASoC: SOF: Add some bounds checking to firmware data
authorDan Carpenter <dan.carpenter@linaro.org>
Fri, 9 Feb 2024 13:02:16 +0000 (16:02 +0300)
committerSasha Levin <sashal@kernel.org>
Tue, 26 Mar 2024 22:17:06 +0000 (18:17 -0400)
[ Upstream commit 98f681b0f84cfc3a1d83287b77697679e0398306 ]

Smatch complains about "head->full_size - head->header_size" can
underflow.  To some extent, we're always going to have to trust the
firmware a bit.  However, it's easy enough to add a check for negatives,
and let's add a upper bounds check as well.

Fixes: d2458baa799f ("ASoC: SOF: ipc3-loader: Implement firmware parsing and loading")
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Link: https://msgid.link/r/5593d147-058c-4de3-a6f5-540ecb96f6f8@moroto.mountain
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/sof/ipc3-loader.c

index 28218766d2114f17d16d31667146fdd3a8796f9f..6e3ef067211068a615d1f9d7f2ff2155922b0000 100644 (file)
@@ -148,6 +148,8 @@ static size_t sof_ipc3_fw_parse_ext_man(struct snd_sof_dev *sdev)
 
        head = (struct sof_ext_man_header *)fw->data;
        remaining = head->full_size - head->header_size;
+       if (remaining < 0 || remaining > sdev->basefw.fw->size)
+               return -EINVAL;
        ext_man_size = ipc3_fw_ext_man_size(sdev, fw);
 
        /* Assert firmware starts with extended manifest */