• Li Wang's avatar
    vfs: fix put_compat_statfs64() does not handle errors · 64d2ab32
    Li Wang authored
    put_compat_statfs64() does NOT return -1 and setting errno to EOVERFLOW
    when some variables(like: f_bsize) overflowed in the returned struct.
    
    The reason is that the ubuf->f_blocks is __u64 type, it couldn't be
    4bits as the judgement in put_comat_statfs64(). Here correct the
    __u32 variables(in struct compat_statfs64) for comparison.
    
    reproducer:
    step1. mount hugetlbfs with two different pagesize on ppc64 arch.
    
    $ hugeadm --pool-pages-max 16M:0
    $ hugeadm --create-mount
    $ mount | grep -i hugetlbfs
    none on /var/lib/hugetlbfs/pagesize-16MB type hugetlbfs (rw,relatime,seclabel,pagesize=16777216)
    none on /var/lib/hugetlbfs/pagesize-16GB type hugetlbfs (rw,relatime,seclabel,pagesize=17179869184)
    
    step2. compile & run this C program.
    
    $ cat statfs64_test.c
    
     #define _LARGEFILE64_SOURCE
     #include <stdio.h>
     #include <sys/syscall.h>
     #include <sys/statfs.h>
    
     int main()
     {
    	struct statfs64 sb;
    	int err;
    
    	err = syscall(SYS_statfs64, "/var/lib/hugetlbfs/pagesize-16GB", sizeof(sb), &sb);
    	if (err)
    		return -1;
    
    	printf("sizeof f_bsize = %d, f_bsize=%ld\n", sizeof(sb.f_bsize), sb.f_bsize);
    
    	return 0;
     }
    
    $ gcc -m32 statfs64_test.c
    $ ./a.out
    sizeof f_bsize = 4, f_bsize=0
    Signed-off-by: default avatarLi Wang <liwang@redhat.com>
    Reviewed-by: default avatarAndreas Dilger <adilger@dilger.ca>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    64d2ab32
compat.c 37.1 KB