From d74ad73009dd8ff4149a06904bb543f03a13f52e Mon Sep 17 00:00:00 2001 From: Marco Paland Date: Thu, 19 Apr 2018 13:20:46 +0200 Subject: fix(printf): fix snprintf buffer termination Fixes #7 (partly) --- printf.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'printf.c') diff --git a/printf.c b/printf.c index d9384f7..3cc7aa2 100644 --- a/printf.c +++ b/printf.c @@ -355,13 +355,13 @@ static size_t _vsnprintf(char* buffer, size_t buffer_len, const char* format, va unsigned int flags, width, precision, n; size_t idx = 0U; - while (idx < buffer_len) { - // end reached? - if (*format == (char)0) { - buffer[idx] = (char)0; - break; - } + // check if buffer is valid + if (!buffer) { + return 0U; + } + while ((idx < buffer_len) && *format) + { // format specifier? %[flags][width][.precision][length] if (*format != '%') { // no @@ -582,9 +582,16 @@ static size_t _vsnprintf(char* buffer, size_t buffer_len, const char* format, va } } + // termination + if (buffer_len > 0U) { + buffer[idx == buffer_len ? buffer_len - 1U : idx] = (char)0; + } + + // return written chars without terminating \0 return idx; } + /////////////////////////////////////////////////////////////////////////////// int printf(const char* format, ...) -- cgit v1.2.3