Skip to content

Commit

Permalink
Fix errno usage in connect.c
Browse files Browse the repository at this point in the history
errno was used after it could've been modified by a subsequent library call.
Spotted by Morten Welinder.

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Petr Baudis authored and Junio C Hamano committed Jul 2, 2006
1 parent c64ea85 commit ac3bc6c
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ static enum protocol get_protocol(const char *name)
*/
static int git_tcp_connect_sock(char *host)
{
int sockfd = -1;
int sockfd = -1, saved_errno = 0;
char *colon, *end;
const char *port = STR(DEFAULT_GIT_PORT);
struct addrinfo hints, *ai0, *ai;
Expand Down Expand Up @@ -362,9 +362,12 @@ static int git_tcp_connect_sock(char *host)
for (ai0 = ai; ai; ai = ai->ai_next) {
sockfd = socket(ai->ai_family,
ai->ai_socktype, ai->ai_protocol);
if (sockfd < 0)
if (sockfd < 0) {
saved_errno = errno;
continue;
}
if (connect(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {
saved_errno = errno;
close(sockfd);
sockfd = -1;
continue;
Expand All @@ -375,7 +378,7 @@ static int git_tcp_connect_sock(char *host)
freeaddrinfo(ai0);

if (sockfd < 0)
die("unable to connect a socket (%s)", strerror(errno));
die("unable to connect a socket (%s)", strerror(saved_errno));

return sockfd;
}
Expand All @@ -387,7 +390,7 @@ static int git_tcp_connect_sock(char *host)
*/
static int git_tcp_connect_sock(char *host)
{
int sockfd = -1;
int sockfd = -1, saved_errno = 0;
char *colon, *end;
char *port = STR(DEFAULT_GIT_PORT), *ep;
struct hostent *he;
Expand Down Expand Up @@ -426,15 +429,18 @@ static int git_tcp_connect_sock(char *host)

for (ap = he->h_addr_list; *ap; ap++) {
sockfd = socket(he->h_addrtype, SOCK_STREAM, 0);
if (sockfd < 0)
if (sockfd < 0) {
saved_errno = errno;
continue;
}

memset(&sa, 0, sizeof sa);
sa.sin_family = he->h_addrtype;
sa.sin_port = htons(nport);
memcpy(&sa.sin_addr, *ap, he->h_length);

if (connect(sockfd, (struct sockaddr *)&sa, sizeof sa) < 0) {
saved_errno = errno;
close(sockfd);
sockfd = -1;
continue;
Expand All @@ -443,7 +449,7 @@ static int git_tcp_connect_sock(char *host)
}

if (sockfd < 0)
die("unable to connect a socket (%s)", strerror(errno));
die("unable to connect a socket (%s)", strerror(saved_errno));

return sockfd;
}
Expand Down

0 comments on commit ac3bc6c

Please sign in to comment.