X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=crypto%2Fbio%2Fb_sock.c;h=12b0a53a81c4fe066f6304b24fa32c94764f52d4;hb=e97359435ee15e6d2c0580c76a58040e8dc3ce60;hp=5dc6cf4595a6719c46008a15bb1499841907ab0e;hpb=f62d1ea3d5beb67e5e3deed6374a63dd03f2a230;p=oweals%2Fopenssl.git diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c index 5dc6cf4595..12b0a53a81 100644 --- a/crypto/bio/b_sock.c +++ b/crypto/bio/b_sock.c @@ -88,6 +88,17 @@ NETDB_DEFINE_CONTEXT static int wsa_init_done=0; #endif +/* + * WSAAPI specifier is required to make indirect calls to run-time + * linked WinSock 2 functions used in this module, to be specific + * [get|free]addrinfo and getnameinfo. This is because WinSock uses + * uses non-C calling convention, __stdcall vs. __cdecl, on x86 + * Windows. On non-WinSock platforms WSAAPI needs to be void. + */ +#ifndef WSAAPI +#define WSAAPI +#endif + #if 0 static unsigned long BIO_ghbn_hits=0L; static unsigned long BIO_ghbn_miss=0L; @@ -595,7 +606,7 @@ int BIO_get_accept_socket(char *host, int bind_mode) struct sockaddr_in6 sa_in6; #endif } server,client; - int s=INVALID_SOCKET,cs; + int s=INVALID_SOCKET,cs,addrlen; unsigned char ip[4]; unsigned short port; char *str=NULL,*e; @@ -627,12 +638,12 @@ int BIO_get_accept_socket(char *host, int bind_mode) #ifdef EAI_FAMILY do { static union { void *p; - int (*f)(const char *,const char *, + int (WSAAPI *f)(const char *,const char *, const struct addrinfo *, struct addrinfo **); } p_getaddrinfo = {NULL}; static union { void *p; - void (*f)(struct addrinfo *); + void (WSAAPI *f)(struct addrinfo *); } p_freeaddrinfo = {NULL}; struct addrinfo *res,hint; @@ -666,8 +677,10 @@ int BIO_get_accept_socket(char *host, int bind_mode) if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break; - memcpy(&server, res->ai_addr, - res->ai_addrlen<=sizeof(server)?res->ai_addrlen:sizeof(server)); + addrlen = res->ai_addrlen<=sizeof(server) ? + res->ai_addrlen : + sizeof(server); + memcpy(&server, res->ai_addr, addrlen); (*p_freeaddrinfo.f)(res); goto again; @@ -679,6 +692,7 @@ int BIO_get_accept_socket(char *host, int bind_mode) memset((char *)&server,0,sizeof(server)); server.sa_in.sin_family=AF_INET; server.sa_in.sin_port=htons(port); + addrlen = sizeof(server.sa_in); if (h == NULL || strcmp(h,"*") == 0) server.sa_in.sin_addr.s_addr=INADDR_ANY; @@ -712,12 +726,19 @@ again: bind_mode=BIO_BIND_NORMAL; } #endif - if (bind(s,&server.sa,sizeof(server)) == -1) + if (bind(s,&server.sa,addrlen) == -1) { #ifdef SO_REUSEADDR err_num=get_last_socket_error(); if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && +#ifdef OPENSSL_SYS_WINDOWS + /* Some versions of Windows define EADDRINUSE to + * a dummy value. + */ + (err_num == WSAEADDRINUSE)) +#else (err_num == EADDRINUSE)) +#endif { client = server; if (h == NULL || strcmp(h,"*") == 0) @@ -740,7 +761,7 @@ again: if (cs != INVALID_SOCKET) { int ii; - ii=connect(cs,&client.sa,sizeof(client)); + ii=connect(cs,&client.sa,addrlen); closesocket(cs); if (ii == INVALID_SOCKET) { @@ -822,7 +843,8 @@ int BIO_accept(int sock, char **addr) if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) { OPENSSL_assert(sa.len.s<=sizeof(sa.from)); - sa.len.i = (unsigned int)sa.len.s; + sa.len.i = (int)sa.len.s; + /* use sa.len.i from this point */ } if (ret == INVALID_SOCKET) { @@ -839,7 +861,7 @@ int BIO_accept(int sock, char **addr) char h[NI_MAXHOST],s[NI_MAXSERV]; size_t nl; static union { void *p; - int (*f)(const struct sockaddr *,size_t/*socklen_t*/, + int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/, char *,size_t,char *,size_t,int); } p_getnameinfo = {NULL}; /* 2nd argument to getnameinfo is specified to