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