diff options
author | Andreas Dannenberg <dannenberg@ti.com> | 2019-08-15 15:55:26 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-10-11 10:07:33 -0400 |
commit | 9d6ee3e23591f4eb733153aa7776f53d9fef57f1 (patch) | |
tree | bc4072ecad415a043b38a584d2708468f0729e54 /common | |
parent | 44fb0d6c9f5147a41c710032869e5e01b3c9e310 (diff) | |
download | u-boot-9d6ee3e23591f4eb733153aa7776f53d9fef57f1.tar.gz u-boot-9d6ee3e23591f4eb733153aa7776f53d9fef57f1.tar.bz2 u-boot-9d6ee3e23591f4eb733153aa7776f53d9fef57f1.zip |
spl: ymodem: Fix FIT loading termination handling
During FIT reading through ymodem_read_fit() the function
xyzModem_stream_read() is being used which returns zero once the end
of a stream has been reached. This could lead to an premature exit from
ymodem_read_fit() with certain-sized FIT images reporting that zero
bytes overall were read. Such a premature exit would then result in an
-EIO failure being triggered within the spl_load_simple_fit() caller
function and ultimately lead to a boot failure.
Fix this logic by simply aborting the stream read loops and continuing
with the regular code flow which ultimately would lead to returning
the number of bytes to be read ('size') as expected by the callers of
ymodem_read_fit().
Fixes: fa715193c083 ("spl: Add an option to load a FIT containing U-Boot from UART")
Signed-off-by: Andreas Dannenberg <dannenberg@ti.com>
Diffstat (limited to 'common')
-rw-r--r-- | common/spl/spl_ymodem.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/common/spl/spl_ymodem.c b/common/spl/spl_ymodem.c index 20f4260062..8ad580d8ae 100644 --- a/common/spl/spl_ymodem.c +++ b/common/spl/spl_ymodem.c @@ -44,7 +44,8 @@ static ulong ymodem_read_fit(struct spl_load_info *load, ulong offset, while (info->image_read < offset) { res = xyzModem_stream_read(buf, BUF_SIZE, &err); if (res <= 0) - return res; + break; + info->image_read += res; } @@ -57,7 +58,7 @@ static ulong ymodem_read_fit(struct spl_load_info *load, ulong offset, while (info->image_read < offset + size) { res = xyzModem_stream_read(buf, BUF_SIZE, &err); if (res <= 0) - return res; + break; memcpy(addr, buf, res); info->image_read += res; |