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:
parent
c3ad6e4f3e
commit
956c2a73cd
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user