]> asedeno.scripts.mit.edu Git - git.git/blobdiff - compat/snprintf.c
Merge branch 'maint'
[git.git] / compat / snprintf.c
index dbfc2d6b6e2bc115e9976c231ae9d8fef7b2e086..6c0fb056a571b30627e404d7f164de31ed1a8699 100644 (file)
@@ -1,12 +1,31 @@
 #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
+#if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ < 4
+#define SNPRINTF_SIZE_CORR 1
+#else
+#define SNPRINTF_SIZE_CORR 0
+#endif
+#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 +39,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;