• R
    lib/vsprintf.c: expand field_width to 24 bits · d0484193
    Rasmus Villemoes 提交于
    Maurizio Lombardi reported a problem [1] with the %pb extension: It
    doesn't work for sufficiently large bitmaps, since the size is stashed
    in the field_width field of the struct printf_spec, which is currently
    an s16.  Concretely, this manifested itself in
    /sys/bus/pseudo/drivers/scsi_debug/map being empty, since the bitmap
    printer got a size of 0, which is the 16 bit truncation of the actual
    bitmap size.
    
    We do want to keep struct printf_spec at 8 bytes so that it can cheaply
    be passed by value.  The qualifier field is only used for internal
    bookkeeping in format_decode, so we might as well use a local variable
    for that.  This gives us an additional 8 bits, which we can then use for
    the field width.
    
    To stay in 8 bytes, we need to do a little rearranging and make the type
    member a bitfield as well.  For consistency, change all the members to
    bit fields.  gcc doesn't generate much worse code with these changes (in
    fact, bloat-o-meter says we save 300 bytes - which I think is a little
    surprising).
    
    I didn't find a BUILD_BUG/compiletime_assertion/... which would work
    outside function context, so for now I just open-coded it.
    
    [1] http://thread.gmane.org/gmane.linux.kernel/2034835
    
    [akpm@linux-foundation.org: avoid open-coded BUILD_BUG_ON]
    Signed-off-by: NRasmus Villemoes <linux@rasmusvillemoes.dk>
    Reported-by: NMaurizio Lombardi <mlombard@redhat.com>
    Acked-by: NTejun Heo <tj@kernel.org>
    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>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    d0484193
vsprintf.c 63.1 KB