Reading a file over NFS is prone to return short reads as the file
content is split over multiple UDP packets and reads won't return
more than the number of bytes that have gathered in the FIFO.

The uImage verification code didn't account for this and handled neither
short reads or the file prematurely ending.

Address both to fix this unexpected result:

  uimage -v /mnt/nfs/uImage
  verifying data CRC... Bad Data CRC: 0x56474aa2 != 0x6b8f0a9c

  cp /mnt/nfs/uImage .
  uimage -v uImage
  verifying data CRC... ok

Fixes: 390249968c4e ("reimplement uImage code")
Closes: https://github.com/barebox/barebox/issues/28
Reported-by: Rashidwi <rashidwin...@gmail.com>
Signed-off-by: Ahmad Fatoum <a.fat...@pengutronix.de>
---
 common/uimage.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/common/uimage.c b/common/uimage.c
index 140a08c1e426..c578edae2606 100644
--- a/common/uimage.c
+++ b/common/uimage.c
@@ -272,7 +272,9 @@ int uimage_verify(struct uimage_handle *handle)
                ret = read(handle->fd, buf, now);
                if (ret < 0)
                        goto err;
-               crc = crc32(crc, buf, now);
+               if (!ret)
+                       break;
+               crc = crc32(crc, buf, ret);
                len -= ret;
        }
 
-- 
2.39.5


Reply via email to