Author: gnn
Date: Tue Oct 11 16:12:12 2016
New Revision: 307044
URL: https://svnweb.freebsd.org/changeset/base/307044

Log:
  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

Modified:
  head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c

Modified: head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c        Tue Oct 
11 15:55:45 2016        (r307043)
+++ head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c        Tue Oct 
11 16:12:12 2016        (r307044)
@@ -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, c
                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, c
                        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, c
                        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, c
                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) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to