Properly handle the case where vsnprintf returns -1.

diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c
index 93d9b24..b61b076 100644
--- a/tools/winegcc/utils.c
+++ b/tools/winegcc/utils.c
@@ -79,18 +79,18 @@
 {
     int n;
     size_t size = 100;
-    char* p;
     va_list ap;
 
-    p = xmalloc (size);
     while (1)
     {
+        char *p = xmalloc (size);
         va_start(ap, fmt);
 	n = vsnprintf (p, size, fmt, ap);
 	va_end(ap);
-        if (n > -1 && (size_t)n < size) return p;
-	size = min( size*2, (size_t)n+1 );
-	p = xrealloc (p, size);
+        if (n == -1) size *= 2;
+        else if ((size_t)n >= size) size = n + 1;
+        else return p;
+        free(p);
     }
 }