[PATCH 3/4] nvmem: add a driver for the Amlogic Meson6/Meson8/Meson8b SoCs
From: Srinivas Kandagatla <hidden>
Date: 2017-10-09 10:36:23
Also in:
linux-amlogic, linux-devicetree
On 03/10/17 05:48, Chris Moore wrote:
Hi, Sorry in advance if I am being extremely stupid here. Le 01/10/2017 ? 14:56, Martin Blumenstingl a ?crit : [snip]quoted
+static int meson_mx_efuse_read(void *context, unsigned int offset, + void *buf, size_t bytes) +{ + struct meson_mx_efuse *efuse = context; + u32 tmp; + int err, i, addr; + + err = meson_mx_efuse_hw_enable(efuse); + if (err) + return err; + + meson_mx_efuse_mask_bits(efuse, MESON_MX_EFUSE_CNTL1, + MESON_MX_EFUSE_CNTL1_AUTO_RD_ENABLE, + MESON_MX_EFUSE_CNTL1_AUTO_RD_ENABLE); + + for (i = offset; i < offset + bytes; i += efuse->config.word_size) { + addr = i / efuse->config.word_size; + + err = meson_mx_efuse_read_addr(efuse, addr, &tmp); + if (err) + break; + + memcpy(buf + i, &tmp, efuse->config.word_size); + }This will not give the expected result if offset is not a multiple of efuse->config.word_size.
Offset should be always multiple of stride which is enforced in nvmem core. nvmem_cell would return an -EINVAL if that is not the case. --srini
This will cause buffer overflow if bytes is not a multiple of efuse->config.word_size. Shouldn't there at least be some sort of test on offset and bytes? Also this doesn't look endian-safe, but maybe it is. Old-timer remarks: - I try to avoid divisions where possible but I suppose they are very low-cost on recent hardware. - I don't like arithmetic on void pointers but I know it is supported by gcc (and possibly by recent C standards too). Sorry again for the noise if I am being stupid. Cheers, Chris