Skip to content
Snippets Groups Projects
Commit a6c395c1 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Duncan Wilcox reported a crash with --interface on FreeBSD when ipv6-enabled

and this has been verified to correct the problem.
parent 543e0b1e
No related branches found
No related tags found
No related merge requests found
...@@ -251,14 +251,23 @@ static CURLcode bindlocal(struct connectdata *conn, ...@@ -251,14 +251,23 @@ static CURLcode bindlocal(struct connectdata *conn,
Curl_resolv_unlock(h); Curl_resolv_unlock(h);
/* we don't need it anymore after this function has returned */ /* we don't need it anymore after this function has returned */
memset((char *)&sa, 0, sizeof(sa));
#ifdef ENABLE_IPV6 #ifdef ENABLE_IPV6
memcpy((char *)&sa.sin_addr, addr->ai_addr, addr->ai_addrlen); (void)sa; /* prevent compiler warning */
sa.sin_family = addr->ai_family; if( bind(sockfd, addr->ai_addr, addr->ai_addrlen) >= 0) {
/* we succeeded to bind */
struct sockaddr_in6 add;
size = sizeof(add);
if(getsockname(sockfd, (struct sockaddr *) &add,
(socklen_t *)&size)<0) {
failf(data, "getsockname() failed");
return CURLE_HTTP_PORT_FAILED;
}
}
#else #else
memset((char *)&sa, 0, sizeof(sa));
memcpy((char *)&sa.sin_addr, addr->h_addr, addr->h_length); memcpy((char *)&sa.sin_addr, addr->h_addr, addr->h_length);
sa.sin_family = AF_INET; sa.sin_family = AF_INET;
#endif
sa.sin_addr.s_addr = in; sa.sin_addr.s_addr = in;
sa.sin_port = 0; /* get any port */ sa.sin_port = 0; /* get any port */
...@@ -273,6 +282,7 @@ static CURLcode bindlocal(struct connectdata *conn, ...@@ -273,6 +282,7 @@ static CURLcode bindlocal(struct connectdata *conn,
return CURLE_HTTP_PORT_FAILED; return CURLE_HTTP_PORT_FAILED;
} }
} }
#endif
else { else {
switch(errno) { switch(errno) {
case EBADF: case EBADF:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment