diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c
index 464ef909d0b8a7503c22a37ea3a981fd9c2407ff..e01d3314f362beb0f7f6d21025eab10e7c67d142 100644
--- a/dlls/msxml3/main.c
+++ b/dlls/msxml3/main.c
@@ -62,9 +62,11 @@ HINSTANCE MSXML_hInstance = NULL;
 
 void wineXmlCallbackLog(char const* caller, xmlErrorLevel lvl, char const* msg, va_list ap)
 {
-    char* buf = NULL;
-    int len = 32, needed;
-    enum __wine_debug_class dbcl = __WINE_DBCL_ERR;
+    static const int max_size = 200;
+    enum __wine_debug_class dbcl;
+    char buff[max_size];
+    int len;
+
     switch (lvl)
     {
         case XML_ERR_NONE:
@@ -74,25 +76,14 @@ void wineXmlCallbackLog(char const* caller, xmlErrorLevel lvl, char const* msg,
             dbcl = __WINE_DBCL_WARN;
             break;
         default:
+            dbcl = __WINE_DBCL_ERR;
             break;
     }
 
-    do
-    {
-        heap_free(buf);
-        buf = heap_alloc(len);
-        needed = vsnprintf(buf, len, msg, ap);
-        if (needed == -1)
-            len *= 2;
-        else if (needed >= len)
-            len = needed + 1;
-        else
-            needed = 0;
-    }
-    while (needed);
+    len = vsnprintf(buff, max_size, msg, ap);
+    if (len == -1 || len >= max_size) buff[max_size-1] = 0;
 
-    wine_dbg_log(dbcl, &__wine_dbch_msxml, caller, "%s", buf);
-    heap_free(buf);
+    wine_dbg_log(dbcl, &__wine_dbch_msxml, caller, "%s", buff);
 }
 
 void wineXmlCallbackError(char const* caller, xmlErrorPtr err)