6b9d202ab3412dfe45a349abe82cdb8da26e9c9f
chmalee
  Thu Jul 25 11:06:53 2024 -0700
Remove double call to vfprintf in defaultWarn, refs #34135

diff --git src/lib/errAbort.c src/lib/errAbort.c
index b96fb49..cc57a3e 100644
--- src/lib/errAbort.c
+++ src/lib/errAbort.c
@@ -42,45 +42,49 @@
     boolean errAbortInProgress;     /* Flag to indicate that an error abort is in progress.
                                       * Needed so that a warn handler can tell if it's really
                                       * being called because of a warning or an error. */
     WarnHandler warnArray[maxWarnHandlers];
     int warnIx;
     AbortHandler abortArray[maxAbortHandlers];
     int abortIx;
     };
 
 static struct perThreadAbortVars *getThreadVars();  // forward declaration
 
 static void defaultVaWarn(char *format, va_list args)
 /* Default error message handler. */
 {
 if (format != NULL) {
+    // vfprintf() cannot be called twice in a row without a va_end/va_start
+    // so this must be an if/else situation
     if (doContentType)
         {
         puts("Content-type: text/html\n");
         puts("Error: ");
         vfprintf(stdout, format, args);
         fprintf(stdout, "\n");
         fflush(stdout);
         }
-
+    else
+        {
         fflush(stdout);
         vfprintf(stderr, format, args);
         fprintf(stderr, "\n");
         fflush(stderr);
         }
     }
+}
 
 static void silentVaWarn(char *format, va_list args)
 /* Warning handler that just hides it.  Useful sometimes when high level code
  * expects low level code may fail (as in finding a file on the net) but doesn't
  * want user to be bothered about it. */
 {
 }
 
 
 void vaWarn(char *format, va_list args)
 /* Call top of warning stack to issue warning. */
 {
 struct perThreadAbortVars *ptav = getThreadVars();
 ptav->warnArray[ptav->warnIx](format, args);
 }