diff options
author | Nico Huber <nico.huber@secunet.com> | 2018-12-05 13:26:20 +0100 |
---|---|---|
committer | Nico Huber <nico.h@gmx.de> | 2018-12-06 15:47:35 +0000 |
commit | bbaa1719b13908ae570c93eba74e5b5f990e8271 (patch) | |
tree | c562597f1417c201eac0a7f8edb1ad71ca515635 /dediprog.c | |
parent | 7fb508dc137818587bf142ec1f28fbc1c3a371fc (diff) | |
download | flashrom-bbaa1719b13908ae570c93eba74e5b5f990e8271.tar.gz flashrom-bbaa1719b13908ae570c93eba74e5b5f990e8271.tar.bz2 flashrom-bbaa1719b13908ae570c93eba74e5b5f990e8271.zip |
dediprog: Fix small, unaligned reads
This never was a use case until now but the `--fmap` code makes it
obvious: Unaligned reads that were smaller than the `chunksize` here,
were extended without considering the length of the buffer read into.
With that fixed we run into the next problem: dediprog_spi_bulk_read()
shouldn't report an error when an empty read is unaligned.
Change-Id: Ie12b62499ebfdb467d5126c00d327c76077ddead
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: https://review.coreboot.org/c/30051
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: David Hendricks <david.hendricks@gmail.com>
Diffstat (limited to 'dediprog.c')
-rw-r--r-- | dediprog.c | 8 |
1 files changed, 4 insertions, 4 deletions
@@ -412,15 +412,15 @@ static int dediprog_spi_bulk_read(struct flashctx *flash, uint8_t *buf, unsigned struct libusb_transfer *transfers[DEDIPROG_ASYNC_TRANSFERS] = { NULL, }; struct libusb_transfer *transfer; + if (len == 0) + return 0; + if ((start % chunksize) || (len % chunksize)) { msg_perr("%s: Unaligned start=%i, len=%i! Please report a bug at flashrom@flashrom.org\n", __func__, start, len); return 1; } - if (len == 0) - return 0; - int command_packet_size; switch (protocol()) { case PROTOCOL_V1: @@ -504,7 +504,7 @@ static int dediprog_spi_read(struct flashctx *flash, uint8_t *buf, unsigned int int ret; /* chunksize must be 512, other sizes will NOT work at all. */ const unsigned int chunksize = 0x200; - unsigned int residue = start % chunksize ? chunksize - start % chunksize : 0; + unsigned int residue = start % chunksize ? min(len, chunksize - start % chunksize) : 0; unsigned int bulklen; dediprog_set_leds(LED_BUSY); |