diff mbox

ASoC: Intel: sst: Fix firmware name size handling

Message ID 1423348852-29466-1-git-send-email-cengelma@gmx.at (mailing list archive)
State Accepted
Commit 279e17ae81c17b40ae7a6c9e10f386a7aac7aa55
Headers show

Commit Message

Christian Engelmayer Feb. 7, 2015, 10:40 p.m. UTC
Function sst_acpi_probe() uses plain strcpy for setting member firmware_name
of a struct intel_sst_drv from member firmware of a struct sst_machines.
Thereby the destination array has got a length of 20 byte while the source may
hold 32 byte. Since eg. commit 64b9c90b8600 ("ASoC: Intel: Fix BYTCR firmware
name") increased strings from "fw_sst_0f28.bin" to "intel/fw_sst_0f28.bin"
there is an actual possibility that the 20 byte array at the end of struct
intel_sst_drv is overrun.

Thus increase the size of the destination and use the same define for both
structs. Detected by Coverity CID 1260087.

Signed-off-by: Christian Engelmayer <cengelma@gmx.at>
---
Compile tested only. Applies against linux-next.
---
 sound/soc/intel/sst/sst.h      | 3 ++-
 sound/soc/intel/sst/sst_acpi.c | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

Comments

Mark Brown Feb. 8, 2015, 3:52 a.m. UTC | #1
On Sat, Feb 07, 2015 at 11:40:52PM +0100, Christian Engelmayer wrote:
> Function sst_acpi_probe() uses plain strcpy for setting member firmware_name
> of a struct intel_sst_drv from member firmware of a struct sst_machines.
> Thereby the destination array has got a length of 20 byte while the source may
> hold 32 byte. Since eg. commit 64b9c90b8600 ("ASoC: Intel: Fix BYTCR firmware
> name") increased strings from "fw_sst_0f28.bin" to "intel/fw_sst_0f28.bin"
> there is an actual possibility that the 20 byte array at the end of struct
> intel_sst_drv is overrun.

Applied, thanks, though it seems more robust to stop copying the strings
at all and instead just make as many of the fields char * as we can.
diff mbox

Patch

diff --git a/sound/soc/intel/sst/sst.h b/sound/soc/intel/sst/sst.h
index 7f4bbfc..562bc48 100644
--- a/sound/soc/intel/sst/sst.h
+++ b/sound/soc/intel/sst/sst.h
@@ -58,6 +58,7 @@  enum sst_algo_ops {
 #define SST_BLOCK_TIMEOUT	1000
 
 #define FW_SIGNATURE_SIZE	4
+#define FW_NAME_SIZE		32
 
 /* stream states */
 enum sst_stream_states {
@@ -426,7 +427,7 @@  struct intel_sst_drv {
 	 * Holder for firmware name. Due to async call it needs to be
 	 * persistent till worker thread gets called
 	 */
-	char firmware_name[20];
+	char firmware_name[FW_NAME_SIZE];
 };
 
 /* misc definitions */
diff --git a/sound/soc/intel/sst/sst_acpi.c b/sound/soc/intel/sst/sst_acpi.c
index 43bc1c4..0542442 100644
--- a/sound/soc/intel/sst/sst_acpi.c
+++ b/sound/soc/intel/sst/sst_acpi.c
@@ -47,7 +47,7 @@  struct sst_machines {
 	char board[32];
 	char machine[32];
 	void (*machine_quirk)(void);
-	char firmware[32];
+	char firmware[FW_NAME_SIZE];
 	struct sst_platform_info *pdata;
 
 };