• Rasmus Villemoes's avatar
    lib/vsprintf.c: warn about too large precisions and field widths · 4d72ba01
    Rasmus Villemoes authored
    The field width is overloaded to pass some extra information for some %p
    extensions (e.g.  #bits for %pb).  But we might silently truncate the
    passed value when we stash it in struct printf_spec (see e.g.
    "lib/vsprintf.c: expand field_width to 24 bits").  Hopefully 23 value
    bits should now be enough for everybody, but if not, let's make some
    noise.
    
    Do the same for the precision.  In both cases, clamping seems more
    sensible than truncating.  While, according to POSIX, "A negative
    precision is taken as if the precision were omitted.", the kernel's
    printf has always treated that case as if the precision was 0, so we use
    that as lower bound.  For the field width, the smallest representable
    value is actually -(1<<23), but a negative field width means 'set the
    LEFT flag and use the absolute value', so we want the absolute value to
    fit.
    Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
    Cc: Al Viro <viro@ZenIV.linux.org.uk>
    Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Joe Perches <joe@perches.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Maurizio Lombardi <mlombard@redhat.com>
    Cc: Tejun Heo <tj@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    4d72ba01
vsprintf.c 63.6 KB