Corrected non-portable reuse of va_list in dt_printf()

Submitted by:	Graeme Jenkinson
Reviewed by:	markj
MFC after:	2 weeks
Sponsored by:	DARPA, AFRL
Differential Revision:	https://reviews.freebsd.org/D8157
This commit is contained in:
George V. Neville-Neil 2016-10-11 16:12:12 +00:00
parent c3ad6e4f3e
commit 956c2a73cd
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=307044

View File

@ -581,6 +581,7 @@ int
dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...)
{
va_list ap;
va_list ap2;
int n;
#ifndef illumos
@ -605,11 +606,13 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...)
len = dtp->dt_sprintf_buflen - len;
assert(len >= 0);
if ((n = vsnprintf(buf, len, format, ap)) < 0)
va_copy(ap2, ap);
if ((n = vsnprintf(buf, len, format, ap2)) < 0)
n = dt_set_errno(dtp, errno);
va_end(ap2);
va_end(ap);
return (n);
}
@ -640,11 +643,14 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...)
dtp->dt_buffered_buf[0] = '\0';
}
if ((needed = vsnprintf(NULL, 0, format, ap)) < 0) {
va_copy(ap2, ap);
if ((needed = vsnprintf(NULL, 0, format, ap2)) < 0) {
rval = dt_set_errno(dtp, errno);
va_end(ap2);
va_end(ap);
return (rval);
}
va_end(ap2);
if (needed == 0) {
va_end(ap);
@ -670,12 +676,15 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...)
dtp->dt_buffered_size <<= 1;
}
va_copy(ap2, ap);
if (vsnprintf(&dtp->dt_buffered_buf[dtp->dt_buffered_offs],
avail, format, ap) < 0) {
avail, format, ap2) < 0) {
rval = dt_set_errno(dtp, errno);
va_end(ap2);
va_end(ap);
return (rval);
}
va_end(ap2);
dtp->dt_buffered_offs += needed;
assert(dtp->dt_buffered_buf[dtp->dt_buffered_offs] == '\0');
@ -683,8 +692,10 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...)
return (0);
}
n = vfprintf(fp, format, ap);
va_copy(ap2, ap);
n = vfprintf(fp, format, ap2);
fflush(fp);
va_end(ap2);
va_end(ap);
if (n < 0) {