From: Pali Rohár Date: Tue, 3 Aug 2021 14:28:38 +0000 (+0200) Subject: xyz-modem: Fix crash after cancelling transfer X-Git-Url: http://git.dujemihanovic.xyz/?a=commitdiff_plain;h=1e7478461bb4e8842f1ca8e5ffb5a441041b0753;p=u-boot.git xyz-modem: Fix crash after cancelling transfer Variable xyz.len is set to -1 on error. At the end xyzModem_stream_read() function calls memcpy() with length from variable xyz.len. If this variable is set to -1 then value passed to memcpy is casted to unsigned value, which means to copy whole address space. Which then cause U-Boot crash. E.g. on arm64 it cause CPU crash: "Synchronous Abort" handler, esr 0x96000006 Fix this issue by checking that value stored in xyz.len is valid prior trying to use it. Signed-off-by: Pali Rohár Acked-by: Heinrich Schuchardt --- diff --git a/common/xyzModem.c b/common/xyzModem.c index fc3459ebba..b1b72aae0b 100644 --- a/common/xyzModem.c +++ b/common/xyzModem.c @@ -494,7 +494,7 @@ xyzModem_stream_read (char *buf, int size, int *err) total = 0; stat = xyzModem_cancel; /* Try and get 'size' bytes into the buffer */ - while (!xyz.at_eof && (size > 0)) + while (!xyz.at_eof && xyz.len >= 0 && (size > 0)) { if (xyz.len == 0) { @@ -587,7 +587,7 @@ xyzModem_stream_read (char *buf, int size, int *err) } } /* Don't "read" data from the EOF protocol package */ - if (!xyz.at_eof) + if (!xyz.at_eof && xyz.len > 0) { len = xyz.len; if (size < len)