[tarantool-patches] [PATCH 08/11] coio: fix double close of a file descriptor

  • From: Vladislav Shpilevoy <v.shpilevoy@xxxxxxxxxxxxx>
  • To: tarantool-patches@xxxxxxxxxxxxx
  • Date: Fri, 30 Nov 2018 18:39:40 +0300

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 575bae712..a888a54dd 100644
--- a/src/coio.cc
+++ b/src/coio.cc
@@ -605,9 +605,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];
@@ -619,9 +616,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)


Other related posts: