summaryrefslogtreecommitdiff
path: root/compat/snprintf.c
diff options
context:
space:
mode:
authorJohannes Sixt <johannes.sixt@telecom.at>2007-12-01 20:24:59 (GMT)
committerJohannes Sixt <johannes.sixt@telecom.at>2008-06-22 09:32:45 (GMT)
commitf4626df51f63d53b89ff01de54cbf7558217ea2b (patch)
tree3f2e8f987cab6e12fcb8fa4d4a6004e60e57b053 /compat/snprintf.c
parent58eda02257a89df6e05f504bdf87e578d90f3b5e (diff)
downloadgit-f4626df51f63d53b89ff01de54cbf7558217ea2b.zip
git-f4626df51f63d53b89ff01de54cbf7558217ea2b.tar.gz
git-f4626df51f63d53b89ff01de54cbf7558217ea2b.tar.bz2
Add target architecture MinGW.
With this change GIT can be compiled and linked using MinGW. Builtins that only read the repository such as the log family and grep already work. Simple stubs are provided for a number of functions that the Windows C runtime does not offer. They will be completed in later patches. However, a fix for the snprintf/vsnprintf replacement is applied here to avoid buffer overflows. Dmitry Kakurin pointed out that access(..., X_OK) would always fails on Vista and suggested the -D__USE_MINGW_ACCESS workaround. Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Diffstat (limited to 'compat/snprintf.c')
-rw-r--r--compat/snprintf.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/compat/snprintf.c b/compat/snprintf.c
index dbfc2d6..580966e 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;