diff --git a/src/libCom/osi/os/WIN32/osdStdio.c b/src/libCom/osi/os/WIN32/osdStdio.c index d60495aae..602651f8b 100644 --- a/src/libCom/osi/os/WIN32/osdStdio.c +++ b/src/libCom/osi/os/WIN32/osdStdio.c @@ -17,13 +17,27 @@ int epicsShareAPI epicsVsnprintf(char *str, size_t len, const char *fmt, va_list ap) { - int needed = _vscprintf(fmt, ap); int retval = _vsnprintf(str, len, fmt, ap); +#ifdef _MSC_VER + int needed = _vscprintf(fmt, ap); + if ((int) len < needed + 1) { str[len - 1] = 0; return needed; } +#else + /* Unfortunately MINGW doesn't provide _vscprintf and their + * _vsnprintf follows MS' broken return value semantics. + */ + if (retval == -1) { + if (len) + str[len - 1] = 0; + return len; + } else if (retval == (int) len) { + str[--retval] = 0; + } +#endif return retval; }