• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* crypto/bio/b_sock.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 
59 #include <stdio.h>
60 #include <stdlib.h>
61 #include <errno.h>
62 #define USE_SOCKETS
63 #include "cryptlib.h"
64 #include <openssl/bio.h>
65 #if defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_BSDSOCK)
66 #include <netdb.h>
67 #if defined(NETWARE_CLIB)
68 #include <sys/ioctl.h>
69 NETDB_DEFINE_CONTEXT
70 #endif
71 #endif
72 
73 #ifndef OPENSSL_NO_SOCK
74 
75 #include <openssl/dso.h>
76 
77 #define SOCKET_PROTOCOL IPPROTO_TCP
78 
79 #ifdef SO_MAXCONN
80 #define MAX_LISTEN  SO_MAXCONN
81 #elif defined(SOMAXCONN)
82 #define MAX_LISTEN  SOMAXCONN
83 #else
84 #define MAX_LISTEN  32
85 #endif
86 
87 #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK))
88 static int wsa_init_done=0;
89 #endif
90 
91 /*
92  * WSAAPI specifier is required to make indirect calls to run-time
93  * linked WinSock 2 functions used in this module, to be specific
94  * [get|free]addrinfo and getnameinfo. This is because WinSock uses
95  * uses non-C calling convention, __stdcall vs. __cdecl, on x86
96  * Windows. On non-WinSock platforms WSAAPI needs to be void.
97  */
98 #ifndef WSAAPI
99 #define WSAAPI
100 #endif
101 
102 #if 0
103 static unsigned long BIO_ghbn_hits=0L;
104 static unsigned long BIO_ghbn_miss=0L;
105 
106 #define GHBN_NUM	4
107 static struct ghbn_cache_st
108 	{
109 	char name[129];
110 	struct hostent *ent;
111 	unsigned long order;
112 	} ghbn_cache[GHBN_NUM];
113 #endif
114 
115 static int get_ip(const char *str,unsigned char *ip);
116 #if 0
117 static void ghbn_free(struct hostent *a);
118 static struct hostent *ghbn_dup(struct hostent *a);
119 #endif
BIO_get_host_ip(const char * str,unsigned char * ip)120 int BIO_get_host_ip(const char *str, unsigned char *ip)
121 	{
122 	int i;
123 	int err = 1;
124 	int locked = 0;
125 	struct hostent *he;
126 
127 	i=get_ip(str,ip);
128 	if (i < 0)
129 		{
130 		BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS);
131 		goto err;
132 		}
133 
134 	/* At this point, we have something that is most probably correct
135 	   in some way, so let's init the socket. */
136 	if (BIO_sock_init() != 1)
137 		return 0; /* don't generate another error code here */
138 
139 	/* If the string actually contained an IP address, we need not do
140 	   anything more */
141 	if (i > 0) return(1);
142 
143 	/* do a gethostbyname */
144 	CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
145 	locked = 1;
146 	he=BIO_gethostbyname(str);
147 	if (he == NULL)
148 		{
149 		BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP);
150 		goto err;
151 		}
152 
153 	/* cast to short because of win16 winsock definition */
154 	if ((short)he->h_addrtype != AF_INET)
155 		{
156 		BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET);
157 		goto err;
158 		}
159 	for (i=0; i<4; i++)
160 		ip[i]=he->h_addr_list[0][i];
161 	err = 0;
162 
163  err:
164 	if (locked)
165 		CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
166 	if (err)
167 		{
168 		ERR_add_error_data(2,"host=",str);
169 		return 0;
170 		}
171 	else
172 		return 1;
173 	}
174 
BIO_get_port(const char * str,unsigned short * port_ptr)175 int BIO_get_port(const char *str, unsigned short *port_ptr)
176 	{
177 	int i;
178 	struct servent *s;
179 
180 	if (str == NULL)
181 		{
182 		BIOerr(BIO_F_BIO_GET_PORT,BIO_R_NO_PORT_DEFINED);
183 		return(0);
184 		}
185 	i=atoi(str);
186 	if (i != 0)
187 		*port_ptr=(unsigned short)i;
188 	else
189 		{
190 		CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME);
191 		/* Note: under VMS with SOCKETSHR, it seems like the first
192 		 * parameter is 'char *', instead of 'const char *'
193 		 */
194 #ifndef CONST_STRICT
195 		s=getservbyname((char *)str,"tcp");
196 #else
197 		s=getservbyname(str,"tcp");
198 #endif
199 		if(s != NULL)
200 			*port_ptr=ntohs((unsigned short)s->s_port);
201 		CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME);
202 		if(s == NULL)
203 			{
204 			if (strcmp(str,"http") == 0)
205 				*port_ptr=80;
206 			else if (strcmp(str,"telnet") == 0)
207 				*port_ptr=23;
208 			else if (strcmp(str,"socks") == 0)
209 				*port_ptr=1080;
210 			else if (strcmp(str,"https") == 0)
211 				*port_ptr=443;
212 			else if (strcmp(str,"ssl") == 0)
213 				*port_ptr=443;
214 			else if (strcmp(str,"ftp") == 0)
215 				*port_ptr=21;
216 			else if (strcmp(str,"gopher") == 0)
217 				*port_ptr=70;
218 #if 0
219 			else if (strcmp(str,"wais") == 0)
220 				*port_ptr=21;
221 #endif
222 			else
223 				{
224 				SYSerr(SYS_F_GETSERVBYNAME,get_last_socket_error());
225 				ERR_add_error_data(3,"service='",str,"'");
226 				return(0);
227 				}
228 			}
229 		}
230 	return(1);
231 	}
232 
BIO_sock_error(int sock)233 int BIO_sock_error(int sock)
234 	{
235 	int j,i;
236 	int size;
237 
238 #if defined(OPENSSL_SYS_BEOS_R5)
239 	return 0;
240 #endif
241 
242 	size=sizeof(int);
243 	/* Note: under Windows the third parameter is of type (char *)
244 	 * whereas under other systems it is (void *) if you don't have
245 	 * a cast it will choke the compiler: if you do have a cast then
246 	 * you can either go for (char *) or (void *).
247 	 */
248 	i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size);
249 	if (i < 0)
250 		return(1);
251 	else
252 		return(j);
253 	}
254 
255 #if 0
256 long BIO_ghbn_ctrl(int cmd, int iarg, char *parg)
257 	{
258 	int i;
259 	char **p;
260 
261 	switch (cmd)
262 		{
263 	case BIO_GHBN_CTRL_HITS:
264 		return(BIO_ghbn_hits);
265 		/* break; */
266 	case BIO_GHBN_CTRL_MISSES:
267 		return(BIO_ghbn_miss);
268 		/* break; */
269 	case BIO_GHBN_CTRL_CACHE_SIZE:
270 		return(GHBN_NUM);
271 		/* break; */
272 	case BIO_GHBN_CTRL_GET_ENTRY:
273 		if ((iarg >= 0) && (iarg <GHBN_NUM) &&
274 			(ghbn_cache[iarg].order > 0))
275 			{
276 			p=(char **)parg;
277 			if (p == NULL) return(0);
278 			*p=ghbn_cache[iarg].name;
279 			ghbn_cache[iarg].name[128]='\0';
280 			return(1);
281 			}
282 		return(0);
283 		/* break; */
284 	case BIO_GHBN_CTRL_FLUSH:
285 		for (i=0; i<GHBN_NUM; i++)
286 			ghbn_cache[i].order=0;
287 		break;
288 	default:
289 		return(0);
290 		}
291 	return(1);
292 	}
293 #endif
294 
295 #if 0
296 static struct hostent *ghbn_dup(struct hostent *a)
297 	{
298 	struct hostent *ret;
299 	int i,j;
300 
301 	MemCheck_off();
302 	ret=(struct hostent *)OPENSSL_malloc(sizeof(struct hostent));
303 	if (ret == NULL) return(NULL);
304 	memset(ret,0,sizeof(struct hostent));
305 
306 	for (i=0; a->h_aliases[i] != NULL; i++)
307 		;
308 	i++;
309 	ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *));
310 	if (ret->h_aliases == NULL)
311 		goto err;
312 	memset(ret->h_aliases, 0, i*sizeof(char *));
313 
314 	for (i=0; a->h_addr_list[i] != NULL; i++)
315 		;
316 	i++;
317 	ret->h_addr_list=(char **)OPENSSL_malloc(i*sizeof(char *));
318 	if (ret->h_addr_list == NULL)
319 		goto err;
320 	memset(ret->h_addr_list, 0, i*sizeof(char *));
321 
322 	j=strlen(a->h_name)+1;
323 	if ((ret->h_name=OPENSSL_malloc(j)) == NULL) goto err;
324 	memcpy((char *)ret->h_name,a->h_name,j);
325 	for (i=0; a->h_aliases[i] != NULL; i++)
326 		{
327 		j=strlen(a->h_aliases[i])+1;
328 		if ((ret->h_aliases[i]=OPENSSL_malloc(j)) == NULL) goto err;
329 		memcpy(ret->h_aliases[i],a->h_aliases[i],j);
330 		}
331 	ret->h_length=a->h_length;
332 	ret->h_addrtype=a->h_addrtype;
333 	for (i=0; a->h_addr_list[i] != NULL; i++)
334 		{
335 		if ((ret->h_addr_list[i]=OPENSSL_malloc(a->h_length)) == NULL)
336 			goto err;
337 		memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length);
338 		}
339 	if (0)
340 		{
341 err:
342 		if (ret != NULL)
343 			ghbn_free(ret);
344 		ret=NULL;
345 		}
346 	MemCheck_on();
347 	return(ret);
348 	}
349 
350 static void ghbn_free(struct hostent *a)
351 	{
352 	int i;
353 
354 	if(a == NULL)
355 	    return;
356 
357 	if (a->h_aliases != NULL)
358 		{
359 		for (i=0; a->h_aliases[i] != NULL; i++)
360 			OPENSSL_free(a->h_aliases[i]);
361 		OPENSSL_free(a->h_aliases);
362 		}
363 	if (a->h_addr_list != NULL)
364 		{
365 		for (i=0; a->h_addr_list[i] != NULL; i++)
366 			OPENSSL_free(a->h_addr_list[i]);
367 		OPENSSL_free(a->h_addr_list);
368 		}
369 	if (a->h_name != NULL) OPENSSL_free(a->h_name);
370 	OPENSSL_free(a);
371 	}
372 
373 #endif
374 
BIO_gethostbyname(const char * name)375 struct hostent *BIO_gethostbyname(const char *name)
376 	{
377 #if 1
378 	/* Caching gethostbyname() results forever is wrong,
379 	 * so we have to let the true gethostbyname() worry about this */
380 #if (defined(NETWARE_BSDSOCK) && !defined(__NOVELL_LIBC__))
381 	return gethostbyname((char*)name);
382 #else
383 	return gethostbyname(name);
384 #endif
385 #else
386 	struct hostent *ret;
387 	int i,lowi=0,j;
388 	unsigned long low= (unsigned long)-1;
389 
390 
391 #  if 0
392 	/* It doesn't make sense to use locking here: The function interface
393 	 * is not thread-safe, because threads can never be sure when
394 	 * some other thread destroys the data they were given a pointer to.
395 	 */
396 	CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
397 #  endif
398 	j=strlen(name);
399 	if (j < 128)
400 		{
401 		for (i=0; i<GHBN_NUM; i++)
402 			{
403 			if (low > ghbn_cache[i].order)
404 				{
405 				low=ghbn_cache[i].order;
406 				lowi=i;
407 				}
408 			if (ghbn_cache[i].order > 0)
409 				{
410 				if (strncmp(name,ghbn_cache[i].name,128) == 0)
411 					break;
412 				}
413 			}
414 		}
415 	else
416 		i=GHBN_NUM;
417 
418 	if (i == GHBN_NUM) /* no hit*/
419 		{
420 		BIO_ghbn_miss++;
421 		/* Note: under VMS with SOCKETSHR, it seems like the first
422 		 * parameter is 'char *', instead of 'const char *'
423 		 */
424 #  ifndef CONST_STRICT
425 		ret=gethostbyname((char *)name);
426 #  else
427 		ret=gethostbyname(name);
428 #  endif
429 
430 		if (ret == NULL)
431 			goto end;
432 		if (j > 128) /* too big to cache */
433 			{
434 #  if 0
435 			/* If we were trying to make this function thread-safe (which
436 			 * is bound to fail), we'd have to give up in this case
437 			 * (or allocate more memory). */
438 			ret = NULL;
439 #  endif
440 			goto end;
441 			}
442 
443 		/* else add to cache */
444 		if (ghbn_cache[lowi].ent != NULL)
445 			ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */
446 		ghbn_cache[lowi].name[0] = '\0';
447 
448 		if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL)
449 			{
450 			BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE);
451 			goto end;
452 			}
453 		strncpy(ghbn_cache[lowi].name,name,128);
454 		ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits;
455 		}
456 	else
457 		{
458 		BIO_ghbn_hits++;
459 		ret= ghbn_cache[i].ent;
460 		ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits;
461 		}
462 end:
463 #  if 0
464 	CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
465 #  endif
466 	return(ret);
467 #endif
468 	}
469 
470 
BIO_sock_init(void)471 int BIO_sock_init(void)
472 	{
473 #ifdef OPENSSL_SYS_WINDOWS
474 	static struct WSAData wsa_state;
475 
476 	if (!wsa_init_done)
477 		{
478 		int err;
479 
480 		wsa_init_done=1;
481 		memset(&wsa_state,0,sizeof(wsa_state));
482 		/* Not making wsa_state available to the rest of the
483 		 * code is formally wrong. But the structures we use
484 		 * are [beleived to be] invariable among Winsock DLLs,
485 		 * while API availability is [expected to be] probed
486 		 * at run-time with DSO_global_lookup. */
487 		if (WSAStartup(0x0202,&wsa_state)!=0)
488 			{
489 			err=WSAGetLastError();
490 			SYSerr(SYS_F_WSASTARTUP,err);
491 			BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP);
492 			return(-1);
493 			}
494 		}
495 #endif /* OPENSSL_SYS_WINDOWS */
496 #ifdef WATT32
497 	extern int _watt_do_exit;
498 	_watt_do_exit = 0;    /* don't make sock_init() call exit() */
499 	if (sock_init())
500 		return (-1);
501 #endif
502 
503 #if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
504     WORD wVerReq;
505     WSADATA wsaData;
506     int err;
507 
508     if (!wsa_init_done)
509     {
510         wsa_init_done=1;
511         wVerReq = MAKEWORD( 2, 0 );
512         err = WSAStartup(wVerReq,&wsaData);
513         if (err != 0)
514         {
515             SYSerr(SYS_F_WSASTARTUP,err);
516             BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP);
517             return(-1);
518 			}
519 		}
520 #endif
521 
522 	return(1);
523 	}
524 
BIO_sock_cleanup(void)525 void BIO_sock_cleanup(void)
526 	{
527 #ifdef OPENSSL_SYS_WINDOWS
528 	if (wsa_init_done)
529 		{
530 		wsa_init_done=0;
531 #if 0		/* this call is claimed to be non-present in Winsock2 */
532 		WSACancelBlockingCall();
533 #endif
534 		WSACleanup();
535 		}
536 #elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
537    if (wsa_init_done)
538         {
539         wsa_init_done=0;
540         WSACleanup();
541 		}
542 #endif
543 	}
544 
545 #if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000
546 
BIO_socket_ioctl(int fd,long type,void * arg)547 int BIO_socket_ioctl(int fd, long type, void *arg)
548 	{
549 	int i;
550 
551 #ifdef __DJGPP__
552 	i=ioctlsocket(fd,type,(char *)arg);
553 #else
554 	i=ioctlsocket(fd,type,arg);
555 #endif /* __DJGPP__ */
556 	if (i < 0)
557 		SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error());
558 	return(i);
559 	}
560 #endif /* __VMS_VER */
561 
562 /* The reason I have implemented this instead of using sscanf is because
563  * Visual C 1.52c gives an unresolved external when linking a DLL :-( */
get_ip(const char * str,unsigned char ip[4])564 static int get_ip(const char *str, unsigned char ip[4])
565 	{
566 	unsigned int tmp[4];
567 	int num=0,c,ok=0;
568 
569 	tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
570 
571 	for (;;)
572 		{
573 		c= *(str++);
574 		if ((c >= '0') && (c <= '9'))
575 			{
576 			ok=1;
577 			tmp[num]=tmp[num]*10+c-'0';
578 			if (tmp[num] > 255) return(0);
579 			}
580 		else if (c == '.')
581 			{
582 			if (!ok) return(-1);
583 			if (num == 3) return(0);
584 			num++;
585 			ok=0;
586 			}
587 		else if (c == '\0' && (num == 3) && ok)
588 			break;
589 		else
590 			return(0);
591 		}
592 	ip[0]=tmp[0];
593 	ip[1]=tmp[1];
594 	ip[2]=tmp[2];
595 	ip[3]=tmp[3];
596 	return(1);
597 	}
598 
BIO_get_accept_socket(char * host,int bind_mode)599 int BIO_get_accept_socket(char *host, int bind_mode)
600 	{
601 	int ret=0;
602 	union {
603 		struct sockaddr sa;
604 		struct sockaddr_in sa_in;
605 #if OPENSSL_USE_IPV6
606 		struct sockaddr_in6 sa_in6;
607 #endif
608 	} server,client;
609 	int s=INVALID_SOCKET,cs,addrlen;
610 	unsigned char ip[4];
611 	unsigned short port;
612 	char *str=NULL,*e;
613 	char *h,*p;
614 	unsigned long l;
615 	int err_num;
616 
617 	if (BIO_sock_init() != 1) return(INVALID_SOCKET);
618 
619 	if ((str=BUF_strdup(host)) == NULL) return(INVALID_SOCKET);
620 
621 	h=p=NULL;
622 	h=str;
623 	for (e=str; *e; e++)
624 		{
625 		if (*e == ':')
626 			{
627 			p=e;
628 			}
629 		else if (*e == '/')
630 			{
631 			*e='\0';
632 			break;
633 			}
634 		}
635 	if (p)	*p++='\0';	/* points at last ':', '::port' is special [see below] */
636 	else	p=h,h=NULL;
637 
638 #ifdef EAI_FAMILY
639 	do {
640 	static union {	void *p;
641 			int (WSAAPI *f)(const char *,const char *,
642 				 const struct addrinfo *,
643 				 struct addrinfo **);
644 			} p_getaddrinfo = {NULL};
645 	static union {	void *p;
646 			void (WSAAPI *f)(struct addrinfo *);
647 			} p_freeaddrinfo = {NULL};
648 	struct addrinfo *res,hint;
649 
650 	if (p_getaddrinfo.p==NULL)
651 		{
652 		if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL ||
653 		    (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL)
654 			p_getaddrinfo.p=(void*)-1;
655 		}
656 	if (p_getaddrinfo.p==(void *)-1) break;
657 
658 	/* '::port' enforces IPv6 wildcard listener. Some OSes,
659 	 * e.g. Solaris, default to IPv6 without any hint. Also
660 	 * note that commonly IPv6 wildchard socket can service
661 	 * IPv4 connections just as well...  */
662 	memset(&hint,0,sizeof(hint));
663 	if (h)
664 		{
665 		if (strchr(h,':'))
666 			{
667 			if (h[1]=='\0') h=NULL;
668 #if OPENSSL_USE_IPV6
669 			hint.ai_family = AF_INET6;
670 #else
671 			h=NULL;
672 #endif
673 			}
674 	    	else if (h[0]=='*' && h[1]=='\0')
675 			h=NULL;
676 		}
677 
678 	if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break;
679 
680 	addrlen = res->ai_addrlen<=sizeof(server) ?
681 			res->ai_addrlen :
682 			sizeof(server);
683 	memcpy(&server, res->ai_addr, addrlen);
684 
685 	(*p_freeaddrinfo.f)(res);
686 	goto again;
687 	} while (0);
688 #endif
689 
690 	if (!BIO_get_port(p,&port)) goto err;
691 
692 	memset((char *)&server,0,sizeof(server));
693 	server.sa_in.sin_family=AF_INET;
694 	server.sa_in.sin_port=htons(port);
695 	addrlen = sizeof(server.sa_in);
696 
697 	if (h == NULL || strcmp(h,"*") == 0)
698 		server.sa_in.sin_addr.s_addr=INADDR_ANY;
699 	else
700 		{
701                 if (!BIO_get_host_ip(h,&(ip[0]))) goto err;
702 		l=(unsigned long)
703 			((unsigned long)ip[0]<<24L)|
704 			((unsigned long)ip[1]<<16L)|
705 			((unsigned long)ip[2]<< 8L)|
706 			((unsigned long)ip[3]);
707 		server.sa_in.sin_addr.s_addr=htonl(l);
708 		}
709 
710 again:
711 	s=socket(server.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL);
712 	if (s == INVALID_SOCKET)
713 		{
714 		SYSerr(SYS_F_SOCKET,get_last_socket_error());
715 		ERR_add_error_data(3,"port='",host,"'");
716 		BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET);
717 		goto err;
718 		}
719 
720 #ifdef SO_REUSEADDR
721 	if (bind_mode == BIO_BIND_REUSEADDR)
722 		{
723 		int i=1;
724 
725 		ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i));
726 		bind_mode=BIO_BIND_NORMAL;
727 		}
728 #endif
729 	if (bind(s,&server.sa,addrlen) == -1)
730 		{
731 #ifdef SO_REUSEADDR
732 		err_num=get_last_socket_error();
733 		if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) &&
734 #ifdef OPENSSL_SYS_WINDOWS
735 			/* Some versions of Windows define EADDRINUSE to
736 			 * a dummy value.
737 			 */
738 			(err_num == WSAEADDRINUSE))
739 #else
740 			(err_num == EADDRINUSE))
741 #endif
742 			{
743 			client = server;
744 			if (h == NULL || strcmp(h,"*") == 0)
745 				{
746 #if OPENSSL_USE_IPV6
747 				if (client.sa.sa_family == AF_INET6)
748 					{
749 					memset(&client.sa_in6.sin6_addr,0,sizeof(client.sa_in6.sin6_addr));
750 					client.sa_in6.sin6_addr.s6_addr[15]=1;
751 					}
752 				else
753 #endif
754 				if (client.sa.sa_family == AF_INET)
755 					{
756 					client.sa_in.sin_addr.s_addr=htonl(0x7F000001);
757 					}
758 				else	goto err;
759 				}
760 			cs=socket(client.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL);
761 			if (cs != INVALID_SOCKET)
762 				{
763 				int ii;
764 				ii=connect(cs,&client.sa,addrlen);
765 				closesocket(cs);
766 				if (ii == INVALID_SOCKET)
767 					{
768 					bind_mode=BIO_BIND_REUSEADDR;
769 					closesocket(s);
770 					goto again;
771 					}
772 				/* else error */
773 				}
774 			/* else error */
775 			}
776 #endif
777 		SYSerr(SYS_F_BIND,err_num);
778 		ERR_add_error_data(3,"port='",host,"'");
779 		BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET);
780 		goto err;
781 		}
782 	if (listen(s,MAX_LISTEN) == -1)
783 		{
784 		SYSerr(SYS_F_BIND,get_last_socket_error());
785 		ERR_add_error_data(3,"port='",host,"'");
786 		BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET);
787 		goto err;
788 		}
789 	ret=1;
790 err:
791 	if (str != NULL) OPENSSL_free(str);
792 	if ((ret == 0) && (s != INVALID_SOCKET))
793 		{
794 		closesocket(s);
795 		s= INVALID_SOCKET;
796 		}
797 	return(s);
798 	}
799 
BIO_accept(int sock,char ** addr)800 int BIO_accept(int sock, char **addr)
801 	{
802 	int ret=INVALID_SOCKET;
803 	unsigned long l;
804 	unsigned short port;
805 	char *p;
806 
807 	struct {
808 	/*
809 	 * As for following union. Trouble is that there are platforms
810 	 * that have socklen_t and there are platforms that don't, on
811 	 * some platforms socklen_t is int and on some size_t. So what
812 	 * one can do? One can cook #ifdef spaghetti, which is nothing
813 	 * but masochistic. Or one can do union between int and size_t.
814 	 * One naturally does it primarily for 64-bit platforms where
815 	 * sizeof(int) != sizeof(size_t). But would it work? Note that
816 	 * if size_t member is initialized to 0, then later int member
817 	 * assignment naturally does the job on little-endian platforms
818 	 * regardless accept's expectations! What about big-endians?
819 	 * If accept expects int*, then it works, and if size_t*, then
820 	 * length value would appear as unreasonably large. But this
821 	 * won't prevent it from filling in the address structure. The
822 	 * trouble of course would be if accept returns more data than
823 	 * actual buffer can accomodate and overwrite stack... That's
824 	 * where early OPENSSL_assert comes into picture. Besides, the
825 	 * only 64-bit big-endian platform found so far that expects
826 	 * size_t* is HP-UX, where stack grows towards higher address.
827 	 * <appro>
828 	 */
829 	union { size_t s; int i; } len;
830 	union {
831 		struct sockaddr sa;
832 		struct sockaddr_in sa_in;
833 #if OPENSSL_USE_IPV6
834 		struct sockaddr_in6 sa_in6;
835 #endif
836 		} from;
837 	} sa;
838 
839 	sa.len.s=0;
840 	sa.len.i=sizeof(sa.from);
841 	memset(&sa.from,0,sizeof(sa.from));
842 	ret=accept(sock,&sa.from.sa,(void *)&sa.len);
843 	if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0)
844 		{
845 		OPENSSL_assert(sa.len.s<=sizeof(sa.from));
846 		sa.len.i = (int)sa.len.s;
847 		/* use sa.len.i from this point */
848 		}
849 	if (ret == INVALID_SOCKET)
850 		{
851 		if(BIO_sock_should_retry(ret)) return -2;
852 		SYSerr(SYS_F_ACCEPT,get_last_socket_error());
853 		BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR);
854 		goto end;
855 		}
856 
857 	if (addr == NULL) goto end;
858 
859 #ifdef EAI_FAMILY
860 	do {
861 	char   h[NI_MAXHOST],s[NI_MAXSERV];
862 	size_t nl;
863 	static union {	void *p;
864 			int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/,
865 				 char *,size_t,char *,size_t,int);
866 			} p_getnameinfo = {NULL};
867 			/* 2nd argument to getnameinfo is specified to
868 			 * be socklen_t. Unfortunately there is a number
869 			 * of environments where socklen_t is not defined.
870 			 * As it's passed by value, it's safe to pass it
871 			 * as size_t... <appro> */
872 
873 	if (p_getnameinfo.p==NULL)
874 		{
875 		if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL)
876 			p_getnameinfo.p=(void*)-1;
877 		}
878 	if (p_getnameinfo.p==(void *)-1) break;
879 
880 	if ((*p_getnameinfo.f)(&sa.from.sa,sa.len.i,h,sizeof(h),s,sizeof(s),
881 	    NI_NUMERICHOST|NI_NUMERICSERV)) break;
882 	nl = strlen(h)+strlen(s)+2;
883 	p = *addr;
884 	if (p)	{ *p = '\0'; p = OPENSSL_realloc(p,nl);	}
885 	else	{ p = OPENSSL_malloc(nl);		}
886 	if (p==NULL)
887 		{
888 		BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
889 		goto end;
890 		}
891 	*addr = p;
892 	BIO_snprintf(*addr,nl,"%s:%s",h,s);
893 	goto end;
894 	} while(0);
895 #endif
896 	if (sa.from.sa.sa_family != AF_INET) goto end;
897 	l=ntohl(sa.from.sa_in.sin_addr.s_addr);
898 	port=ntohs(sa.from.sa_in.sin_port);
899 	if (*addr == NULL)
900 		{
901 		if ((p=OPENSSL_malloc(24)) == NULL)
902 			{
903 			BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
904 			goto end;
905 			}
906 		*addr=p;
907 		}
908 	BIO_snprintf(*addr,24,"%d.%d.%d.%d:%d",
909 		     (unsigned char)(l>>24L)&0xff,
910 		     (unsigned char)(l>>16L)&0xff,
911 		     (unsigned char)(l>> 8L)&0xff,
912 		     (unsigned char)(l     )&0xff,
913 		     port);
914 end:
915 	return(ret);
916 	}
917 
BIO_set_tcp_ndelay(int s,int on)918 int BIO_set_tcp_ndelay(int s, int on)
919 	{
920 	int ret=0;
921 #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP))
922 	int opt;
923 
924 #ifdef SOL_TCP
925 	opt=SOL_TCP;
926 #else
927 #ifdef IPPROTO_TCP
928 	opt=IPPROTO_TCP;
929 #endif
930 #endif
931 
932 	ret=setsockopt(s,opt,TCP_NODELAY,(char *)&on,sizeof(on));
933 #endif
934 	return(ret == 0);
935 	}
936 #endif
937 
BIO_socket_nbio(int s,int mode)938 int BIO_socket_nbio(int s, int mode)
939 	{
940 	int ret= -1;
941 	int l;
942 
943 	l=mode;
944 #ifdef FIONBIO
945 	ret=BIO_socket_ioctl(s,FIONBIO,&l);
946 #endif
947 	return(ret == 0);
948 	}
949