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]
+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
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html