libfetch: Fail hard if interrupted while connecting

This fixes an issue where the first address that DNS returns is blocked
by a packet filter, so we hang for a while, then the user hits Ctrl-C,
interrupting connect(2), whereupon we move on to the next address, get
a connection, request the file, and return to fetch(1), which sees that
SIGINT was caught and bails.

Note that we make no attempt to enforce fetchTimeout in the connection
phase, and never have.  It's feasible, but non-trivial, so we'll leave
it as an exercise for future us.

PR:		293312
MFC after:	1 week
Reviewed by:	imp
Differential Revision:	https://reviews.freebsd.org/D55406
This commit is contained in:
Dag-Erling Smørgrav
2026-02-21 02:18:15 +01:00
parent 1b7c4d29fd
commit afbdcd402b
+7 -1
View File
@@ -651,7 +651,13 @@ fetch_connect(const char *host, int port, int af, int verbose)
goto syserr;
}
/* attempt to connect to server address */
if ((err = connect(sd, sai->ai_addr, sai->ai_addrlen)) == 0)
while ((err = connect(sd, sai->ai_addr, sai->ai_addrlen)) < 0) {
if (errno == EINTR && fetchRestartCalls)
continue;
break;
}
/* success? */
if (err == 0)
break;
/* clean up before next attempt */
close(sd);