b_sock.c: bind/connect are picky about socket address length [from HEAD].

This commit is contained in:
Andy Polyakov 2010-01-07 13:15:39 +00:00
parent a32f7fb832
commit 0d8ffc2007

View File

@ -606,7 +606,7 @@ int BIO_get_accept_socket(char *host, int bind_mode)
struct sockaddr_in6 sa_in6; struct sockaddr_in6 sa_in6;
#endif #endif
} server,client; } server,client;
int s=INVALID_SOCKET,cs; int s=INVALID_SOCKET,cs,addrlen;
unsigned char ip[4]; unsigned char ip[4];
unsigned short port; unsigned short port;
char *str=NULL,*e; char *str=NULL,*e;
@ -677,8 +677,10 @@ int BIO_get_accept_socket(char *host, int bind_mode)
if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break; if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break;
memcpy(&server, res->ai_addr, addrlen = res->ai_addrlen<=sizeof(server) ?
res->ai_addrlen<=sizeof(server)?res->ai_addrlen:sizeof(server)); res->ai_addrlen :
sizeof(server);
memcpy(&server, res->ai_addr, addrlen);
(*p_freeaddrinfo.f)(res); (*p_freeaddrinfo.f)(res);
goto again; goto again;
@ -690,6 +692,7 @@ int BIO_get_accept_socket(char *host, int bind_mode)
memset((char *)&server,0,sizeof(server)); memset((char *)&server,0,sizeof(server));
server.sa_in.sin_family=AF_INET; server.sa_in.sin_family=AF_INET;
server.sa_in.sin_port=htons(port); server.sa_in.sin_port=htons(port);
addrlen = sizeof(server.sa_in);
if (h == NULL || strcmp(h,"*") == 0) if (h == NULL || strcmp(h,"*") == 0)
server.sa_in.sin_addr.s_addr=INADDR_ANY; server.sa_in.sin_addr.s_addr=INADDR_ANY;
@ -723,7 +726,7 @@ again:
bind_mode=BIO_BIND_NORMAL; bind_mode=BIO_BIND_NORMAL;
} }
#endif #endif
if (bind(s,&server.sa,sizeof(server)) == -1) if (bind(s,&server.sa,addrlen) == -1)
{ {
#ifdef SO_REUSEADDR #ifdef SO_REUSEADDR
err_num=get_last_socket_error(); err_num=get_last_socket_error();
@ -751,7 +754,7 @@ again:
if (cs != INVALID_SOCKET) if (cs != INVALID_SOCKET)
{ {
int ii; int ii;
ii=connect(cs,&client.sa,sizeof(client)); ii=connect(cs,&client.sa,addrlen);
closesocket(cs); closesocket(cs);
if (ii == INVALID_SOCKET) if (ii == INVALID_SOCKET)
{ {