]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fincore: Handle large files correctly on 32 bit
authorTobias Stoeckmann <tobias@stoeckmann.org>
Sun, 25 Feb 2018 19:27:18 +0000 (20:27 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 26 Feb 2018 10:54:12 +0000 (11:54 +0100)
If a file is larger than 4 GB on a 32 bit system with large file
support (default), it can happen that not all pages are properly
processed. This happens due to an int truncation (off_t vs size_t).

You can reproduce this on 32 bit with these commands:

$ dd if=/dev/zero of=4gb-file seek=4294967295 count=1 bs=1
$ fincore 4gb-file
fincore: failed to do mmap: 4gb-file: Invalid argument

If a file is larger than 4 GB, the first few pages of a file won't
be properly processed. "len" will be smaller than window_size,
but the for-loop iterates "window_size" bytes, skipping some pages.

Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
misc-utils/fincore.c

index 4641408f89382d42d5d9b283294a6db9cbca3a38..ab11594cc77644025b05dc9c06c46386fcb7d85d 100644 (file)
@@ -199,11 +199,11 @@ static int fincore_fd (struct fincore_control *ctl,
        int warned_once = 0;
 
        for (file_offset = 0; file_offset < file_size; file_offset += window_size) {
-               size_t len;
+               off_t len;
                void  *window = NULL;
 
                len = file_size - file_offset;
-               if (len >= window_size)
+               if (len >= (off_t) window_size)
                        len = window_size;
 
                window = mmap(window, len, PROT_NONE, MAP_PRIVATE, fd, file_offset);