[PATCH v2 07/11] coio: fix double close of a file descriptor

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Wed Dec 5 00:28:54 MSK 2018


coio_service_on_accept is called by evio by an
on_accept pointer. If evio obtains not zero from
on_accept pointer, it closes accepted socket. But
coio_service_on_accept closes it too, when fiber_new
fails. It is double close.

Note that the bug existed even when on_accept was able
to throw.
---
 src/coio.cc | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/coio.cc b/src/coio.cc
index 9b9c71c79..355c7a42e 100644
--- a/src/coio.cc
+++ b/src/coio.cc
@@ -595,9 +595,6 @@ coio_service_on_accept(struct evio_service *evio_service,
 {
 	struct coio_service *service = (struct coio_service *)
 			evio_service->on_accept_param;
-	struct ev_io coio;
-
-	coio_create(&coio, fd);
 
 	/* Set connection name. */
 	char fiber_name[SERVICE_NAME_MAXLEN];
@@ -609,9 +606,10 @@ coio_service_on_accept(struct evio_service *evio_service,
 	if (f == NULL) {
 		diag_log();
 		say_error("can't create a handler fiber, dropping client connection");
-		evio_close(loop(), &coio);
 		return -1;
 	}
+	struct ev_io coio;
+	coio_create(&coio, fd);
 	/*
 	 * The coio is passed into the created fiber, reset the
 	 * libev callback param to point at it.
-- 
2.17.2 (Apple Git-113)




More information about the Tarantool-patches mailing list