From 95cae9b8397109e7a563b753e84e31a57b07d765 Mon Sep 17 00:00:00 2001
From: Craig Tiller <ctiller@google.com>
Date: Mon, 8 Jun 2015 16:49:21 -0700
Subject: [PATCH] Fix some asan issues

---
 src/core/surface/channel.c    | 15 +++++++++------
 src/core/transport/metadata.c |  2 +-
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/core/surface/channel.c b/src/core/surface/channel.c
index e2c7f62665..3e5c8a4223 100644
--- a/src/core/surface/channel.c
+++ b/src/core/surface/channel.c
@@ -57,10 +57,12 @@ struct grpc_channel {
   gpr_refcount refs;
   gpr_uint32 max_message_length;
   grpc_mdctx *metadata_context;
+  /** mdstr for the grpc-status key */
   grpc_mdstr *grpc_status_string;
   grpc_mdstr *grpc_message_string;
   grpc_mdstr *path_string;
   grpc_mdstr *authority_string;
+  /** mdelem for grpc-status: 0 thru grpc-status: 2 */
   grpc_mdelem *grpc_status_elem[NUM_CACHED_STATUS_ELEMS];
 
   gpr_mu registered_call_mu;
@@ -93,8 +95,9 @@ grpc_channel *grpc_channel_create_from_filters(
   channel->grpc_status_string = grpc_mdstr_from_string(mdctx, "grpc-status");
   channel->grpc_message_string = grpc_mdstr_from_string(mdctx, "grpc-message");
   for (i = 0; i < NUM_CACHED_STATUS_ELEMS; i++) {
-    char buf[GPR_LTOA_MIN_BUFSIZE];
-    gpr_ltoa(i, buf);
+    char buf[2];
+    buf[0] = '0' + i;
+    buf[1] = 0;
     channel->grpc_status_elem[i] = grpc_mdelem_from_metadata_strings(
         mdctx, grpc_mdstr_ref(channel->grpc_status_string),
         grpc_mdstr_from_string(mdctx, buf));
@@ -188,6 +191,9 @@ static void destroy_channel(void *p, int ok) {
   grpc_channel *channel = p;
   size_t i;
   grpc_channel_stack_destroy(CHANNEL_STACK_FROM_CHANNEL(channel));
+  for (i = 0; i < NUM_CACHED_STATUS_ELEMS; i++) {
+    grpc_mdelem_unref(channel->grpc_status_elem[i]);
+  }
   grpc_mdstr_unref(channel->grpc_status_string);
   grpc_mdstr_unref(channel->grpc_message_string);
   grpc_mdstr_unref(channel->path_string);
@@ -199,9 +205,6 @@ static void destroy_channel(void *p, int ok) {
     grpc_mdelem_unref(rc->authority);
     gpr_free(rc);
   }
-  for (i = 0; i < NUM_CACHED_STATUS_ELEMS; i++) {
-    grpc_mdelem_unref(channel->grpc_status_elem[i]);
-  }
   grpc_mdctx_unref(channel->metadata_context);
   gpr_mu_destroy(&channel->registered_call_mu);
   gpr_free(channel);
@@ -257,7 +260,7 @@ grpc_mdelem *grpc_channel_get_reffed_status_elem(grpc_channel *channel, int i) {
     char tmp[GPR_LTOA_MIN_BUFSIZE];
     gpr_ltoa(i, tmp);
     return grpc_mdelem_from_metadata_strings(
-        channel->metadata_context, channel->grpc_status_string,
+        channel->metadata_context, grpc_mdstr_ref(channel->grpc_status_string),
         grpc_mdstr_from_string(channel->metadata_context, tmp));
   }
 }
diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c
index c80d67823f..e75b449e12 100644
--- a/src/core/transport/metadata.c
+++ b/src/core/transport/metadata.c
@@ -120,7 +120,7 @@ static void unlock(grpc_mdctx *ctx) {
   if (ctx->refs == 0) {
     /* uncomment if you're having trouble diagnosing an mdelem leak to make
        things clearer (slows down destruction a lot, however) */
-    gc_mdtab(ctx);
+    /* gc_mdtab(ctx); */
     if (ctx->mdtab_count && ctx->mdtab_count == ctx->mdtab_free) {
       discard_metadata(ctx);
     }
-- 
GitLab