From ff14b44154b4667e666531763898e503f9f00bfd Mon Sep 17 00:00:00 2001
From: Alistair Veitch <aveitch@google.com>
Date: Fri, 22 Jan 2016 13:01:49 -0800
Subject: [PATCH] Don't use buf_size as input and output in encode

---
 include/grpc/census.h           | 17 +++++++++--------
 src/core/census/tag_set.c       | 14 +++++++-------
 test/core/census/tag_set_test.c | 19 +++++++++++--------
 3 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/include/grpc/census.h b/include/grpc/census.h
index 6e4fa5a825..ab0e0e4802 100644
--- a/include/grpc/census.h
+++ b/include/grpc/census.h
@@ -438,19 +438,20 @@ int census_tag_set_get_tag_by_key(const census_tag_set *tags, const char *key,
    @param tags tag set to be encoded
    @param buffer pointer to buffer. This address will be used to encode the
                  printable tags.
-   @param buf_size On input, will be a pointer to total buffer size. On output,
-                   will be set to total number of bytes consumed by printable
-                   tags.
-   @param bin_buf_size on output, will be set to the number of bytes used to
-                       encode the binary tags.
+   @param buf_size number of available bytes in buffer.
+   @param print_buf_size Will be set to the number of bytes consumed by
+                         printable tags.
+   @param bin_buf_size Will be set to the number of bytes used to encode the
+                       binary tags.
    @return A pointer to the binary tag's encoded, or NULL if the buffer was
            insufficiently large to hold the encoded tags. Thus, if successful,
            printable tags are encoded into
-           [buffer, buffer + *buf_size) and binary tags into
+           [buffer, buffer + *print_buf_size) and binary tags into
            [returned-ptr, returned-ptr + *bin_buf_size) (and the return value
-           should be buffer + *buf_size) */
+           should be buffer + *print_buf_size) */
 char *census_tag_set_encode(const census_tag_set *tags, char *buffer,
-                            size_t *buf_size, size_t *bin_buf_size);
+                            size_t buf_size, size_t *print_buf_size,
+                            size_t *bin_buf_size);
 
 /* Decode tag set buffers encoded with census_tag_set_encode_*(). Returns NULL
    if there is an error in parsing either buffer. */
diff --git a/src/core/census/tag_set.c b/src/core/census/tag_set.c
index b985eca52b..8908a2d5f3 100644
--- a/src/core/census/tag_set.c
+++ b/src/core/census/tag_set.c
@@ -454,19 +454,19 @@ static size_t tag_set_encode(const struct tag_set *tags, char *buffer,
 }
 
 char *census_tag_set_encode(const census_tag_set *tags, char *buffer,
-                            size_t *buf_size, size_t *bin_buf_size) {
-  size_t p_buf_size =
-      tag_set_encode(&tags->tags[PROPAGATED_TAGS], buffer, *buf_size);
-  if (p_buf_size == 0) {
+                            size_t buf_size, size_t *print_buf_size,
+                            size_t *bin_buf_size) {
+  *print_buf_size =
+      tag_set_encode(&tags->tags[PROPAGATED_TAGS], buffer, buf_size);
+  if (*print_buf_size == 0) {
     return NULL;
   }
-  char *b_buffer = buffer + p_buf_size;
+  char *b_buffer = buffer + *print_buf_size;
   *bin_buf_size = tag_set_encode(&tags->tags[PROPAGATED_BINARY_TAGS], b_buffer,
-                                 *buf_size - p_buf_size);
+                                 buf_size - *print_buf_size);
   if (*bin_buf_size == 0) {
     return NULL;
   }
-  *buf_size = p_buf_size;
   return b_buffer;
 }
 
diff --git a/test/core/census/tag_set_test.c b/test/core/census/tag_set_test.c
index 4414ad9bc1..8e09e6c1c6 100644
--- a/test/core/census/tag_set_test.c
+++ b/test/core/census/tag_set_test.c
@@ -325,15 +325,18 @@ static void encode_decode_test(void) {
   char buffer[BUF_SIZE];
   struct census_tag_set *cts =
       census_tag_set_create(NULL, basic_tags, BASIC_TAG_COUNT, NULL);
-  size_t bsize = 2;  // buffer size too small
-  size_t bin_bsize = 0;
-  GPR_ASSERT(census_tag_set_encode(cts, buffer, &bsize, &bin_bsize) == NULL);
-  bsize = BUF_SIZE;
-  char *b_buffer = census_tag_set_encode(cts, buffer, &bsize, &bin_bsize);
-  GPR_ASSERT(b_buffer != NULL && bsize > 0 && bin_bsize > 0 &&
-             bsize + bin_bsize <= BUF_SIZE && b_buffer == buffer + bsize);
+  size_t print_bsize;
+  size_t bin_bsize;
+  // Test with too small a buffer
+  GPR_ASSERT(census_tag_set_encode(cts, buffer, 2, &print_bsize, &bin_bsize) ==
+             NULL);
+  char *b_buffer =
+      census_tag_set_encode(cts, buffer, BUF_SIZE, &print_bsize, &bin_bsize);
+  GPR_ASSERT(b_buffer != NULL && print_bsize > 0 && bin_bsize > 0 &&
+             print_bsize + bin_bsize <= BUF_SIZE &&
+             b_buffer == buffer + print_bsize);
   census_tag_set *cts2 =
-      census_tag_set_decode(buffer, bsize, b_buffer, bin_bsize);
+      census_tag_set_decode(buffer, print_bsize, b_buffer, bin_bsize);
   GPR_ASSERT(cts2 != NULL);
   const census_tag_set_create_status *status =
       census_tag_set_get_create_status(cts2);
-- 
GitLab