diff options
| author | beck <> | 2017-04-30 05:43:05 +0000 |
|---|---|---|
| committer | beck <> | 2017-04-30 05:43:05 +0000 |
| commit | c31f93fcd0335322ce944bd972a822c49b6246d4 (patch) | |
| tree | cab1a916afbeb80fc28426c7fa4bc878b35e2e96 /src | |
| parent | 11a87330614c2f08fdfae566b604f04dafb84b38 (diff) | |
| download | openbsd-c31f93fcd0335322ce944bd972a822c49b6246d4.tar.gz openbsd-c31f93fcd0335322ce944bd972a822c49b6246d4.tar.bz2 openbsd-c31f93fcd0335322ce944bd972a822c49b6246d4.zip | |
Make BIO_get_host_ip just yet another getaddrinfo wrapper
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/bio/b_sock.c | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/src/lib/libcrypto/bio/b_sock.c b/src/lib/libcrypto/bio/b_sock.c index b8aba39578..af3e35e66b 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.65 2017/04/30 05:09:22 beck Exp $ */ | 1 | /* $OpenBSD: b_sock.c,v 1.66 2017/04/30 05:43:05 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 | * |
| @@ -78,36 +78,29 @@ | |||
| 78 | int | 78 | int |
| 79 | BIO_get_host_ip(const char *str, unsigned char *ip) | 79 | BIO_get_host_ip(const char *str, unsigned char *ip) |
| 80 | { | 80 | { |
| 81 | int i; | 81 | struct addrinfo *res = NULL; |
| 82 | int err = 1; | 82 | struct addrinfo hints = { |
| 83 | struct hostent *he; | 83 | .ai_family = AF_INET, |
| 84 | 84 | .ai_socktype = SOCK_STREAM, | |
| 85 | if (inet_pton(AF_INET, str, ip) == 1) | 85 | .ai_flags = AI_PASSIVE, |
| 86 | return (1); | 86 | }; |
| 87 | uint32_t *iap = (in_addr_t *)ip; | ||
| 88 | int error; | ||
| 87 | 89 | ||
| 88 | /* do a gethostbyname */ | 90 | if (str == NULL) { |
| 89 | CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); | 91 | ERR_asprintf_error_data("NULL host provided"); |
| 90 | he = BIO_gethostbyname(str); | 92 | return (0); |
| 91 | if (he == NULL) { | ||
| 92 | BIOerror(BIO_R_BAD_HOSTNAME_LOOKUP); | ||
| 93 | goto err; | ||
| 94 | } | 93 | } |
| 95 | 94 | ||
| 96 | if (he->h_addrtype != AF_INET) { | 95 | if ((error = getaddrinfo(str, NULL, &hints, &res)) != 0) { |
| 97 | BIOerror(BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); | 96 | BIOerror(BIO_R_BAD_HOSTNAME_LOOKUP); |
| 98 | goto err; | 97 | ERR_asprintf_error_data("getaddrinfo: host='%s' : %s'", str, |
| 98 | gai_strerror(error)); | ||
| 99 | return (0); | ||
| 99 | } | 100 | } |
| 100 | for (i = 0; i < 4; i++) | 101 | *iap = (uint32_t)(((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr); |
| 101 | ip[i] = he->h_addr_list[0][i]; | 102 | freeaddrinfo(res); |
| 102 | err = 0; | 103 | return (1); |
| 103 | |||
| 104 | err: | ||
| 105 | CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); | ||
| 106 | if (err) { | ||
| 107 | ERR_asprintf_error_data("host=%s", str); | ||
| 108 | return 0; | ||
| 109 | } else | ||
| 110 | return 1; | ||
| 111 | } | 104 | } |
| 112 | 105 | ||
| 113 | int | 106 | int |
