• Joe Lawrence's avatar
    sysctl: check for UINT_MAX before unsigned int min/max · fb910c42
    Joe Lawrence authored
    Mikulas noticed in the existing do_proc_douintvec_minmax_conv() and
    do_proc_dopipe_max_size_conv() introduced in this patchset, that they
    inconsistently handle overflow and min/max range inputs:
    
    For example:
    
      0 ... param->min - 1 ---> ERANGE
      param->min ... param->max ---> the value is accepted
      param->max + 1 ... 0x100000000L + param->min - 1 ---> ERANGE
      0x100000000L + param->min ... 0x100000000L + param->max ---> EINVAL
      0x100000000L + param->max + 1, 0x200000000L + param->min - 1 ---> ERANGE
      0x200000000L + param->min ... 0x200000000L + param->max ---> EINVAL
      0x200000000L + param->max + 1, 0x300000000L + param->min - 1 ---> ERANGE
    
    In do_proc_do*() routines which store values into unsigned int variables
    (4 bytes wide for 64-bit builds), first validate that the input unsigned
    long value (8 bytes wide for 64-bit builds) will fit inside the smaller
    unsigned int variable.  Then check that the unsigned int value falls
    inside the specified parameter min, max range.  Otherwise the unsigned
    long -> unsigned int conversion drops leading bits from the input value,
    leading to the inconsistent pattern Mikulas documented above.
    
    Link: http://lkml.kernel.org/r/1507658689-11669-5-git-send-email-joe.lawrence@redhat.comSigned-off-by: default avatarJoe Lawrence <joe.lawrence@redhat.com>
    Reported-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Reviewed-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Michael Kerrisk <mtk.manpages@gmail.com>
    Cc: Randy Dunlap <rdunlap@infradead.org>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    fb910c42
sysctl.c 74.2 KB