diff options
author | james <james@e7ae566f-a301-0410-adde-c780ea21d3b5> | 2008-07-19 03:39:59 +0000 |
---|---|---|
committer | james <james@e7ae566f-a301-0410-adde-c780ea21d3b5> | 2008-07-19 03:39:59 +0000 |
commit | bda8d38b0ca0055253626c023a165b0f7040e0ff (patch) | |
tree | e1852936d037ffd1c4b069b94494a1a993511e8f | |
parent | Modified extract_x509_field_ssl to return a status value indicating (diff) | |
download | openvpn-bda8d38b0ca0055253626c023a165b0f7040e0ff.tar.xz |
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.c | 9 | ||||
-rw-r--r-- | buffer.h | 2 |
2 files changed, 8 insertions, 3 deletions
@@ -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; } /* @@ -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 |