lib/vsprintf.c: fix handling of %zd when using ssize_t
authorJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Mon, 17 Dec 2012 23:59:58 +0000 (15:59 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 18 Dec 2012 01:15:13 +0000 (17:15 -0800)
Documentation/printk-formats.txt says to use %zd for a ssize_t argument
and some drivers do.  Unfortunately this prints a positive number for
negative values eg:

  tpm_tis 70030000.tpm_tis: tpm_transmit: tpm_send: error 4294967234

Add a case to va_args a ssize_t type if the interpretation should be
signed.

Tested on PPC32.

Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib/vsprintf.c

index 39c99fea7c0386f5cb12cfe814085d182d9c4db9..41da0741a663a0b62150c640979657fde51b143e 100644 (file)
@@ -1485,7 +1485,10 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
                                num = va_arg(args, long);
                                break;
                        case FORMAT_TYPE_SIZE_T:
-                               num = va_arg(args, size_t);
+                               if (spec.flags & SIGN)
+                                       num = va_arg(args, ssize_t);
+                               else
+                                       num = va_arg(args, size_t);
                                break;
                        case FORMAT_TYPE_PTRDIFF:
                                num = va_arg(args, ptrdiff_t);