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 <s.hauer@xxxxxxxxxxxxxx> --- 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 barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox