OSDN Git Service

ASoC: SOF: ipc3-topology: Correct get_control_data for non bytes payload
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Wed, 27 Apr 2022 18:52:21 +0000 (21:52 +0300)
committerMark Brown <broonie@kernel.org>
Tue, 3 May 2022 12:42:29 +0000 (13:42 +0100)
commita962890a5a3cce903ff7c7a19fadee63ed9efdc7
tree092290a9825b7a63e39c312038062f667ec95729
parent4213ff556740bb45e2d9ff0f50d056c4e7dd0921
ASoC: SOF: ipc3-topology: Correct get_control_data for non bytes payload

It is possible to craft a topology where sof_get_control_data() would do
out of bounds access because it expects that it is only called when the
payload is bytes type.
Confusingly it also handles other types of controls, but the payload
parsing implementation is only valid for bytes.

Fix the code to count the non bytes controls and instead of storing a
pointer to sof_abi_hdr in sof_widget_data (which is only valid for bytes),
store the pointer to the data itself and add a new member to save the size
of the data.

In case of non bytes controls we store the pointer to the chanv itself,
which is just an array of values at the end.

In case of bytes control, drop the wrong cdata->data (wdata[i].pdata) check
against NULL since it is incorrect and invalid in this context.
The data is pointing to the end of cdata struct, so it should never be
null.

Reported-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Tested-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Link: https://lore.kernel.org/r/20220427185221.28928-1-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc3-topology.c