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

Vladimir Davydov vdavydov.dev at gmail.com
Mon Dec 3 19:19:50 MSK 2018


On Fri, Nov 30, 2018 at 06:39:40PM +0300, Vladislav Shpilevoy wrote:
> 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.

I see now that you remove an extra close() from coio_service_on_accept
in a separate patch. This is OK, but then please remove an extra close()
from iproto_on_accept in the same patch, not in patch 6, where you make
on_accept exception free.



More information about the Tarantool-patches mailing list