From d75fe665d1e0d1c9925f6e9e1c0384a4eab68705 Mon Sep 17 00:00:00 2001
From: Craig Tiller <craig.tiller@gmail.com>
Date: Sat, 21 Feb 2015 07:30:49 -0800
Subject: [PATCH] Fix a double-close in the server code.

Exposed (I think) now that we properly handle POLLHUP.
---
 src/core/surface/server.c             | 2 +-
 src/core/transport/chttp2_transport.c | 4 ++++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/core/surface/server.c b/src/core/surface/server.c
index a95215c5de..c99a1b4cc9 100644
--- a/src/core/surface/server.c
+++ b/src/core/surface/server.c
@@ -291,7 +291,7 @@ static void orphan_channel(channel_data *chand) {
 static void finish_destroy_channel(void *cd, int success) {
   channel_data *chand = cd;
   grpc_server *server = chand->server;
-  grpc_channel_destroy(chand->channel);
+  grpc_channel_internal_unref(chand->channel);
   server_unref(server);
 }
 
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index 982417ec8a..ccd8d0c376 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -191,6 +191,7 @@ struct transport {
   gpr_uint8 writing;
   gpr_uint8 calling_back;
   gpr_uint8 destroying;
+  gpr_uint8 closed;
   error_state error_state;
 
   /* stream indexing */
@@ -416,6 +417,7 @@ static void init_transport(transport *t, grpc_transport_setup_callback setup,
   t->next_stream_id = is_client ? 1 : 2;
   t->last_incoming_stream_id = 0;
   t->destroying = 0;
+  t->closed = 0;
   t->is_client = is_client;
   t->outgoing_window = DEFAULT_WINDOW;
   t->incoming_window = DEFAULT_WINDOW;
@@ -521,6 +523,8 @@ static void destroy_transport(grpc_transport *gt) {
 static void close_transport(grpc_transport *gt) {
   transport *t = (transport *)gt;
   gpr_mu_lock(&t->mu);
+  GPR_ASSERT(!t->closed);
+  t->closed = 1;
   if (t->ep) {
     grpc_endpoint_shutdown(t->ep);
   }
-- 
GitLab