X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=compat%2Fsnprintf.c;h=357e733074ea7c85f880fa577ad65dfb3787fec7;hb=a1a846a19e854a3b3baff8f55c039846880a2635;hp=dbfc2d6b6e2bc115e9976c231ae9d8fef7b2e086;hpb=d0ab520a2599afdfd4d61894863984fc36842b12;p=git.git diff --git a/compat/snprintf.c b/compat/snprintf.c index dbfc2d6b6..357e73307 100644 --- a/compat/snprintf.c +++ b/compat/snprintf.c @@ -1,12 +1,27 @@ #include "../git-compat-util.h" +/* + * The size parameter specifies the available space, i.e. includes + * the trailing NUL byte; but Windows's vsnprintf expects the + * number of characters to write without the trailing NUL. + */ +#ifndef SNPRINTF_SIZE_CORR +#define SNPRINTF_SIZE_CORR 0 +#endif + #undef vsnprintf int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap) { char *s; - int ret; - - ret = vsnprintf(str, maxsize, format, ap); + int ret = -1; + + if (maxsize > 0) { + ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, ap); + if (ret == maxsize-1) + ret = -1; + /* Windows does not NUL-terminate if result fills buffer */ + str[maxsize-1] = 0; + } if (ret != -1) return ret; @@ -20,7 +35,9 @@ int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap) if (! str) break; s = str; - ret = vsnprintf(str, maxsize, format, ap); + ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, ap); + if (ret == maxsize-1) + ret = -1; } free(s); return ret;