diff --git a/src/image.cpp b/src/image.cpp index 818af4e7..689f702a 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -1005,12 +1005,18 @@ namespace Exiv2 { size_t need = std::strlen(format); // initial guess int rc = -1; + // vsnprintf writes at most size (2nd parameter) bytes (including \0) + // returns the number of bytes required for the formatted string excluding \0 + // the following loop goes through: + // one iteration (if 'need' was large enough for the for formatted string) + // or two iterations (after the first call to vsnprintf we know the required length) do { buffer.resize(need + 1); va_list args; // variable arg list va_start(args, format); // args start after format rc = vsnprintf(&buffer[0], buffer.size(), format, args); va_end(args); // free the args + assert(rc >= 0); // rc < 0 => we have made an error in the format string if ( rc > 0 ) need = static_cast(rc); } while ( buffer.size() <= need );