From 9a0356b1e6d0f4fdd1e29a48596b91458b038f46 Mon Sep 17 00:00:00 2001
From: Muxi Yan <mxyan@google.com>
Date: Wed, 1 Mar 2017 18:48:43 -0800
Subject: [PATCH] Fix a bug in slice_buffer:maybe_embiggen

---
 src/core/lib/slice/slice_buffer.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/src/core/lib/slice/slice_buffer.c b/src/core/lib/slice/slice_buffer.c
index 9176dc8a42..451319c50d 100644
--- a/src/core/lib/slice/slice_buffer.c
+++ b/src/core/lib/slice/slice_buffer.c
@@ -46,11 +46,6 @@
 #define GROW(x) (3 * (x) / 2)
 
 static void maybe_embiggen(grpc_slice_buffer *sb) {
-  if (sb->base_slices != sb->slices) {
-    memmove(sb->base_slices, sb->slices, sb->count * sizeof(grpc_slice));
-    sb->slices = sb->base_slices;
-  }
-
   /* How far away from sb->base_slices is sb->slices pointer */
   size_t slice_offset = (size_t)(sb->slices - sb->base_slices);
   size_t slice_count = sb->count + slice_offset;
@@ -61,12 +56,15 @@ static void maybe_embiggen(grpc_slice_buffer *sb) {
     if (sb->base_slices == sb->inlined) {
       sb->base_slices = gpr_malloc(sb->capacity * sizeof(grpc_slice));
       memcpy(sb->base_slices, sb->inlined, slice_count * sizeof(grpc_slice));
+      sb->slices = sb->base_slices + slice_offset;
     } else {
+      if (sb->base_slices != sb->slices) {
+        memmove(sb->base_slices, sb->slices, sb->count * sizeof(grpc_slice));
+      }
       sb->base_slices =
           gpr_realloc(sb->base_slices, sb->capacity * sizeof(grpc_slice));
+      sb->slices = sb->base_slices;
     }
-
-    sb->slices = sb->base_slices + slice_offset;
   }
 }
 
-- 
GitLab