Mercurial > dovecot > original-hg > dovecot-1.2
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");