diff options
Diffstat (limited to 'compat/snprintf.c')
| -rw-r--r-- | compat/snprintf.c | 19 | 
1 files changed, 16 insertions, 3 deletions
diff --git a/compat/snprintf.c b/compat/snprintf.c index dbfc2d6b6e..580966e56a 100644 --- a/compat/snprintf.c +++ b/compat/snprintf.c @@ -1,12 +1,25 @@  #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; +	int ret = -1; -	ret = vsnprintf(str, maxsize, format, ap); +	if (maxsize > 0) { +		ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, ap); +		/* Windows does not NUL-terminate if result fills buffer */ +		str[maxsize-1] = 0; +	}  	if (ret != -1)  		return ret; @@ -20,7 +33,7 @@ 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);  	}  	free(s);  	return ret;  | 
