summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2011-06-06 01:54:59 +0200
committerVicent Marti <tanoku@gmail.com>2011-06-06 01:54:59 +0200
commitf9213015fddb8636daa993080cbbec70a02cba5c (patch)
tree2afd5f7b9b424fcbc0fa5815bf374618a114faa6 /src
parent2b397327e66e0e587e67df5a7803286db0f84ea0 (diff)
downloadlibgit2-f9213015fddb8636daa993080cbbec70a02cba5c.tar.gz
filebuf: Fix printf buffer overflows
The filebuf was not being properly written after a flush. This should cut it now. Fixes #228
Diffstat (limited to 'src')
-rw-r--r--src/filebuf.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/filebuf.c b/src/filebuf.c
index 97dec83f3..d0579b16b 100644
--- a/src/filebuf.c
+++ b/src/filebuf.c
@@ -363,14 +363,19 @@ int git_filebuf_printf(git_filebuf *file, const char *format, ...)
int len, error;
va_start(arglist, format);
-
len = vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist);
+ va_end(arglist);
if (len < 0 || (size_t)len >= space_left) {
if ((error = flush_buffer(file)) < GIT_SUCCESS)
return git__rethrow(error, "Failed to output to buffer");
+ space_left = file->buf_size - file->buf_pos;
+
+ va_start(arglist, format);
len = vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist);
+ va_end(arglist);
+
if (len < 0 || (size_t)len > file->buf_size)
return GIT_ENOMEM;
}