summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2010-06-07 16:53:31 +0200
committerYang Tse <yangsita@gmail.com>2010-06-07 16:53:31 +0200
commitf737e94164fd33cbb03a559ff51d4b4db59902ea (patch)
tree78a6634fbb75b4629647c73f17b460d501e16377 /lib
parenta0dd9df9ab35528eb9eb669e741a5df4b1fb833c (diff)
downloadcurl-f737e94164fd33cbb03a559ff51d4b4db59902ea.tar.gz
Curl_updateconninfo() error handling fix
Diffstat (limited to 'lib')
-rw-r--r--lib/connect.c62
-rw-r--r--lib/connect.h2
-rw-r--r--lib/url.c2
3 files changed, 51 insertions, 15 deletions
diff --git a/lib/connect.c b/lib/connect.c
index 207956693..51d117389 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -524,9 +524,10 @@ static bool trynextip(struct connectdata *conn,
}
/* retrieves ip address and port from a sockaddr structure */
-static void getaddressinfo(struct sockaddr* sa, char* addr,
+static bool getaddressinfo(struct sockaddr* sa, char* addr,
long* port)
{
+ unsigned short us_port;
struct sockaddr_in* si = NULL;
#ifdef ENABLE_IPV6
struct sockaddr_in6* si6 = NULL;
@@ -535,36 +536,71 @@ static void getaddressinfo(struct sockaddr* sa, char* addr,
switch (sa->sa_family) {
case AF_INET:
si = (struct sockaddr_in*) sa;
- Curl_inet_ntop(sa->sa_family, &(si->sin_addr), addr, MAX_IPADR_LEN);
- *port = ntohs(si->sin_port);
+ if(Curl_inet_ntop(sa->sa_family, &si->sin_addr,
+ addr, MAX_IPADR_LEN) != 0)
+ return FALSE;
+ us_port = ntohs(si->sin_port);
+ *port = us_port;
break;
#ifdef ENABLE_IPV6
case AF_INET6:
si6 = (struct sockaddr_in6*)sa;
- Curl_inet_ntop(sa->sa_family, &(si6->sin6_addr), addr, MAX_IPADR_LEN);
- *port = ntohs(si6->sin6_port);
+ if(Curl_inet_ntop(sa->sa_family, &si6->sin6_addr,
+ addr, MAX_IPADR_LEN) != 0)
+ return FALSE;
+ us_port = ntohs(si6->sin6_port);
+ *port = us_port;
break;
#endif
default:
addr[0] = '\0';
*port = 0;
}
+ return TRUE;
}
/* retrieves the start/end point information of a socket of an established
connection */
-void Curl_updateconninfo(curl_socket_t sockfd, struct PureInfo* info)
+void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
{
+ int error;
+ curl_socklen_t len;
struct Curl_sockaddr_storage ssrem;
struct Curl_sockaddr_storage ssloc;
+ struct SessionHandle *data = conn->data;
+ struct PureInfo *info = &conn->data->info;
+
+ len = sizeof(struct Curl_sockaddr_storage);
+ if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) {
+ error = SOCKERRNO;
+ failf(data, "getpeername() failed with errno %d: %s",
+ error, Curl_strerror(conn, error));
+ return;
+ }
- curl_socklen_t len = sizeof(struct Curl_sockaddr_storage);
+ len = sizeof(struct Curl_sockaddr_storage);
+ if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) {
+ error = SOCKERRNO;
+ failf(data, "getsockname() failed with errno %d: %s",
+ error, Curl_strerror(conn, error));
+ return;
+ }
- getpeername(sockfd, (struct sockaddr*) &ssrem, &len);
- getsockname(sockfd, (struct sockaddr*) &ssloc, &len);
+ if(!getaddressinfo((struct sockaddr*)&ssrem,
+ info->ip, &info->port)) {
+ error = ERRNO;
+ failf(data, "ssrem inet_ntop() failed with errno %d: %s",
+ error, Curl_strerror(conn, error));
+ return;
+ }
- getaddressinfo((struct sockaddr*)&ssrem, info->ip, &info->port);
- getaddressinfo((struct sockaddr*)&ssloc, info->localip, &info->localport);
+ if(!getaddressinfo((struct sockaddr*)&ssloc,
+ info->localip, &info->localport)) {
+ error = ERRNO;
+ failf(data, "ssloc inet_ntop() failed with errno %d: %s",
+ error, Curl_strerror(conn, error));
+ return;
+ }
}
/*
@@ -621,7 +657,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
*connected = TRUE;
Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */
Curl_verboseconnect(conn);
- Curl_updateconninfo(sockfd, &(data->info));
+ Curl_updateconninfo(conn, sockfd);
return CURLE_OK;
}
@@ -912,7 +948,7 @@ singleipconnect(struct connectdata *conn,
/* we are connected, awesome! */
*connected = TRUE; /* this is a true connect */
infof(data, "connected\n");
- Curl_updateconninfo(sockfd, &(data->info));
+ Curl_updateconninfo(conn, sockfd);
return sockfd;
}
else if(WAITCONN_TIMEOUT == rc)
diff --git a/lib/connect.h b/lib/connect.h
index b365f7d0c..57b1c2f2d 100644
--- a/lib/connect.h
+++ b/lib/connect.h
@@ -68,6 +68,6 @@ void Curl_sndbufset(curl_socket_t sockfd);
#define Curl_sndbufset(y)
#endif
-void Curl_updateconninfo(curl_socket_t sockfd, struct PureInfo* info);
+void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd);
#endif
diff --git a/lib/url.c b/lib/url.c
index 8a59be2d4..897ff2c12 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -5031,7 +5031,7 @@ static CURLcode setup_conn(struct connectdata *conn,
conn->bits.tcpconnect = TRUE;
*protocol_done = TRUE;
Curl_verboseconnect(conn);
- Curl_updateconninfo(conn->sock[FIRSTSOCKET], &data->info);
+ Curl_updateconninfo(conn, conn->sock[FIRSTSOCKET]);
}
/* Stop the loop now */
break;