HomeFreeBSD

socket: Avoid clearing SS_ISCONNECTING if soconnect() fails

Description

socket: Avoid clearing SS_ISCONNECTING if soconnect() fails

This behaviour appears to date from the 4.4 BSD import. It has two
problems:

  1. The update to so_state is not protected by the socket lock, so concurrent updates to so_state may be lost.
  2. Suppose two threads race to call connect(2) on a socket, and one succeeds while the other fails. Then the failing thread may incorrectly clear SS_ISCONNECTING, confusing the state machine.

Simply remove the update. It does not appear to be necessary:
pru_connect implementations which call soisconnecting() only do so after
all failure modes have been handled. For instance, tcp_connect() and
tcp6_connect() will never return an error after calling soisconnected().
However, we cannot correctly assert that SS_ISCONNECTED is not set after
an error from soconnect() since the socket lock is not held across the
pru_connect call, so a concurrent connect(2) may have set the flag.

MFC after: 1 month
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D31699

Details

Provenance
markjAuthored on Sep 7 2021, 6:51 PM
Differential Revision
D31699: socket: Avoid clearing SS_ISCONNECTING if soconnect() fails
Parents
rGc4b44adcf0b6: sctp: Remove special handling for a listen(2) backlog of 0
Branches
Unknown
Tags
Unknown