ASoC: Intel: sst: Fix firmware name size handling
authorChristian Engelmayer <cengelma@gmx.at>
Sat, 7 Feb 2015 22:40:52 +0000 (23:40 +0100)
committerMark Brown <broonie@kernel.org>
Sun, 8 Feb 2015 03:08:27 +0000 (11:08 +0800)
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>
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: stable@vger.kernel.org
sound/soc/intel/sst/sst.h
sound/soc/intel/sst/sst_acpi.c

index 7f4bbfcbc6f552956977954b1cea39d12927fa81..562bc483d6b7f73924c6cd25fd2770b8c48bdc6b 100644 (file)
@@ -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 */
index b3360139c41a905ba9575574d42b7477dd0cbc26..51f83bad5319e1426d4c443d1a929d5d890e1d21 100644 (file)
@@ -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;
 
 };