Blame SOURCES/Add-k5_buf_add_vfmt-to-k5buf-interface.patch

c41359
From 74e1079df0cc6e8932e487455177a69f782b863a Mon Sep 17 00:00:00 2001
c41359
From: Greg Hudson <ghudson@mit.edu>
c41359
Date: Thu, 4 Jan 2018 14:35:12 -0500
c41359
Subject: [PATCH] Add k5_buf_add_vfmt to k5buf interface
c41359
c41359
(cherry picked from commit f05766469efc2a055085c0bcf9d40c4cdf47fe36)
c41359
---
c41359
 src/include/k5-buf.h                          |  8 ++++++
c41359
 src/util/support/k5buf.c                      | 26 +++++++++++--------
c41359
 src/util/support/libkrb5support-fixed.exports |  1 +
c41359
 3 files changed, 24 insertions(+), 11 deletions(-)
c41359
c41359
diff --git a/src/include/k5-buf.h b/src/include/k5-buf.h
c41359
index f3207bd09..1223916a6 100644
c41359
--- a/src/include/k5-buf.h
c41359
+++ b/src/include/k5-buf.h
c41359
@@ -76,6 +76,14 @@ void k5_buf_add_fmt(struct k5buf *buf, const char *fmt, ...)
c41359
 #endif
c41359
     ;
c41359
 
c41359
+/* Add sprintf-style formatted data to BUF, with a va_list.  The value of ap is
c41359
+ * undefined after the call. */
c41359
+void k5_buf_add_vfmt(struct k5buf *buf, const char *fmt, va_list ap)
c41359
+#if !defined(__cplusplus) && (__GNUC__ > 2)
c41359
+    __attribute__((__format__(__printf__, 2, 0)))
c41359
+#endif
c41359
+    ;
c41359
+
c41359
 /* Extend the length of buf by len and return a pointer to the reserved space,
c41359
  * to be filled in by the caller.  Return NULL on error. */
c41359
 void *k5_buf_get_space(struct k5buf *buf, size_t len);
c41359
diff --git a/src/util/support/k5buf.c b/src/util/support/k5buf.c
c41359
index f619f6a48..35978f238 100644
c41359
--- a/src/util/support/k5buf.c
c41359
+++ b/src/util/support/k5buf.c
c41359
@@ -141,9 +141,9 @@ k5_buf_add_len(struct k5buf *buf, const void *data, size_t len)
c41359
 }
c41359
 
c41359
 void
c41359
-k5_buf_add_fmt(struct k5buf *buf, const char *fmt, ...)
c41359
+k5_buf_add_vfmt(struct k5buf *buf, const char *fmt, va_list ap)
c41359
 {
c41359
-    va_list ap;
c41359
+    va_list apcopy;
c41359
     int r;
c41359
     size_t remaining;
c41359
     char *tmp;
c41359
@@ -154,9 +154,7 @@ k5_buf_add_fmt(struct k5buf *buf, const char *fmt, ...)
c41359
 
c41359
     if (buf->buftype == K5BUF_FIXED) {
c41359
         /* Format the data directly into the fixed buffer. */
c41359
-        va_start(ap, fmt);
c41359
         r = vsnprintf(endptr(buf), remaining, fmt, ap);
c41359
-        va_end(ap);
c41359
         if (SNPRINTF_OVERFLOW(r, remaining))
c41359
             set_error(buf);
c41359
         else
c41359
@@ -166,9 +164,9 @@ k5_buf_add_fmt(struct k5buf *buf, const char *fmt, ...)
c41359
 
c41359
     /* Optimistically format the data directly into the dynamic buffer. */
c41359
     assert(buf->buftype == K5BUF_DYNAMIC);
c41359
-    va_start(ap, fmt);
c41359
-    r = vsnprintf(endptr(buf), remaining, fmt, ap);
c41359
-    va_end(ap);
c41359
+    va_copy(apcopy, ap);
c41359
+    r = vsnprintf(endptr(buf), remaining, fmt, apcopy);
c41359
+    va_end(apcopy);
c41359
     if (!SNPRINTF_OVERFLOW(r, remaining)) {
c41359
         buf->len += (unsigned int) r;
c41359
         return;
c41359
@@ -179,9 +177,7 @@ k5_buf_add_fmt(struct k5buf *buf, const char *fmt, ...)
c41359
         if (!ensure_space(buf, r))
c41359
             return;
c41359
         remaining = buf->space - buf->len;
c41359
-        va_start(ap, fmt);
c41359
         r = vsnprintf(endptr(buf), remaining, fmt, ap);
c41359
-        va_end(ap);
c41359
         if (SNPRINTF_OVERFLOW(r, remaining))  /* Shouldn't ever happen. */
c41359
             k5_buf_free(buf);
c41359
         else
c41359
@@ -191,9 +187,7 @@ k5_buf_add_fmt(struct k5buf *buf, const char *fmt, ...)
c41359
 
c41359
     /* It's a pre-C99 snprintf implementation, or something else went wrong.
c41359
      * Fall back to asprintf. */
c41359
-    va_start(ap, fmt);
c41359
     r = vasprintf(&tmp, fmt, ap);
c41359
-    va_end(ap);
c41359
     if (r < 0) {
c41359
         k5_buf_free(buf);
c41359
         return;
c41359
@@ -206,6 +200,16 @@ k5_buf_add_fmt(struct k5buf *buf, const char *fmt, ...)
c41359
     free(tmp);
c41359
 }
c41359
 
c41359
+void
c41359
+k5_buf_add_fmt(struct k5buf *buf, const char *fmt, ...)
c41359
+{
c41359
+    va_list ap;
c41359
+
c41359
+    va_start(ap, fmt);
c41359
+    k5_buf_add_vfmt(buf, fmt, ap);
c41359
+    va_end(ap);
c41359
+}
c41359
+
c41359
 void *
c41359
 k5_buf_get_space(struct k5buf *buf, size_t len)
c41359
 {
c41359
diff --git a/src/util/support/libkrb5support-fixed.exports b/src/util/support/libkrb5support-fixed.exports
c41359
index 30c946e7e..cb9bf0826 100644
c41359
--- a/src/util/support/libkrb5support-fixed.exports
c41359
+++ b/src/util/support/libkrb5support-fixed.exports
c41359
@@ -6,6 +6,7 @@ k5_buf_init_dynamic
c41359
 k5_buf_add
c41359
 k5_buf_add_len
c41359
 k5_buf_add_fmt
c41359
+k5_buf_add_vfmt
c41359
 k5_buf_get_space
c41359
 k5_buf_truncate
c41359
 k5_buf_status