Skip to content

Commit

Permalink
ASoC: wm_asdp: Validate sanity of algorithm count
Browse files Browse the repository at this point in the history
If we run into I/O problems the algorithm count may be crazy, validate it
before we proceed and dump the read data for diagnostic purposes.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Mark Brown committed Jan 8, 2013
1 parent 45b9ee7 commit d62f4bc
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions sound/soc/codecs/wm_adsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,10 +377,10 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp)
struct wmfw_adsp2_id_hdr adsp2_id;
struct wmfw_adsp1_alg_hdr *adsp1_alg;
struct wmfw_adsp2_alg_hdr *adsp2_alg;
void *alg;
void *alg, *buf;
const struct wm_adsp_region *mem;
unsigned int pos, term;
size_t algs;
size_t algs, buf_size;
__be32 val;
int i, ret;

Expand Down Expand Up @@ -411,6 +411,9 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp)
return ret;
}

buf = &adsp1_id;
buf_size = sizeof(adsp1_id);

algs = be32_to_cpu(adsp1_id.algs);
adsp_info(dsp, "Firmware: %x v%d.%d.%d, %zu algorithms\n",
be32_to_cpu(adsp1_id.fw.id),
Expand All @@ -432,6 +435,9 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp)
return ret;
}

buf = &adsp2_id;
buf_size = sizeof(adsp2_id);

algs = be32_to_cpu(adsp2_id.algs);
adsp_info(dsp, "Firmware: %x v%d.%d.%d, %zu algorithms\n",
be32_to_cpu(adsp2_id.fw.id),
Expand All @@ -454,6 +460,13 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp)
return -EINVAL;
}

if (algs > 1024) {
adsp_err(dsp, "Algorithm count %zx excessive\n", algs);
print_hex_dump_bytes(dev_name(dsp->dev), DUMP_PREFIX_OFFSET,
buf, buf_size);
return -EINVAL;
}

/* Read the terminator first to validate the length */
ret = regmap_raw_read(regmap, mem->base + term, &val, sizeof(val));
if (ret != 0) {
Expand Down

0 comments on commit d62f4bc

Please sign in to comment.