[bug report] ASoC: SOF: ipc-msg-injector: Separate the message sending
Péter Ujfalusi
peter.ujfalusi at linux.intel.com
Fri Jun 3 08:19:35 CEST 2022
On 02/06/2022 12:15, Dan Carpenter wrote:
> Hello Peter Ujfalusi,
>
> The patch a9aa3381e404: "ASoC: SOF: ipc-msg-injector: Separate the
> message sending" from May 6, 2022, leads to the following Smatch
> static checker warning:
>
> sound/soc/sof/sof-client-ipc-msg-injector.c:162 sof_msg_inject_dfs_write()
> warn: kernel error codes cast to unsigned 'size'
>
> sound/soc/sof/sof-client-ipc-msg-injector.c
> 148 static ssize_t sof_msg_inject_dfs_write(struct file *file, const char __user *buffer,
> 149 size_t count, loff_t *ppos)
> 150 {
> 151 struct sof_client_dev *cdev = file->private_data;
> 152 struct sof_msg_inject_priv *priv = cdev->data;
> 153 size_t size;
> 154 int ret;
> 155
> 156 if (*ppos)
> 157 return 0;
>
> I think there needs to be an "if (count != priv->max_msg_size)" check
> or something. Or another option would be the do a memset()
The interface is used to feed in crafted IPC messages to torture the
firmware (and in some level the kernel as well). How it will handle
deliberately ill crafted messages, what it will do if a valid but
unexpected message is sent, etc.
The only check I could think of is to prevent
less than sizeof(struct sof_ipc_cmd_hdr) count writes, but one could
argue that sending a normal header (u32 size, u32 cmd) followed by only
changing the size is also a valid shortcut.
>
> memset(priv->tx_buffer, 0, priv->max_msg_size);
>
> before the simple_write_to_buffer(). Otherwise if count == 1 then we
> re-use stale data.
If count is < sizeof(struct sof_ipc_cmd_hdr) to be precise, but even if
that passes there could be stale data in the buffer for message types
where there is extended payload.
Yes, there could be more size check, but the injector must not interpret
the message, it should not block invalid messages.
Let me think a bit on the minimum count check for a moment...
>
> 158
> 159 size = simple_write_to_buffer(priv->tx_buffer, priv->max_msg_size,
> 160 ppos, buffer, count);
> 161 if (size != count)
> --> 162 return size > 0 ? -EFAULT : size;
> 163
> 164 memset(priv->rx_buffer, 0, priv->max_msg_size);
> 165
> 166 ret = sof_msg_inject_send_message(cdev);
> 167
> 168 /* return the error code if test failed */
> 169 if (ret < 0)
> 170 size = ret;
> 171
> 172 return size;
> 173 };
>
> regards,
> dan carpenter
--
Péter
More information about the Alsa-devel
mailing list