aboutsummaryrefslogtreecommitdiff
path: root/src/util.c
diff options
context:
space:
mode:
authorMike Hommey <mh@glandium.org>2012-04-18 18:29:44 +0200
committerJason Evans <jasone@canonware.com>2012-04-18 18:59:27 -0700
commit1ad56385adc40cfbca1b14c240a9c647135ac641 (patch)
tree73c40cbf84bd40fd3505314f815bd60b91d7a5c4 /src/util.c
parent666c5bf7a8baaa842da69cb402948411432a9d00 (diff)
downloadjemalloc-1ad56385adc40cfbca1b14c240a9c647135ac641.tar.gz
Fix malloc_vsnprintf handling of %o, %u and %x
These flags take unsigned values, but they were fed with signed values taken with va_arg, and that led to sign extension in cases where the corresponding value has the most significant bit set.
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/util.c b/src/util.c
index 2aab61f..99ae26d 100644
--- a/src/util.c
+++ b/src/util.c
@@ -320,12 +320,21 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap)
case '?': \
val = va_arg(ap, int); \
break; \
+ case '?' | 0x80: \
+ val = va_arg(ap, unsigned int); \
+ break; \
case 'l': \
val = va_arg(ap, long); \
break; \
+ case 'l' | 0x80: \
+ val = va_arg(ap, unsigned long); \
+ break; \
case 'q': \
val = va_arg(ap, long long); \
break; \
+ case 'q' | 0x80: \
+ val = va_arg(ap, unsigned long long); \
+ break; \
case 'j': \
val = va_arg(ap, intmax_t); \
break; \
@@ -335,6 +344,9 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap)
case 'z': \
val = va_arg(ap, ssize_t); \
break; \
+ case 'z' | 0x80: \
+ val = va_arg(ap, size_t); \
+ break; \
case 'p': /* Synthetic; used for %p. */ \
val = va_arg(ap, uintptr_t); \
break; \
@@ -358,7 +370,7 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap)
bool plus_plus = false;
int prec = -1;
int width = -1;
- char len = '?';
+ unsigned char len = '?';
f++;
if (*f == '%') {
@@ -480,7 +492,7 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap)
uintmax_t val JEMALLOC_CC_SILENCE_INIT(0);
char buf[O2S_BUFSIZE];
- GET_ARG_NUMERIC(val, len);
+ GET_ARG_NUMERIC(val, len | 0x80);
s = o2s(val, alt_form, buf, &slen);
APPEND_PADDED_S(s, slen, width, left_justify);
f++;
@@ -489,7 +501,7 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap)
uintmax_t val JEMALLOC_CC_SILENCE_INIT(0);
char buf[U2S_BUFSIZE];
- GET_ARG_NUMERIC(val, len);
+ GET_ARG_NUMERIC(val, len | 0x80);
s = u2s(val, 10, false, buf, &slen);
APPEND_PADDED_S(s, slen, width, left_justify);
f++;
@@ -498,7 +510,7 @@ malloc_vsnprintf(char *str, size_t size, const char *format, va_list ap)
uintmax_t val JEMALLOC_CC_SILENCE_INIT(0);
char buf[X2S_BUFSIZE];
- GET_ARG_NUMERIC(val, len);
+ GET_ARG_NUMERIC(val, len | 0x80);
s = x2s(val, alt_form, *f == 'X', buf, &slen);
APPEND_PADDED_S(s, slen, width, left_justify);
f++;