aboutsummaryrefslogtreecommitdiff
path: root/compat/snprintf.c
diff options
context:
space:
mode:
authorJohannes Sixt <johannes.sixt@telecom.at>2007-12-01 21:24:59 +0100
committerJohannes Sixt <johannes.sixt@telecom.at>2008-06-22 11:32:45 +0200
commitf4626df51f63d53b89ff01de54cbf7558217ea2b (patch)
tree3f2e8f987cab6e12fcb8fa4d4a6004e60e57b053 /compat/snprintf.c
parent58eda02257a89df6e05f504bdf87e578d90f3b5e (diff)
downloadgit-f4626df51f63d53b89ff01de54cbf7558217ea2b.tar.gz
git-f4626df51f63d53b89ff01de54cbf7558217ea2b.tar.xz
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 dbfc2d6b6..580966e56 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;