On Tue, Jul 25, 2017 at 1:19 AM,  <yla...@apache.org> wrote:
>
> New abort_socket_nonblocking() allows to reset connections when nonblocking is
> required and we can't do much about the connection anymore, nor want the 
> system
> to linger on its own after close().
>
[]
>
> +static void abort_socket_nonblocking(apr_socket_t *csd)
> +{
> +    apr_status_t rv;
> +    apr_socket_timeout_set(csd, 0);
> +#if defined(SOL_SOCKET) && defined(SO_LINGER)
> +    /* This socket is over now, and we don't want to block nor linger
> +     * anymore, so reset it. A normal close could still linger in the
> +     * system, while RST is fast, nonblocking, and what the peer will
> +     * get if it sends us further data anyway.
> +     */
> +    {
> +        apr_os_sock_t osd = -1;
> +        struct linger opt;
> +        opt.l_onoff = 1;
> +        opt.l_linger = 0; /* zero timeout is RST */
> +        apr_os_sock_get(&osd, csd);
> +        setsockopt(osd, SOL_SOCKET, SO_LINGER, (void *)&opt, sizeof opt);
> +    }
> +#endif
> +    rv = apr_socket_close(csd);
> +    if (rv != APR_SUCCESS) {
> +        ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, 
> APLOGNO(00468)
> +                     "error closing socket");
> +        AP_DEBUG_ASSERT(0);
> +    }
> +}

This change may be disputable...

I wanted to:
1. avoid blocking in any case (we can't where this is called),
2. avoid issueing a nonblocking "normal" close() which lets the system handle
   the burden of possibly leaking descriptors (until its own linger is done).

Objections?

Reply via email to