• Wenliang Fan's avatar
    fs/nilfs2: fix integer overflow in nilfs_ioctl_wrap_copy() · 4b15d617
    Wenliang Fan authored
    The local variable 'pos' in nilfs_ioctl_wrap_copy function can overflow if
    a large number was passed to argv->v_index from userspace and the sum of
    argv->v_index and argv->v_nmembs exceeds the maximum value of __u64 type
    integer (= ~(__u64)0 = 18446744073709551615).
    
    Here, argv->v_index is a 64-bit width argument to specify the start
    position of target data items (such as segment number, checkpoint number,
    or virtual block address of nilfs), and argv->v_nmembs gives the total
    number of the items that userland programs (such as lssu, lscp, or
    cleanerd) want to get information about, which also gives the maximum
    element count of argv->v_base[] array.
    
    nilfs_ioctl_wrap_copy() calls dofunc() repeatedly and increments the
    position variable 'pos' at the end of each iteration if dofunc() itself
    didn't update 'pos':
    
          if (pos == ppos)
                  pos += n;
    
    This patch prevents the overflow here by rejecting pairs of a start
    position (argv->v_index) and a total count (argv->v_nmembs) which leads to
    the overflow.
    
    [konishi.ryusuke@lab.ntt.co.jp: fix signedness issue]
    Signed-off-by: default avatarWenliang Fan <fanwlexca@gmail.com>
    Cc: Vyacheslav Dubeyko <slava@dubeyko.com>
    Signed-off-by: default avatarRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    4b15d617
ioctl.c 21.5 KB