changeset 8514:1bb73f69b3f3 HEAD

my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
author Timo Sirainen <tss@iki.fi>
date Wed, 03 Dec 2008 02:25:11 +0200
parents 0691f5294bb9
children 3dc481f92b7d
files src/lib/compat.c
diffstat 1 files changed, 14 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/compat.c	Tue Dec 02 19:24:57 2008 +0200
+++ b/src/lib/compat.c	Wed Dec 03 02:25:11 2008 +0200
@@ -258,8 +258,13 @@
 	if (tmp_size > size) {
 		tmp = t_buffer_get(tmp_size);
 		ret = vsnprintf(tmp, tmp_size, format, ap);
-		if (ret >= 0 && (size_t)ret+1 != size)
+		if (ret >= 0 && (size_t)ret+1 != tmp_size) {
+			if (size > 0) {
+				memcpy(str, tmp, size-1);
+				str[size-1] = '\0';
+			}
 			return ret;
+		}
 	} else {
 		tmp_size = size;
 	}
@@ -269,9 +274,15 @@
 		tmp_size = nearest_power(tmp_size+1);
 		tmp = i_malloc(tmp_size);
 		ret = vsnprintf(tmp, tmp_size, format, ap);
+		if (ret >= 0 && (size_t)ret+1 != tmp_size) {
+			if (size > 0) {
+				memcpy(str, tmp, size-1);
+				str[size-1] = '\0';
+			}
+			i_free(tmp);
+			return ret;
+		}
 		i_free(tmp);
-		if (ret >= 0 && (size_t)ret+1 != size)
-			return ret;
 	} while (tmp_size < 1024*1024);
 
 	i_panic("my_vsnprintf(): Output string too big");