summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>2008-07-19 03:39:59 +0000
committerjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>2008-07-19 03:39:59 +0000
commitbda8d38b0ca0055253626c023a165b0f7040e0ff (patch)
treee1852936d037ffd1c4b069b94494a1a993511e8f
parent564cbab5f3119e0fa568bd3b03a1bbe3aa1466f4 (diff)
downloadopenvpn-bda8d38b0ca0055253626c023a165b0f7040e0ff.tar.gz
openvpn-bda8d38b0ca0055253626c023a165b0f7040e0ff.tar.xz
openvpn-bda8d38b0ca0055253626c023a165b0f7040e0ff.zip
buf_printf will now return false on errors, such as truncation
due to overflow. git-svn-id: http://svn.openvpn.net/projects/openvpn/branches/BETA21/openvpn@3085 e7ae566f-a301-0410-adde-c780ea21d3b5
-rw-r--r--buffer.c9
-rw-r--r--buffer.h2
2 files changed, 8 insertions, 3 deletions
diff --git a/buffer.c b/buffer.c
index c90ff9f..498861e 100644
--- a/buffer.c
+++ b/buffer.c
@@ -182,9 +182,10 @@ buf_sub (struct buffer *buf, int size, bool prepend)
/*
* printf append to a buffer with overflow check
*/
-void
+bool
buf_printf (struct buffer *buf, const char *format, ...)
{
+ int ret = false;
if (buf_defined (buf))
{
va_list arglist;
@@ -193,13 +194,17 @@ buf_printf (struct buffer *buf, const char *format, ...)
if (cap > 0)
{
+ int stat;
va_start (arglist, format);
- vsnprintf ((char *)ptr, cap, format, arglist);
+ stat = vsnprintf ((char *)ptr, cap, format, arglist);
va_end (arglist);
*(buf->data + buf->capacity - 1) = 0; /* windows vsnprintf needs this */
buf->len += (int) strlen ((char *)ptr);
+ if (stat >= 0 && stat < cap)
+ ret = true;
}
}
+ return ret;
}
/*
diff --git a/buffer.h b/buffer.h
index 8888869..7de3363 100644
--- a/buffer.h
+++ b/buffer.h
@@ -206,7 +206,7 @@ has_digit (const unsigned char* src)
/*
* printf append to a buffer with overflow check
*/
-void buf_printf (struct buffer *buf, const char *format, ...)
+bool buf_printf (struct buffer *buf, const char *format, ...)
#ifdef __GNUC__
__attribute__ ((format (printf, 2, 3)))
#endif