Skip to content
  • Chao Yu's avatar
    f2fs: avoid data offset overflow when lseeking huge file · 2e023174
    Chao Yu authored
    
    
    xfstest generic/285 complains our issue in lseeking huge file.
    
    Here is the detail output of generic/285:
    "./check -f2fs tests/generic/285
    Ran: generic/285
    Failures: generic/285
    Failed 1 of 1 tests
    
    10. Test a huge file for offset overflow
    10.01 SEEK_HOLE expected 65536 or 8589934592, got 65536.          succ
    10.02 SEEK_HOLE expected 65536 or 8589934592, got 65536.          succ
    10.03 SEEK_DATA expected 0 or 0, got 0.                           succ
    10.04 SEEK_DATA expected 1 or 1, got 1.                           succ
    10.05 SEEK_HOLE expected 8589934592 or 8589934592, got 0.         FAIL
    10.06 SEEK_DATA expected 8589869056 or 8589869056, got 8589869056. succ
    10.07 SEEK_DATA expected 8589869057 or 8589869057, got 8589869057. succ
    10.08 SEEK_DATA expected 8589869056 or 8589869056, got 4294901760. FAIL"
    
    The reason of this issue is:
    We will calculate current offset through left shifting page-offset with
    PAGE_CACHE_SHIFT bits, but our page-offset is a type of unsigned long, its size
    is 4 bytes in 32-bits machine.
    
    So if our page-offset is bigger than (1 << 32 / pagesize - 1), result of left
    shifting will overflow.
    
    Let's fix this issue by casting type of page-offset to type of current offset:
    loff_t.
    
    Signed-off-by: default avatarChao Yu <chao2.yu@samsung.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    2e023174