mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2026-01-06 20:44:11 +00:00
_regmap_raw_write() contains code to call regcache_write() to write
values to the cache. That code calls memcpy() to copy the value data to
the start of the work_buf. However, at least when _regmap_raw_write() is
called from _regmap_bus_raw_write(), the value data is in the work_buf,
and this memcpy() operation may over-write part of that value data,
depending on the value of reg_bytes + pad_bytes. At least when using
reg_bytes==1 and pad_bytes==0, corruption of the value data does occur.
To solve this, remove the memcpy() operation, and modify the subsequent
.parse_val() call to parse the original value buffer directly.
At least in the case of 8-bit register address and 16-bit values, and
writes of single registers at a time, this memcpy-then-parse combination
used to cancel each-other out; for a work-buffer containing xx 89 03,
the memcpy changed it to 89 03 03, and the parse_val changed it back to
89 89 03, thus leaving the value uncorrupted. This appears completely
accidental though. Since commit
|
||
|---|---|---|
| .. | ||
| internal.h | ||
| Kconfig | ||
| Makefile | ||
| regcache-flat.c | ||
| regcache-lzo.c | ||
| regcache-rbtree.c | ||
| regcache.c | ||
| regmap-debugfs.c | ||
| regmap-i2c.c | ||
| regmap-irq.c | ||
| regmap-mmio.c | ||
| regmap-spi.c | ||
| regmap.c | ||