diff options
author | Michal Rokos <michal.rokos@nextsoft.cz> | 2008-03-05 16:46:13 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-03-05 13:12:07 -0800 |
commit | c4582f93a263bea534288e7f7ad8937405964cd4 (patch) | |
tree | 0347f5c0606376d6ebd8e35dd4636139711fd8ac /compat | |
parent | b9217642ef2db34e2cbeaef8d4439b07a03027cd (diff) | |
download | git-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.c | 40 |
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; +} + |