summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorbeck <>2017-04-30 05:09:22 +0000
committerbeck <>2017-04-30 05:09:22 +0000
commitb6c1bd93474354589e68df26b2f8a85cb2010603 (patch)
tree5a94d85be4911fdf33a355de4ace376efa131930 /src/lib
parent5952ef2f33ac903c4ae6711762df29c1aba6b640 (diff)
downloadopenbsd-b6c1bd93474354589e68df26b2f8a85cb2010603.tar.gz
openbsd-b6c1bd93474354589e68df26b2f8a85cb2010603.tar.bz2
openbsd-b6c1bd93474354589e68df26b2f8a85cb2010603.zip
Rework BIO_accept to be more like modern code.
ok jsing@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/bio/b_sock.c73
1 files changed, 19 insertions, 54 deletions
diff --git a/src/lib/libcrypto/bio/b_sock.c b/src/lib/libcrypto/bio/b_sock.c
index cb5549434f..b8aba39578 100644
--- a/src/lib/libcrypto/bio/b_sock.c
+++ b/src/lib/libcrypto/bio/b_sock.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: b_sock.c,v 1.64 2017/04/30 04:18:58 beck Exp $ */ 1/* $OpenBSD: b_sock.c,v 1.65 2017/04/30 05:09:22 beck Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -243,23 +243,15 @@ err:
243int 243int
244BIO_accept(int sock, char **addr) 244BIO_accept(int sock, char **addr)
245{ 245{
246 char h[NI_MAXHOST], s[NI_MAXSERV];
247 struct sockaddr_in sin;
248 socklen_t sin_len = sizeof(sin);
246 int ret = -1; 249 int ret = -1;
247 unsigned long l;
248 unsigned short port;
249 char *p, *tmp;
250 250
251 struct { 251 if (addr == NULL)
252 socklen_t len; 252 goto end;
253 union {
254 struct sockaddr sa;
255 struct sockaddr_in sa_in;
256 struct sockaddr_in6 sa_in6;
257 } from;
258 } sa;
259 253
260 sa.len = sizeof(sa.from); 254 ret = accept(sock, (struct sockaddr *)&sin, &sin_len);
261 memset(&sa.from, 0, sizeof(sa.from));
262 ret = accept(sock, &sa.from.sa, &sa.len);
263 if (ret == -1) { 255 if (ret == -1) {
264 if (BIO_sock_should_retry(ret)) 256 if (BIO_sock_should_retry(ret))
265 return -2; 257 return -2;
@@ -267,51 +259,24 @@ BIO_accept(int sock, char **addr)
267 BIOerror(BIO_R_ACCEPT_ERROR); 259 BIOerror(BIO_R_ACCEPT_ERROR);
268 goto end; 260 goto end;
269 } 261 }
262 /* XXX Crazy API. Can't be helped */
263 if (*addr != NULL) {
264 free(*addr);
265 *addr = NULL;
266 }
270 267
271 if (addr == NULL) 268 if (sin.sin_family != AF_INET)
272 goto end; 269 goto end;
273 270
274 do { 271 if (getnameinfo((struct sockaddr *)&sin, sin_len, h, sizeof(h),
275 char h[NI_MAXHOST], s[NI_MAXSERV]; 272 s, sizeof(s), NI_NUMERICHOST|NI_NUMERICSERV) != 0)
276 size_t nl;
277
278 if (getnameinfo(&sa.from.sa, sa.len, h, sizeof(h),
279 s, sizeof(s), NI_NUMERICHOST|NI_NUMERICSERV))
280 break;
281 nl = strlen(h) + strlen(s) + 2;
282 p = *addr;
283 if (p)
284 *p = '\0';
285 if (!(tmp = realloc(p, nl))) {
286 close(ret);
287 ret = -1;
288 free(p);
289 *addr = NULL;
290 BIOerror(ERR_R_MALLOC_FAILURE);
291 goto end;
292 }
293 p = tmp;
294 *addr = p;
295 snprintf(*addr, nl, "%s:%s", h, s);
296 goto end; 273 goto end;
297 } while (0); 274
298 if (sa.from.sa.sa_family != AF_INET) 275 if ((asprintf(addr, "%s:%s", h, s)) == -1) {
276 BIOerror(ERR_R_MALLOC_FAILURE);
277 *addr = NULL;
299 goto end; 278 goto end;
300 l = ntohl(sa.from.sa_in.sin_addr.s_addr);
301 port = ntohs(sa.from.sa_in.sin_port);
302 if (*addr == NULL) {
303 if ((p = malloc(24)) == NULL) {
304 close(ret);
305 ret = -1;
306 BIOerror(ERR_R_MALLOC_FAILURE);
307 goto end;
308 }
309 *addr = p;
310 } 279 }
311 snprintf(*addr, 24, "%d.%d.%d.%d:%d",
312 (unsigned char)(l >> 24L) & 0xff, (unsigned char)(l >> 16L) & 0xff,
313 (unsigned char)(l >> 8L) & 0xff, (unsigned char)(l) & 0xff, port);
314
315end: 280end:
316 return (ret); 281 return (ret);
317} 282}