OpenCoverage

b_sock.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/bio/b_sock.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/*-
2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.-
3 *-
4 * Licensed under the OpenSSL license (the "License"). You may not use-
5 * this file except in compliance with the License. You can obtain a copy-
6 * in the file LICENSE in the source distribution or at-
7 * https://www.openssl.org/source/license.html-
8 */-
9-
10#include <stdio.h>-
11#include <stdlib.h>-
12#include <errno.h>-
13#include "bio_lcl.h"-
14#ifndef OPENSSL_NO_SOCK-
15# define SOCKET_PROTOCOL IPPROTO_TCP-
16# ifdef SO_MAXCONN-
17# define MAX_LISTEN SO_MAXCONN-
18# elif defined(SOMAXCONN)-
19# define MAX_LISTEN SOMAXCONN-
20# else-
21# define MAX_LISTEN 32-
22# endif-
23# if defined(OPENSSL_SYS_WINDOWS)-
24static int wsa_init_done = 0;-
25# endif-
26-
27# if OPENSSL_API_COMPAT < 0x10100000L-
28int BIO_get_host_ip(const char *str, unsigned char *ip)-
29{-
30 BIO_ADDRINFO *res = NULL;-
31 int ret = 0;-
32-
33 if (BIO_sock_init() != 1)
BIO_sock_init() != 1Description
TRUEnever evaluated
FALSEnever evaluated
0
34 return 0; /* don't generate another error code here */
never executed: return 0;
0
35-
36 if (BIO_lookup(str, NULL, BIO_LOOKUP_CLIENT, AF_INET, SOCK_STREAM, &res)) {
BIO_lookup(str...STREAM , &res)Description
TRUEnever evaluated
FALSEnever evaluated
0
37 size_t l;-
38-
39 if (BIO_ADDRINFO_family(res) != AF_INET) {
BIO_ADDRINFO_family(res) != 2Description
TRUEnever evaluated
FALSEnever evaluated
0
40 BIOerr(BIO_F_BIO_GET_HOST_IP,-
41 BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET);-
42 } else if (BIO_ADDR_rawaddress(BIO_ADDRINFO_address(res), NULL, &l)) {
never executed: end of block
BIO_ADDR_rawad...oid *)0) , &l)Description
TRUEnever evaluated
FALSEnever evaluated
0
43 /*-
44 * Because only AF_INET addresses will reach this far, we can assert-
45 * that l should be 4-
46 */-
47 if (ossl_assert(l == 4))
((l == 4) != 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
48 ret = BIO_ADDR_rawaddress(BIO_ADDRINFO_address(res), ip, &l);
never executed: ret = BIO_ADDR_rawaddress(BIO_ADDRINFO_address(res), ip, &l);
0
49 }
never executed: end of block
0
50 BIO_ADDRINFO_free(res);-
51 } else {
never executed: end of block
0
52 ERR_add_error_data(2, "host=", str);-
53 }
never executed: end of block
0
54-
55 return ret;
never executed: return ret;
0
56}-
57-
58int BIO_get_port(const char *str, unsigned short *port_ptr)-
59{-
60 BIO_ADDRINFO *res = NULL;-
61 int ret = 0;-
62-
63 if (str == NULL) {
str == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
64 BIOerr(BIO_F_BIO_GET_PORT, BIO_R_NO_PORT_DEFINED);-
65 return 0;
never executed: return 0;
0
66 }-
67-
68 if (BIO_sock_init() != 1)
BIO_sock_init() != 1Description
TRUEnever evaluated
FALSEnever evaluated
0
69 return 0; /* don't generate another error code here */
never executed: return 0;
0
70-
71 if (BIO_lookup(NULL, str, BIO_LOOKUP_CLIENT, AF_INET, SOCK_STREAM, &res)) {
BIO_lookup( ((...STREAM , &res)Description
TRUEnever evaluated
FALSEnever evaluated
0
72 if (BIO_ADDRINFO_family(res) != AF_INET) {
BIO_ADDRINFO_family(res) != 2Description
TRUEnever evaluated
FALSEnever evaluated
0
73 BIOerr(BIO_F_BIO_GET_PORT,-
74 BIO_R_ADDRINFO_ADDR_IS_NOT_AF_INET);-
75 } else {
never executed: end of block
0
76 *port_ptr = ntohs(BIO_ADDR_rawport(BIO_ADDRINFO_address(res)));
never executed: __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8)));
never executed: __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc");
__builtin_constant_p (__x)Description
TRUEnever evaluated
FALSEnever evaluated
0
77 ret = 1;-
78 }
never executed: end of block
0
79 BIO_ADDRINFO_free(res);-
80 } else {
never executed: end of block
0
81 ERR_add_error_data(2, "host=", str);-
82 }
never executed: end of block
0
83-
84 return ret;
never executed: return ret;
0
85}-
86# endif-
87-
88int BIO_sock_error(int sock)-
89{-
90 int j = 0, i;-
91 socklen_t size = sizeof(j);-
92-
93 /*-
94 * Note: under Windows the third parameter is of type (char *) whereas-
95 * under other systems it is (void *) if you don't have a cast it will-
96 * choke the compiler: if you do have a cast then you can either go for-
97 * (char *) or (void *).-
98 */-
99 i = getsockopt(sock, SOL_SOCKET, SO_ERROR, (void *)&j, &size);-
100 if (i < 0)
i < 0Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
101 return get_last_socket_error();
never executed: return (*__errno_location ()) ;
0
102 else-
103 return j;
executed 2 times by 1 test: return j;
Executed by:
  • libcrypto.so.1.1
2
104}-
105-
106# if OPENSSL_API_COMPAT < 0x10100000L-
107struct hostent *BIO_gethostbyname(const char *name)-
108{-
109 /*-
110 * Caching gethostbyname() results forever is wrong, so we have to let-
111 * the true gethostbyname() worry about this-
112 */-
113 return gethostbyname(name);
never executed: return gethostbyname(name);
0
114}-
115# endif-
116-
117int BIO_sock_init(void)-
118{-
119# ifdef OPENSSL_SYS_WINDOWS-
120 static struct WSAData wsa_state;-
121-
122 if (!wsa_init_done) {-
123 int err;-
124-
125 wsa_init_done = 1;-
126 memset(&wsa_state, 0, sizeof(wsa_state));-
127 /*-
128 * Not making wsa_state available to the rest of the code is formally-
129 * wrong. But the structures we use are [believed to be] invariable-
130 * among Winsock DLLs, while API availability is [expected to be]-
131 * probed at run-time with DSO_global_lookup.-
132 */-
133 if (WSAStartup(0x0202, &wsa_state) != 0) {-
134 err = WSAGetLastError();-
135 SYSerr(SYS_F_WSASTARTUP, err);-
136 BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP);-
137 return -1;-
138 }-
139 }-
140# endif /* OPENSSL_SYS_WINDOWS */-
141# ifdef WATT32-
142 extern int _watt_do_exit;-
143 _watt_do_exit = 0; /* don't make sock_init() call exit() */-
144 if (sock_init())-
145 return -1;-
146# endif-
147-
148 return 1;
executed 1469 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
1469
149}-
150-
151void bio_sock_cleanup_int(void)-
152{-
153# ifdef OPENSSL_SYS_WINDOWS-
154 if (wsa_init_done) {-
155 wsa_init_done = 0;-
156 WSACleanup();-
157 }-
158# endif-
159}-
160-
161int BIO_socket_ioctl(int fd, long type, void *arg)-
162{-
163 int i;-
164-
165# ifdef __DJGPP__-
166 i = ioctlsocket(fd, type, (char *)arg);-
167# else-
168# if defined(OPENSSL_SYS_VMS)-
169 /*--
170 * 2011-02-18 SMS.-
171 * VMS ioctl() can't tolerate a 64-bit "void *arg", but we-
172 * observe that all the consumers pass in an "unsigned long *",-
173 * so we arrange a local copy with a short pointer, and use-
174 * that, instead.-
175 */-
176# if __INITIAL_POINTER_SIZE == 64-
177# define ARG arg_32p-
178# pragma pointer_size save-
179# pragma pointer_size 32-
180 unsigned long arg_32;-
181 unsigned long *arg_32p;-
182# pragma pointer_size restore-
183 arg_32p = &arg_32;-
184 arg_32 = *((unsigned long *)arg);-
185# else /* __INITIAL_POINTER_SIZE == 64 */-
186# define ARG arg-
187# endif /* __INITIAL_POINTER_SIZE == 64 [else] */-
188# else /* defined(OPENSSL_SYS_VMS) */-
189# define ARG arg-
190# endif /* defined(OPENSSL_SYS_VMS) [else] */-
191-
192 i = ioctlsocket(fd, type, ARG);-
193# endif /* __DJGPP__ */-
194 if (i < 0)
i < 0Description
TRUEnever evaluated
FALSEevaluated 564 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-564
195 SYSerr(SYS_F_IOCTLSOCKET, get_last_socket_error());
never executed: ERR_put_error(2,(5),( (*__errno_location ()) ),__FILE__,195);
0
196 return i;
executed 564 times by 1 test: return i;
Executed by:
  • libcrypto.so.1.1
564
197}-
198-
199# if OPENSSL_API_COMPAT < 0x10100000L-
200int BIO_get_accept_socket(char *host, int bind_mode)-
201{-
202 int s = INVALID_SOCKET;-
203 char *h = NULL, *p = NULL;-
204 BIO_ADDRINFO *res = NULL;-
205-
206 if (!BIO_parse_hostserv(host, &h, &p, BIO_PARSE_PRIO_SERV))
!BIO_parse_hos...RSE_PRIO_SERV)Description
TRUEnever evaluated
FALSEnever evaluated
0
207 return INVALID_SOCKET;
never executed: return (-1);
0
208-
209 if (BIO_sock_init() != 1)
BIO_sock_init() != 1Description
TRUEnever evaluated
FALSEnever evaluated
0
210 return INVALID_SOCKET;
never executed: return (-1);
0
211-
212 if (BIO_lookup(h, p, BIO_LOOKUP_SERVER, AF_UNSPEC, SOCK_STREAM, &res) != 0)
BIO_lookup(h, ...M , &res) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
213 goto err;
never executed: goto err;
0
214-
215 if ((s = BIO_socket(BIO_ADDRINFO_family(res), BIO_ADDRINFO_socktype(res),
(s = BIO_socke...), 0)) == (-1)Description
TRUEnever evaluated
FALSEnever evaluated
0
216 BIO_ADDRINFO_protocol(res), 0)) == INVALID_SOCKET) {
(s = BIO_socke...), 0)) == (-1)Description
TRUEnever evaluated
FALSEnever evaluated
0
217 s = INVALID_SOCKET;-
218 goto err;
never executed: goto err;
0
219 }-
220-
221 if (!BIO_listen(s, BIO_ADDRINFO_address(res),
!BIO_listen(s,...de ? 0x01 : 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
222 bind_mode ? BIO_SOCK_REUSEADDR : 0)) {
!BIO_listen(s,...de ? 0x01 : 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
223 BIO_closesocket(s);-
224 s = INVALID_SOCKET;-
225 }
never executed: end of block
0
226-
227 err:
code before this statement never executed: err:
0
228 BIO_ADDRINFO_free(res);-
229 OPENSSL_free(h);-
230 OPENSSL_free(p);-
231-
232 return s;
never executed: return s;
0
233}-
234-
235int BIO_accept(int sock, char **ip_port)-
236{-
237 BIO_ADDR res;-
238 int ret = -1;-
239-
240 ret = BIO_accept_ex(sock, &res, 0);-
241 if (ret == (int)INVALID_SOCKET) {
ret == (int)(-1)Description
TRUEnever evaluated
FALSEnever evaluated
0
242 if (BIO_sock_should_retry(ret)) {
BIO_sock_should_retry(ret)Description
TRUEnever evaluated
FALSEnever evaluated
0
243 ret = -2;-
244 goto end;
never executed: goto end;
0
245 }-
246 SYSerr(SYS_F_ACCEPT, get_last_socket_error());-
247 BIOerr(BIO_F_BIO_ACCEPT, BIO_R_ACCEPT_ERROR);-
248 goto end;
never executed: goto end;
0
249 }-
250-
251 if (ip_port != NULL) {
ip_port != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
252 char *host = BIO_ADDR_hostname_string(&res, 1);-
253 char *port = BIO_ADDR_service_string(&res, 1);-
254 if (host != NULL && port != NULL)
host != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
port != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
255 *ip_port = OPENSSL_zalloc(strlen(host) + strlen(port) + 2);
never executed: *ip_port = CRYPTO_zalloc(strlen(host) + strlen(port) + 2, __FILE__, 255);
0
256 else-
257 *ip_port = NULL;
never executed: *ip_port = ((void *)0) ;
0
258-
259 if (*ip_port == NULL) {
*ip_port == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
260 BIOerr(BIO_F_BIO_ACCEPT, ERR_R_MALLOC_FAILURE);-
261 BIO_closesocket(ret);-
262 ret = (int)INVALID_SOCKET;-
263 } else {
never executed: end of block
0
264 strcpy(*ip_port, host);-
265 strcat(*ip_port, ":");-
266 strcat(*ip_port, port);-
267 }
never executed: end of block
0
268 OPENSSL_free(host);-
269 OPENSSL_free(port);-
270 }
never executed: end of block
0
271-
272 end:
code before this statement never executed: end:
0
273 return ret;
never executed: return ret;
0
274}-
275# endif-
276-
277int BIO_set_tcp_ndelay(int s, int on)-
278{-
279 int ret = 0;-
280# if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP))-
281 int opt;-
282-
283# ifdef SOL_TCP-
284 opt = SOL_TCP;-
285# else-
286# ifdef IPPROTO_TCP-
287 opt = IPPROTO_TCP;-
288# endif-
289# endif-
290-
291 ret = setsockopt(s, opt, TCP_NODELAY, (char *)&on, sizeof(on));-
292# endif-
293 return (ret == 0);
executed 191 times by 1 test: return (ret == 0);
Executed by:
  • libcrypto.so.1.1
191
294}-
295-
296int BIO_socket_nbio(int s, int mode)-
297{-
298 int ret = -1;-
299 int l;-
300-
301 l = mode;-
302# ifdef FIONBIO-
303 l = mode;-
304-
305 ret = BIO_socket_ioctl(s, FIONBIO, &l);-
306# elif defined(F_GETFL) && defined(F_SETFL) && (defined(O_NONBLOCK) || defined(FNDELAY))-
307 /* make sure this call always pushes an error level; BIO_socket_ioctl() does so, so we do too. */-
308-
309 l = fcntl(s, F_GETFL, 0);-
310 if (l == -1) {-
311 SYSerr(SYS_F_FCNTL, get_last_sys_error());-
312 ret = -1;-
313 } else {-
314# if defined(O_NONBLOCK)-
315 l &= ~O_NONBLOCK;-
316# else-
317 l &= ~FNDELAY; /* BSD4.x */-
318# endif-
319 if (mode) {-
320# if defined(O_NONBLOCK)-
321 l |= O_NONBLOCK;-
322# else-
323 l |= FNDELAY; /* BSD4.x */-
324# endif-
325 }-
326 ret = fcntl(s, F_SETFL, l);-
327-
328 if (ret < 0) {-
329 SYSerr(SYS_F_FCNTL, get_last_sys_error());-
330 }-
331 }-
332# else-
333 /* make sure this call always pushes an error level; BIO_socket_ioctl() does so, so we do too. */-
334 BIOerr(BIO_F_BIO_SOCKET_NBIO, ERR_R_PASSED_INVALID_ARGUMENT);-
335# endif-
336-
337 return (ret == 0);
executed 564 times by 1 test: return (ret == 0);
Executed by:
  • libcrypto.so.1.1
564
338}-
339-
340int BIO_sock_info(int sock,-
341 enum BIO_sock_info_type type, union BIO_sock_info_u *info)-
342{-
343 switch (type) {-
344 case BIO_SOCK_INFO_ADDRESS:
executed 178 times by 1 test: case BIO_SOCK_INFO_ADDRESS:
Executed by:
  • libcrypto.so.1.1
178
345 {-
346 socklen_t addr_len;-
347 int ret = 0;-
348 addr_len = sizeof(*info->addr);-
349 ret = getsockname(sock, BIO_ADDR_sockaddr_noconst(info->addr),-
350 &addr_len);-
351 if (ret == -1) {
ret == -1Description
TRUEnever evaluated
FALSEevaluated 178 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-178
352 SYSerr(SYS_F_GETSOCKNAME, get_last_socket_error());-
353 BIOerr(BIO_F_BIO_SOCK_INFO, BIO_R_GETSOCKNAME_ERROR);-
354 return 0;
never executed: return 0;
0
355 }-
356 if ((size_t)addr_len > sizeof(*info->addr)) {
(size_t)addr_l...f(*info->addr)Description
TRUEnever evaluated
FALSEevaluated 178 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-178
357 BIOerr(BIO_F_BIO_SOCK_INFO, BIO_R_GETSOCKNAME_TRUNCATED_ADDRESS);-
358 return 0;
never executed: return 0;
0
359 }-
360 }-
361 break;
executed 178 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
178
362 default:
never executed: default:
0
363 BIOerr(BIO_F_BIO_SOCK_INFO, BIO_R_UNKNOWN_INFO_TYPE);-
364 return 0;
never executed: return 0;
0
365 }-
366 return 1;
executed 178 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
178
367}-
368-
369#endif-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2