summaryrefslogtreecommitdiff
path: root/compat
diff options
context:
space:
mode:
authorMichal Rokos <michal.rokos@nextsoft.cz>2008-03-05 16:46:13 +0100
committerJunio C Hamano <gitster@pobox.com>2008-03-05 13:12:07 -0800
commitc4582f93a263bea534288e7f7ad8937405964cd4 (patch)
tree0347f5c0606376d6ebd8e35dd4636139711fd8ac /compat
parentb9217642ef2db34e2cbeaef8d4439b07a03027cd (diff)
downloadgit-c4582f93a263bea534288e7f7ad8937405964cd4.tar.gz
Add compat/snprintf.c for systems that return bogus
Some systems (namely HPUX and Windows) return -1 when maxsize in snprintf() and in vsnprintf() is reached. So replace snprintf() and vsnprintf() functions with our own ones that return correct value upon overflow. [jc: verified that review comments by J6t have been incorporated, and tightened the check to verify the resulting buffer contents, suggested by Wayne Davison] Signed-off-by: Michal Rokos <michal.rokos@nextsoft.cz> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat')
-rw-r--r--compat/snprintf.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/compat/snprintf.c b/compat/snprintf.c
new file mode 100644
index 0000000000..dbfc2d6b6e
--- /dev/null
+++ b/compat/snprintf.c
@@ -0,0 +1,40 @@
+#include "../git-compat-util.h"
+
+#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);
+ if (ret != -1)
+ return ret;
+
+ s = NULL;
+ if (maxsize < 128)
+ maxsize = 128;
+
+ while (ret == -1) {
+ maxsize *= 4;
+ str = realloc(s, maxsize);
+ if (! str)
+ break;
+ s = str;
+ ret = vsnprintf(str, maxsize, format, ap);
+ }
+ free(s);
+ return ret;
+}
+
+int git_snprintf(char *str, size_t maxsize, const char *format, ...)
+{
+ va_list ap;
+ int ret;
+
+ va_start(ap, format);
+ ret = git_vsnprintf(str, maxsize, format, ap);
+ va_end(ap);
+
+ return ret;
+}
+