aboutsummaryrefslogtreecommitdiff
path: root/common/spl/spl_ymodem.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2022-02-03 12:12:49 -0500
committerTom Rini <trini@konsulko.com>2022-02-03 12:12:49 -0500
commitb3650c9265efac00f5be5390ea4b4b18f1270a47 (patch)
tree86ff5fbee12f43f7d700d130c92009aef12fc185 /common/spl/spl_ymodem.c
parent006fddde01da7e8b3c7cad4a35f3245edc894ab4 (diff)
parentd502210a9ce3eda828cba8e30f237a4e29a7d797 (diff)
downloadu-boot-WIP/03Feb2022.zip
u-boot-WIP/03Feb2022.tar.gz
u-boot-WIP/03Feb2022.tar.bz2
Merge branch '2022-02-03-assorted-fixes'WIP/03Feb2022
- Update CI image to have libgnutls available. - Assorted ARM and SPL bugfixe
Diffstat (limited to 'common/spl/spl_ymodem.c')
-rw-r--r--common/spl/spl_ymodem.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/common/spl/spl_ymodem.c b/common/spl/spl_ymodem.c
index 047df74..fdd5261 100644
--- a/common/spl/spl_ymodem.c
+++ b/common/spl/spl_ymodem.c
@@ -42,6 +42,7 @@ static ulong ymodem_read_fit(struct spl_load_info *load, ulong offset,
int res, err, buf_offset;
struct ymodem_fit_info *info = load->priv;
char *buf = info->buf;
+ ulong copy_size = size;
while (info->image_read < offset) {
res = xyzModem_stream_read(buf, BUF_SIZE, &err);
@@ -57,8 +58,14 @@ static ulong ymodem_read_fit(struct spl_load_info *load, ulong offset,
buf_offset = (info->image_read % BUF_SIZE);
else
buf_offset = BUF_SIZE;
+
+ if (res > copy_size) {
+ memcpy(addr, &buf[buf_offset - res], copy_size);
+ goto done;
+ }
memcpy(addr, &buf[buf_offset - res], res);
addr = addr + res;
+ copy_size -= res;
}
while (info->image_read < offset + size) {
@@ -66,11 +73,17 @@ static ulong ymodem_read_fit(struct spl_load_info *load, ulong offset,
if (res <= 0)
break;
- memcpy(addr, buf, res);
info->image_read += res;
+ if (res > copy_size) {
+ memcpy(addr, buf, copy_size);
+ goto done;
+ }
+ memcpy(addr, buf, res);
addr += res;
+ copy_size -= res;
}
+done:
return size;
}