From b6a860795c0c97c59c79155640531b8c47c34ea3 Mon Sep 17 00:00:00 2001 From: Nan Xiao Date: Fri, 18 Jul 2014 17:51:06 +0800 Subject: [PATCH] Fix redisvFormatCommand format parsing Flags can occur in any order in format string, so we can't assume any order. In original code, the redisvFormatCommand can process " %#+d" correctly, but can't process "%+#d". Closes #257 --- hiredis.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/hiredis.c b/hiredis.c index 3a70e1d..10ac8d0 100644 --- a/hiredis.c +++ b/hiredis.c @@ -754,17 +754,14 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) { /* Try to detect printf format */ { static const char intfmts[] = "diouxX"; + static const char flags[] = "#0-+ "; char _format[16]; const char *_p = c+1; size_t _l = 0; va_list _cpy; /* Flags */ - if (*_p != '\0' && *_p == '#') _p++; - if (*_p != '\0' && *_p == '0') _p++; - if (*_p != '\0' && *_p == '-') _p++; - if (*_p != '\0' && *_p == ' ') _p++; - if (*_p != '\0' && *_p == '+') _p++; + while (*_p != '\0' && strchr(flags,*_p) != NULL) _p++; /* Field width */ while (*_p != '\0' && isdigit(*_p)) _p++;