digest_file_window() first tries to memmap the file before it falls back
to reading it. This is quite unnecessary, we can just always read.

Moreover, memmapping a file has problems with the current code. A
"md5sum foo" result in the filesize argument being MAX_LFS_FILESIZE.
This is fine for files where the file is just read up to the end in
this case, but for memmapped buffers this results in digesting
MAX_LFS_FILESIZE bytes which is wrong. This problem is not apparent
at the moment as there are only a few files which are memmappable,
and on these (/dev/mem, /dev/ram0) digest commands are normally
called with an explicit size argument. This changes once ramfs starts
supporting memmap, so better drop memmapping in the digest code now.

Signed-off-by: Sascha Hauer <[email protected]>
---
 crypto/digest.c | 27 +--------------------------
 1 file changed, 1 insertion(+), 26 deletions(-)

diff --git a/crypto/digest.c b/crypto/digest.c
index e67e8fba0d..d23245e15f 100644
--- a/crypto/digest.c
+++ b/crypto/digest.c
@@ -253,32 +253,12 @@ out_free:
        return ret;
 }
 
-static int digest_update_from_memory(struct digest *d,
-                                    const unsigned char *buf,
-                                    loff_t size)
-{
-       while (size) {
-               unsigned long now = min_t(typeof(size), PAGE_SIZE, size);
-               int ret;
-
-               ret = digest_update_interruptible(d, buf, now);
-               if (ret)
-                       return ret;
-
-               size -= now;
-               buf  += now;
-       }
-
-       return 0;
-}
-
 int digest_file_window(struct digest *d, const char *filename,
                       unsigned char *hash,
                       const unsigned char *sig,
                       loff_t start, loff_t size)
 {
        int fd, ret;
-       unsigned char *buf;
 
        ret = digest_init(d);
        if (ret)
@@ -290,12 +270,7 @@ int digest_file_window(struct digest *d, const char 
*filename,
                return -errno;
        }
 
-       buf = memmap(fd, PROT_READ);
-       if (buf == MAP_FAILED)
-               ret = digest_update_from_fd(d, fd, start, size);
-       else
-               ret = digest_update_from_memory(d, buf + start, size);
-
+       ret = digest_update_from_fd(d, fd, start, size);
        if (ret)
                goto out;
 
-- 
2.27.0


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to