• Luca Boccassi's avatar
    Problem: peer can close connection before SO_NOSIGPIPE is set · 31a3a068
    Luca Boccassi authored
    Solution: setsockopt returns EINVAL if the connection was closed by
    the peer after the accept returned a valid socket. This is a valid
    network error and should not cause an assert.
    To handle this we have to extract the setsockopt from the stream
    engine, as there's no clean way to return an error from the
    constructor. Instead, try to set this option before creating the
    engine in the callers, and return immediately as if the accept
    had failed to avoid churn. Do the same for the connect calls by
    setting the option in open_socket, so that the option for that
    case is set even before connecting, so there's no possible race
    condition.
    Since this has to be done in 4 places (tcp/ipc listener, socks
    connecter and open_socket) add an utility function in ip.cpp.
    Fixes #1442
    31a3a068
ip.cpp 6.21 KB