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); }