Skip to content

Commit

Permalink
vsprintf: Change struct printf_spec.precision from s8 to s16
Browse files Browse the repository at this point in the history
Commit ef0658f changed precision
from int to s8.

There is existing kernel code that uses a larger precision.

An example from the audit code:
	vsnprintf(...,..., " msg='%.1024s'", (char *)data);
which overflows precision and truncates to nothing.

Extending precision size fixes the audit system issue.

Other changes:

Change the size of the struct printf_spec.type from u16 to u8 so
sizeof(struct printf_spec) stays as small as possible.
Reorder the struct members so sizeof(struct printf_spec) remains 64 bits
without alignment holes.
Document the struct members a bit more.

Original-patch-by: Eric Paris <eparis@redhat.com>
Signed-off-by: Joe Perches <joe@perches.com>
Tested-by: Justin P. Mattock <justinmattock@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Joe Perches authored and Linus Torvalds committed Apr 14, 2010
1 parent 2ba3abd commit 4e310fd
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions lib/vsprintf.c
Original file line number Diff line number Diff line change
Expand Up @@ -408,12 +408,12 @@ enum format_type {
};

struct printf_spec {
u16 type;
s16 field_width; /* width of output field */
u8 type; /* format_type enum */
u8 flags; /* flags to number() */
u8 base;
s8 precision; /* # of digits/chars */
u8 qualifier;
u8 base; /* number base, 8, 10 or 16 only */
u8 qualifier; /* number qualifier, one of 'hHlLtzZ' */
s16 field_width; /* width of output field */
s16 precision; /* # of digits/chars */
};

static char *number(char *buf, char *end, unsigned long long num,
Expand Down

0 comments on commit 4e310fd

Please sign in to comment.