From f64d79f36516f987328ebc7f07328efb8310846f Mon Sep 17 00:00:00 2001
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
Date: Tue, 4 Dec 2018 23:40:19 +0300
Subject: [PATCH] coio: fix file descriptor leak on accept

coio_accept() calls evio_setsockopt_client, which
throws an exception and just accepted socket leaks.
Yes, server socket is protected, but not new client
socket.

The bug existed even before exceptions are removed
from evio.
---
 src/coio.cc | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/coio.cc b/src/coio.cc
index 4c9a885d2d..6b94cf2a65 100644
--- a/src/coio.cc
+++ b/src/coio.cc
@@ -257,8 +257,10 @@ coio_accept(struct ev_io *coio, struct sockaddr *addr,
 		int fd = sio_accept(coio->fd, addr, &addrlen);
 		if (fd >= 0) {
 			if (evio_setsockopt_client(fd, addr->sa_family,
-						   SOCK_STREAM) != 0)
+						   SOCK_STREAM) != 0) {
+				close(fd);
 				diag_raise();
+			}
 			return fd;
 		}
 		if (! sio_wouldblock(errno))
-- 
GitLab