--- buffer.c.orig	2006-11-28 23:37:54.962766696 +0300
+++ buffer.c	2006-11-28 23:39:06.576879696 +0300
@@ -125,9 +125,19 @@
 	return (res);
 }
 
+#if !defined(va_copy)
+	#if defined(__va_copy)
+		#define va_copy __va_copy
+	#else
+		// hope that we can copy va_list safely by hand
+		#define va_copy(dst, src) do { (dst) = (src); } while(0)
+	#endif
+#endif
+
 int
 evbuffer_add_vprintf(struct evbuffer *buf, const char *fmt, va_list ap)
 {
+	va_list curr_ap;
 	char *buffer;
 	size_t space;
 	size_t oldoff = buf->off;
@@ -137,12 +147,17 @@
 		buffer = buf->buffer + buf->off;
 		space = buf->totallen - buf->misalign - buf->off;
 
+		va_copy(curr_ap, ap);
+
 #ifdef WIN32
-		sz = vsnprintf(buffer, space - 1, fmt, ap);
+		sz = vsnprintf(buffer, space - 1, fmt, curr_ap);
 		buffer[space - 1] = '\0';
 #else
-		sz = vsnprintf(buffer, space, fmt, ap);
+		sz = vsnprintf(buffer, space, fmt, curr_ap);
 #endif
+
+		va_end(curr_ap);
+
 		if (sz == -1)
 			return (-1);
 		if (sz < space) {
