OpenCoverage

b_sock.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/bio/b_sock.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: b_sock.c,v 1.69 2018/02/07 00:52:05 bluhm Exp $ */-
2/*-
3 * Copyright (c) 2017 Bob Beck <beck@openbsd.org>-
4 *-
5 * Permission to use, copy, modify, and distribute this software for any-
6 * purpose with or without fee is hereby granted, provided that the above-
7 * copyright notice and this permission notice appear in all copies.-
8 *-
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES-
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF-
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR-
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES-
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN-
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF-
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.-
16 */-
17-
18#include <sys/ioctl.h>-
19#include <sys/socket.h>-
20#include <string.h>-
21-
22#include <arpa/inet.h>-
23#include <netinet/in.h>-
24#include <netinet/tcp.h>-
25-
26#include <errno.h>-
27#include <limits.h>-
28#include <netdb.h>-
29#include <stdio.h>-
30#include <stdlib.h>-
31#include <unistd.h>-
32-
33#include <openssl/bio.h>-
34#include <openssl/buffer.h>-
35#include <openssl/err.h>-
36-
37int-
38BIO_get_host_ip(const char *str, unsigned char *ip)-
39{-
40 struct addrinfo *res = NULL;-
41 struct addrinfo hints = {-
42 .ai_family = AF_INET,-
43 .ai_socktype = SOCK_STREAM,-
44 .ai_flags = AI_PASSIVE,-
45 };-
46 uint32_t *iap = (in_addr_t *)ip;-
47 int error;-
48-
49 if (str == NULL) {
str == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
50 ERR_asprintf_error_data("NULL host provided");-
51 return (0);
never executed: return (0);
0
52 }-
53-
54 if ((error = getaddrinfo(str, NULL, &hints, &res)) != 0) {
(error = getad...s, &res)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
55 BIOerror(BIO_R_BAD_HOSTNAME_LOOKUP);-
56 ERR_asprintf_error_data("getaddrinfo: host='%s' : %s'", str,-
57 gai_strerror(error));-
58 return (0);
never executed: return (0);
0
59 }-
60 *iap = (uint32_t)(((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr);-
61 freeaddrinfo(res);-
62 return (1);
never executed: return (1);
0
63}-
64-
65int-
66BIO_get_port(const char *str, unsigned short *port_ptr)-
67{-
68 struct addrinfo *res = NULL;-
69 struct addrinfo hints = {-
70 .ai_family = AF_UNSPEC,-
71 .ai_socktype = SOCK_STREAM,-
72 .ai_flags = AI_PASSIVE,-
73 };-
74 int error;-
75-
76 if (str == NULL) {
str == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
77 BIOerror(BIO_R_NO_PORT_SPECIFIED);-
78 return (0);
never executed: return (0);
0
79 }-
80-
81 if ((error = getaddrinfo(NULL, str, &hints, &res)) != 0) {
(error = getad...s, &res)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
82 ERR_asprintf_error_data("getaddrinfo: service='%s' : %s'", str,-
83 gai_strerror(error));-
84 return (0);
never executed: return (0);
0
85 }-
86 *port_ptr = ntohs(((struct sockaddr_in *)(res->ai_addr))->sin_port);
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
87 freeaddrinfo(res);-
88 return (1);
never executed: return (1);
0
89}-
90-
91int-
92BIO_sock_error(int sock)-
93{-
94 socklen_t len;-
95 int err;-
96-
97 len = sizeof(err);-
98 if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &err, &len) != 0)
getsockopt(soc...rr, &len) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
99 return (1);
never executed: return (1);
0
100 return (err);
never executed: return (err);
0
101}-
102-
103struct hostent *-
104BIO_gethostbyname(const char *name)-
105{-
106 return gethostbyname(name);
never executed: return gethostbyname(name);
0
107}-
108-
109int-
110BIO_socket_ioctl(int fd, long type, void *arg)-
111{-
112 int ret;-
113-
114 ret = ioctl(fd, type, arg);-
115 if (ret < 0)
ret < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
116 SYSerror(errno);
never executed: ERR_put_error(2,(0xfff),( (*__errno_location ()) ),__FILE__,116);
0
117 return (ret);
never executed: return (ret);
0
118}-
119-
120int-
121BIO_get_accept_socket(char *host, int bind_mode)-
122{-
123 struct addrinfo hints = {-
124 .ai_family = AF_INET,-
125 .ai_socktype = SOCK_STREAM,-
126 .ai_flags = AI_PASSIVE,-
127 };-
128 struct addrinfo *res = NULL;-
129 char *h, *p, *str = NULL;-
130 int error, ret = 0, s = -1;-
131-
132 if (host == NULL || (str = strdup(host)) == NULL)
never executed: __retval = (char *) memcpy (__retval, host , __len);
__retval != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
((const char *... ))[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
host == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
(str = (__exte...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( host )Description
TRUEnever evaluated
FALSEnever evaluated
((size_t)(cons...( host ) == 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
133 return (-1);
never executed: return (-1);
0
134 p = NULL;-
135 h = str;-
136 if ((p = strrchr(str, ':')) == NULL) {
(p = strrchr(s...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
137 /* A string without a colon is treated as a port. */-
138 p = str;-
139 h = NULL;-
140 } else {
never executed: end of block
0
141 *p++ = '\0';-
142 if (*p == '\0') {
*p == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
143 BIOerror(BIO_R_NO_PORT_SPECIFIED);-
144 goto err;
never executed: goto err;
0
145 }-
146 if (*h == '\0' || strcmp(h, "*") == 0)
never executed: __result = (((const unsigned char *) (const char *) ( h ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "*" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
*h == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
147 h = NULL;
never executed: h = ((void *)0) ;
0
148 }
never executed: end of block
0
149-
150 if ((error = getaddrinfo(h, p, &hints, &res)) != 0) {
(error = getad...s, &res)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
151 ERR_asprintf_error_data("getaddrinfo: '%s:%s': %s'", h, p,-
152 gai_strerror(error));-
153 goto err;
never executed: goto err;
0
154 }-
155 if (h == NULL) {
h == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
156 struct sockaddr_in *sin = (struct sockaddr_in *)res->ai_addr;-
157 sin->sin_addr.s_addr = INADDR_ANY;-
158 }
never executed: end of block
0
159-
160 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);-
161 if (s == -1) {
s == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
162 SYSerror(errno);-
163 ERR_asprintf_error_data("host='%s'", host);-
164 BIOerror(BIO_R_UNABLE_TO_CREATE_SOCKET);-
165 goto err;
never executed: goto err;
0
166 }-
167 if (bind_mode == BIO_BIND_REUSEADDR) {
bind_mode == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
168 int i = 1;-
169-
170 ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));-
171 bind_mode = BIO_BIND_NORMAL;-
172 }
never executed: end of block
0
173 if (bind(s, res->ai_addr, res->ai_addrlen) == -1) {
bind(s, res->a...addrlen) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
174 SYSerror(errno);-
175 ERR_asprintf_error_data("host='%s'", host);-
176 BIOerror(BIO_R_UNABLE_TO_BIND_SOCKET);-
177 goto err;
never executed: goto err;
0
178 }-
179 if (listen(s, SOMAXCONN) == -1) {
listen(s, 128 ) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
180 SYSerror(errno);-
181 ERR_asprintf_error_data("host='%s'", host);-
182 BIOerror(BIO_R_UNABLE_TO_LISTEN_SOCKET);-
183 goto err;
never executed: goto err;
0
184 }-
185 ret = 1;-
186-
187err:
code before this statement never executed: err:
0
188 free(str);-
189 if (res != NULL)
res != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
190 freeaddrinfo(res);
never executed: freeaddrinfo(res);
0
191 if ((ret == 0) && (s != -1)) {
(ret == 0)Description
TRUEnever evaluated
FALSEnever evaluated
(s != -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
192 close(s);-
193 s = -1;-
194 }
never executed: end of block
0
195 return (s);
never executed: return (s);
0
196}-
197-
198int-
199BIO_accept(int sock, char **addr)-
200{-
201 char h[NI_MAXHOST], s[NI_MAXSERV];-
202 struct sockaddr_in sin;-
203 socklen_t sin_len = sizeof(sin);-
204 int ret = -1;-
205-
206 if (addr == NULL)
addr == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
207 goto end;
never executed: goto end;
0
208-
209 ret = accept(sock, (struct sockaddr *)&sin, &sin_len);-
210 if (ret == -1) {
ret == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
211 if (BIO_sock_should_retry(ret))
BIO_sock_should_retry(ret)Description
TRUEnever evaluated
FALSEnever evaluated
0
212 return -2;
never executed: return -2;
0
213 SYSerror(errno);-
214 BIOerror(BIO_R_ACCEPT_ERROR);-
215 goto end;
never executed: goto end;
0
216 }-
217 /* XXX Crazy API. Can't be helped */-
218 if (*addr != NULL) {
*addr != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
219 free(*addr);-
220 *addr = NULL;-
221 }
never executed: end of block
0
222-
223 if (sin.sin_family != AF_INET)
sin.sin_family != 2Description
TRUEnever evaluated
FALSEnever evaluated
0
224 goto end;
never executed: goto end;
0
225-
226 if (getnameinfo((struct sockaddr *)&sin, sin_len, h, sizeof(h),
getnameinfo((s..., 1 | 2 ) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
227 s, sizeof(s), NI_NUMERICHOST|NI_NUMERICSERV) != 0)
getnameinfo((s..., 1 | 2 ) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
228 goto end;
never executed: goto end;
0
229-
230 if ((asprintf(addr, "%s:%s", h, s)) == -1) {
(asprintf(addr..., h, s)) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
231 BIOerror(ERR_R_MALLOC_FAILURE);-
232 *addr = NULL;-
233 goto end;
never executed: goto end;
0
234 }-
235end:
code before this statement never executed: end:
0
236 return (ret);
never executed: return (ret);
0
237}-
238-
239int-
240BIO_set_tcp_ndelay(int s, int on)-
241{-
242 return (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == 0);
never executed: return (setsockopt(s, IPPROTO_TCP , 1 , &on, sizeof(on)) == 0);
0
243}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2