diff -up fetchmail-6.3.8/report.c_old fetchmail-6.3.8/report.c --- fetchmail-6.3.8/report.c_old 2008-06-27 11:38:59.000000000 +0200 +++ fetchmail-6.3.8/report.c 2008-06-27 11:39:22.000000000 +0200 @@ -238,11 +238,17 @@ report_build (FILE *errfp, message, va_a rep_ensuresize(); #if defined(VA_START) - VA_START (args, message); for ( ; ; ) { + /* + * args has to be initialized before every call of vsnprintf(), + * because vsnprintf() invokes va_arg macro and thus args is + * undefined after the call. + */ + VA_START(args, message); n = vsnprintf (partial_message + partial_message_size_used, partial_message_size - partial_message_size_used, message, args); + va_end (args); if (n >= 0 && (unsigned)n < partial_message_size - partial_message_size_used) @@ -254,7 +260,6 @@ report_build (FILE *errfp, message, va_a partial_message_size += 2048; partial_message = REALLOC (partial_message, partial_message_size); } - va_end (args); #else for ( ; ; ) { @@ -304,12 +309,13 @@ report_complete (FILE *errfp, message, v rep_ensuresize(); #if defined(VA_START) - VA_START (args, message); for ( ; ; ) { + VA_START(args, message); n = vsnprintf (partial_message + partial_message_size_used, partial_message_size - partial_message_size_used, message, args); + va_end(args); /* old glibc versions return -1 for truncation */ if (n >= 0 @@ -322,7 +328,6 @@ report_complete (FILE *errfp, message, v partial_message_size += 2048; partial_message = REALLOC (partial_message, partial_message_size); } - va_end (args); #else for ( ; ; ) {