All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Cc: alsa-devel@alsa-project.org, Alan Cox <alan@linux.intel.com>,
	Daniel Baluta <daniel.baluta@gmail.com>,
	liam.r.girdwood@linux.intel.com, vkoul@kernel.org,
	broonie@kernel.org, andriy.shevchenko@linux.intel.com,
	sound-open-firmware@alsa-project.org
Subject: Re: [PATCH v5 09/14] ASoC: SOF: Add firmware loader support
Date: Thu, 04 Apr 2019 15:25:58 +0200	[thread overview]
Message-ID: <s5hy34pc36h.wl-tiwai@suse.de> (raw)
In-Reply-To: <20190321161016.26515-10-pierre-louis.bossart@linux.intel.com>

On Thu, 21 Mar 2019 17:10:11 +0100,
Pierre-Louis Bossart wrote:
> 
> +static int get_ext_windows(struct snd_sof_dev *sdev,
> +			   struct sof_ipc_ext_data_hdr *ext_hdr)
> +{
> +	struct sof_ipc_window *w = (struct sof_ipc_window *)ext_hdr;

In general it's safer to use container_of() than the forced cast, and...

> +/* parse the extended FW boot data structures from FW boot message */
> +int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset)
> +{
> +	struct sof_ipc_ext_data_hdr *ext_hdr;
> +	void *ext_data;
> +	int ret = 0;
> +
> +	ext_data = kzalloc(PAGE_SIZE, GFP_KERNEL);
> +	if (!ext_data)
> +		return -ENOMEM;
> +
> +	/* get first header */
> +	snd_sof_dsp_block_read(sdev, bar, offset, ext_data,
> +			       sizeof(*ext_hdr));
> +	ext_hdr = (struct sof_ipc_ext_data_hdr *)ext_data;

The cast isn't needed from a void pointer.  The whole SOF codes have
way too many unneeded cast.  Let's reduce.

> +/* generic module parser for mmaped DSPs */
> +int snd_sof_parse_module_memcpy(struct snd_sof_dev *sdev,
> +				struct snd_sof_mod_hdr *module)
> +{
> +	struct snd_sof_blk_hdr *block;
> +	int count;
> +	u32 offset;
> +	size_t remaining;
> +
> +	dev_dbg(sdev->dev, "new module size 0x%x blocks 0x%x type 0x%x\n",
> +		module->size, module->num_blocks, module->type);
> +
> +	block = (struct snd_sof_blk_hdr *)((u8 *)module + sizeof(*module));
> +
> +	/* module->size doesn't include header size */
> +	remaining = module->size;
> +	for (count = 0; count < module->num_blocks; count++) {
> +		/* minus header size of block */
> +		remaining -= sizeof(*block);
> +		if (remaining < block->size) {
> +			dev_err(sdev->dev, "error: not enough data remaining\n");
> +			return -EINVAL;
> +		}

remaining is unsigned, so a negative check doesn't work here.
Hence you need the explicit underflow check.

> +static int load_modules(struct snd_sof_dev *sdev, const struct firmware *fw)
> +{
> +	struct snd_sof_fw_header *header;
> +	struct snd_sof_mod_hdr *module;
> +	int (*load_module)(struct snd_sof_dev *sof_dev,
> +			   struct snd_sof_mod_hdr *hdr);
> +	int ret, count;
> +	size_t remaining;
> +
> +	header = (struct snd_sof_fw_header *)fw->data;
> +	load_module = sof_ops(sdev)->load_module;
> +	if (!load_module)
> +		return -EINVAL;
> +
> +	/* parse each module */
> +	module = (struct snd_sof_mod_hdr *)((u8 *)(fw->data) + sizeof(*header));
> +	remaining = fw->size - sizeof(*header);

The size check should be more strict (e.g. here remaining might become
negative).

> +int snd_sof_load_firmware_raw(struct snd_sof_dev *sdev)
> +{
> +	struct snd_sof_pdata *plat_data = sdev->pdata;
> +	const char *fw_filename;
> +	int ret;
> +
> +	/* set code loading condition to true */
> +	sdev->code_loading = 1;
> +
> +	/* Don't request firmware again if firmware is already requested */
> +	if (plat_data->fw)
> +		return 0;
> +
> +	fw_filename = devm_kasprintf(sdev->dev, GFP_KERNEL,
> +				     "%s/%s",
> +				     plat_data->fw_filename_prefix,
> +				     plat_data->fw_filename);
> +	if (!fw_filename)
> +		return -ENOMEM;
> +
> +	ret = request_firmware(&plat_data->fw, fw_filename, sdev->dev);
> +
> +	if (ret < 0) {
> +		dev_err(sdev->dev, "error: request firmware %s failed err: %d\n",
> +			fw_filename, ret);
> +	}
> +	return ret;

Hrm, any need of devm_kasprintf() here?  That is, do we need to keep
this string after the call of request_firmware()?  It doesn't make
sense if we need it only temporarily.


thanks,

Takashi

  reply	other threads:[~2019-04-04 13:25 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-21 16:10 [PATCH v5 00/14] ASoC: Sound Open Firmware (SOF) core Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 01/14] ASoC: SOF: Add Sound Open Firmware driver core Pierre-Louis Bossart
2019-03-29 16:04   ` Takashi Iwai
2019-04-01 17:12     ` Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 02/14] ASoC: SOF: Add Sound Open Firmware KControl support Pierre-Louis Bossart
2019-03-29 16:04   ` Takashi Iwai
2019-04-01 17:13     ` Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 03/14] ASoC: SOF: Add driver debug support Pierre-Louis Bossart
2019-03-29 16:04   ` Takashi Iwai
2019-04-01 17:15     ` Pierre-Louis Bossart
2019-04-02  5:44       ` Mark Brown
2019-04-02 13:47         ` Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 04/14] ASoC: SOF: Add support for IPC IO between DSP and Host Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 05/14] ASoC: SOF: Add PCM operations support Pierre-Louis Bossart
2019-04-04 10:37   ` Takashi Iwai
2019-04-04 11:00     ` [Sound-open-firmware] " Liam Girdwood
2019-04-04 11:19     ` Keyon Jie
2019-04-04 13:53     ` Pierre-Louis Bossart
2019-04-04 14:03       ` Takashi Iwai
2019-04-04 19:13     ` Ranjani Sridharan
2019-04-05 12:30       ` Takashi Iwai
2019-04-05 14:24         ` Ranjani Sridharan
2019-04-08 19:31         ` Pierre-Louis Bossart
2019-04-09  8:04           ` Takashi Iwai
2019-04-09 13:50             ` Pierre-Louis Bossart
2019-04-09 14:23               ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-04-09 15:48                 ` Takashi Iwai
2019-04-09 16:11                   ` Pierre-Louis Bossart
2019-04-09 16:52                     ` Takashi Iwai
2019-03-21 16:10 ` [PATCH v5 06/14] ASoC: SOF: Add support for loading topologies Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 07/14] ASoC: SOF: Add DSP firmware logger support Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 08/14] ASoC: SOF: Add DSP HW abstraction operations Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 09/14] ASoC: SOF: Add firmware loader support Pierre-Louis Bossart
2019-04-04 13:25   ` Takashi Iwai [this message]
2019-04-04 13:59     ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-04-04 14:05       ` Takashi Iwai
2019-03-21 16:10 ` [PATCH v5 10/14] ASoC: SOF: Add userspace ABI support Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 11/14] ASoC: SOF: Add PM support Pierre-Louis Bossart
2019-04-04 13:31   ` Takashi Iwai
2019-03-21 16:10 ` [PATCH v5 12/14] ASoC: SOF: Add Nocodec machine driver support Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 13/14] ASoC: SOF: Add xtensa support Pierre-Louis Bossart
2019-03-21 16:10 ` [PATCH v5 14/14] ASoC: SOF: Add utils Pierre-Louis Bossart
2019-04-04 13:34   ` Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=s5hy34pc36h.wl-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alan@linux.intel.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=broonie@kernel.org \
    --cc=daniel.baluta@gmail.com \
    --cc=liam.r.girdwood@linux.intel.com \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=sound-open-firmware@alsa-project.org \
    --cc=vkoul@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.