summaryrefslogtreecommitdiff
path: root/src/lib/ares__get_hostent.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/ares__get_hostent.c')
-rw-r--r--src/lib/ares__get_hostent.c415
1 files changed, 222 insertions, 193 deletions
diff --git a/src/lib/ares__get_hostent.c b/src/lib/ares__get_hostent.c
index 367f390..9568b3b 100644
--- a/src/lib/ares__get_hostent.c
+++ b/src/lib/ares__get_hostent.c
@@ -1,17 +1,28 @@
-
-/* Copyright 1998, 2011 by the Massachusetts Institute of Technology.
+/* MIT License
+ *
+ * Copyright (c) 1998, 2011 Massachusetts Institute of Technology
+ * Copyright (c) The c-ares project and its contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
*
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting
- * documentation, and that the name of M.I.T. not be used in
- * advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission.
- * M.I.T. makes no representations about the suitability of
- * this software for any purpose. It is provided "as is"
- * without express or implied warranty.
+ * SPDX-License-Identifier: MIT
*/
#include "ares_setup.h"
@@ -28,17 +39,23 @@
#include "ares.h"
#include "ares_inet_net_pton.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
-int ares__get_hostent(FILE *fp, int family, struct hostent **host)
+ares_status_t ares__get_hostent(FILE *fp, int family, struct hostent **host)
{
- char *line = NULL, *p, *q, **alias;
- char *txtaddr, *txthost, *txtalias;
- int status;
- size_t addrlen, linesize, naliases;
+ char *line = NULL;
+ char *p;
+ char *q;
+ char **alias;
+ const char *txtaddr;
+ const char *txthost;
+ char *txtalias;
+ ares_status_t status;
+ size_t addrlen;
+ size_t linesize;
+ size_t naliases;
struct ares_addr addr;
- struct hostent *hostent = NULL;
+ struct hostent *hostent = NULL;
*host = NULL; /* Assume failure */
@@ -52,209 +69,221 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
return ARES_EBADFAMILY;
}
- while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
- {
-
- /* Trim line comment. */
- p = line;
- while (*p && (*p != '#'))
- p++;
- *p = '\0';
+ while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) {
+ /* Trim line comment. */
+ p = line;
+ while (*p && (*p != '#')) {
+ p++;
+ }
+ *p = '\0';
- /* Trim trailing whitespace. */
- q = p - 1;
- while ((q >= line) && ISSPACE(*q))
- q--;
- *++q = '\0';
+ /* Trim trailing whitespace. */
+ q = p - 1;
+ while ((q >= line) && ISSPACE(*q)) {
+ q--;
+ }
+ *++q = '\0';
- /* Skip leading whitespace. */
- p = line;
- while (*p && ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if empty. */
- continue;
+ /* Skip leading whitespace. */
+ p = line;
+ while (*p && ISSPACE(*p)) {
+ p++;
+ }
+ if (!*p) {
+ /* Ignore line if empty. */
+ continue;
+ }
- /* Pointer to start of IPv4 or IPv6 address part. */
- txtaddr = p;
+ /* Pointer to start of IPv4 or IPv6 address part. */
+ txtaddr = p;
- /* Advance past address part. */
- while (*p && !ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if reached end of line. */
- continue;
+ /* Advance past address part. */
+ while (*p && !ISSPACE(*p)) {
+ p++;
+ }
+ if (!*p) {
+ /* Ignore line if reached end of line. */
+ continue;
+ }
- /* Null terminate address part. */
- *p = '\0';
+ /* Null terminate address part. */
+ *p = '\0';
- /* Advance to host name */
+ /* Advance to host name */
+ p++;
+ while (*p && ISSPACE(*p)) {
p++;
- while (*p && ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if reached end of line. */
- continue; /* LCOV_EXCL_LINE: trailing whitespace already stripped */
-
- /* Pointer to start of host name. */
- txthost = p;
+ }
+ if (!*p) {
+ /* Ignore line if reached end of line. */
+ continue; /* LCOV_EXCL_LINE: trailing whitespace already stripped */
+ }
- /* Advance past host name. */
- while (*p && !ISSPACE(*p))
- p++;
+ /* Pointer to start of host name. */
+ txthost = p;
- /* Pointer to start of first alias. */
- txtalias = NULL;
- if (*p)
- {
- q = p + 1;
- while (*q && ISSPACE(*q))
- q++;
- if (*q)
- txtalias = q;
- }
+ /* Advance past host name. */
+ while (*p && !ISSPACE(*p)) {
+ p++;
+ }
- /* Null terminate host name. */
- *p = '\0';
+ /* Pointer to start of first alias. */
+ txtalias = NULL;
+ if (*p) {
+ q = p + 1;
+ while (*q && ISSPACE(*q)) {
+ q++;
+ }
+ if (*q) {
+ txtalias = q;
+ }
+ }
- /* find out number of aliases. */
- naliases = 0;
- if (txtalias)
- {
- p = txtalias;
- while (*p)
- {
- while (*p && !ISSPACE(*p))
- p++;
- while (*p && ISSPACE(*p))
- p++;
- naliases++;
- }
- }
+ /* Null terminate host name. */
+ *p = '\0';
- /* Convert address string to network address for the requested family. */
- addrlen = 0;
- addr.family = AF_UNSPEC;
- addr.addrV4.s_addr = INADDR_NONE;
- if ((family == AF_INET) || (family == AF_UNSPEC))
- {
- if (ares_inet_pton(AF_INET, txtaddr, &addr.addrV4) > 0)
- {
- /* Actual network address family and length. */
- addr.family = AF_INET;
- addrlen = sizeof(addr.addrV4);
- }
+ /* find out number of aliases. */
+ naliases = 0;
+ if (txtalias) {
+ p = txtalias;
+ while (*p) {
+ while (*p && !ISSPACE(*p)) {
+ p++;
}
- if ((family == AF_INET6) || ((family == AF_UNSPEC) && (!addrlen)))
- {
- if (ares_inet_pton(AF_INET6, txtaddr, &addr.addrV6) > 0)
- {
- /* Actual network address family and length. */
- addr.family = AF_INET6;
- addrlen = sizeof(addr.addrV6);
- }
+ while (*p && ISSPACE(*p)) {
+ p++;
}
- if (!addrlen)
- /* Ignore line if invalid address string for the requested family. */
- continue;
+ naliases++;
+ }
+ }
+
+ /* Convert address string to network address for the requested family. */
+ addrlen = 0;
+ addr.family = AF_UNSPEC;
+ addr.addrV4.s_addr = INADDR_NONE;
+ if ((family == AF_INET || family == AF_UNSPEC) &&
+ ares_inet_pton(AF_INET, txtaddr, &addr.addrV4) > 0) {
+ /* Actual network address family and length. */
+ addr.family = AF_INET;
+ addrlen = sizeof(addr.addrV4);
+ }
+ if ((family == AF_INET6 || (family == AF_UNSPEC && !addrlen)) &&
+ ares_inet_pton(AF_INET6, txtaddr, &addr.addrV6) > 0) {
+ /* Actual network address family and length. */
+ addr.family = AF_INET6;
+ addrlen = sizeof(addr.addrV6);
+ }
+ if (!addrlen) {
+ /* Ignore line if invalid address string for the requested family. */
+ continue;
+ }
- /*
- ** Actual address family possible values are AF_INET and AF_INET6 only.
- */
+ /*
+ ** Actual address family possible values are AF_INET and AF_INET6 only.
+ */
- /* Allocate memory for the hostent structure. */
- hostent = ares_malloc(sizeof(struct hostent));
- if (!hostent)
- break;
+ /* Allocate memory for the hostent structure. */
+ hostent = ares_malloc(sizeof(struct hostent));
+ if (!hostent) {
+ break;
+ }
- /* Initialize fields for out of memory condition. */
- hostent->h_aliases = NULL;
- hostent->h_addr_list = NULL;
+ /* Initialize fields for out of memory condition. */
+ hostent->h_aliases = NULL;
+ hostent->h_addr_list = NULL;
- /* Copy official host name. */
- hostent->h_name = ares_strdup(txthost);
- if (!hostent->h_name)
- break;
+ /* Copy official host name. */
+ hostent->h_name = ares_strdup(txthost);
+ if (!hostent->h_name) {
+ break;
+ }
- /* Copy network address. */
- hostent->h_addr_list = ares_malloc(2 * sizeof(char *));
- if (!hostent->h_addr_list)
- break;
- hostent->h_addr_list[1] = NULL;
- hostent->h_addr_list[0] = ares_malloc(addrlen);
- if (!hostent->h_addr_list[0])
- break;
- if (addr.family == AF_INET)
- memcpy(hostent->h_addr_list[0], &addr.addrV4, sizeof(addr.addrV4));
- else
- memcpy(hostent->h_addr_list[0], &addr.addrV6, sizeof(addr.addrV6));
+ /* Copy network address. */
+ hostent->h_addr_list = ares_malloc(2 * sizeof(char *));
+ if (!hostent->h_addr_list) {
+ break;
+ }
+ hostent->h_addr_list[1] = NULL;
+ hostent->h_addr_list[0] = ares_malloc(addrlen);
+ if (!hostent->h_addr_list[0]) {
+ break;
+ }
+ if (addr.family == AF_INET) {
+ memcpy(hostent->h_addr_list[0], &addr.addrV4, sizeof(addr.addrV4));
+ } else {
+ memcpy(hostent->h_addr_list[0], &addr.addrV6, sizeof(addr.addrV6));
+ }
- /* Copy aliases. */
- hostent->h_aliases = ares_malloc((naliases + 1) * sizeof(char *));
- if (!hostent->h_aliases)
- break;
- alias = hostent->h_aliases;
- while (naliases)
- *(alias + naliases--) = NULL;
- *alias = NULL;
- while (txtalias)
- {
- p = txtalias;
- while (*p && !ISSPACE(*p))
- p++;
- q = p;
- while (*q && ISSPACE(*q))
- q++;
- *p = '\0';
- if ((*alias = ares_strdup(txtalias)) == NULL)
- break;
- alias++;
- txtalias = *q ? q : NULL;
- }
- if (txtalias)
- /* Alias memory allocation failure. */
+ /* Copy aliases. */
+ hostent->h_aliases = ares_malloc((naliases + 1) * sizeof(char *));
+ if (!hostent->h_aliases) {
+ break;
+ }
+ alias = hostent->h_aliases;
+ while (naliases) {
+ *(alias + naliases--) = NULL;
+ }
+ *alias = NULL;
+ while (txtalias) {
+ p = txtalias;
+ while (*p && !ISSPACE(*p)) {
+ p++;
+ }
+ q = p;
+ while (*q && ISSPACE(*q)) {
+ q++;
+ }
+ *p = '\0';
+ if ((*alias = ares_strdup(txtalias)) == NULL) {
break;
+ }
+ alias++;
+ txtalias = *q ? q : NULL;
+ }
+ if (txtalias) {
+ /* Alias memory allocation failure. */
+ break;
+ }
- /* Copy actual network address family and length. */
- hostent->h_addrtype = aresx_sitoss(addr.family);
- hostent->h_length = aresx_uztoss(addrlen);
-
- /* Free line buffer. */
- ares_free(line);
+ /* Copy actual network address family and length. */
+ hostent->h_addrtype = addr.family;
+ hostent->h_length = (int)addrlen;
- /* Return hostent successfully */
- *host = hostent;
- return ARES_SUCCESS;
+ /* Free line buffer. */
+ ares_free(line);
- }
+ /* Return hostent successfully */
+ *host = hostent;
+ return ARES_SUCCESS;
+ }
/* If allocated, free line buffer. */
- if (line)
+ if (line) {
ares_free(line);
+ }
- if (status == ARES_SUCCESS)
- {
- /* Memory allocation failure; clean up. */
- if (hostent)
- {
- if (hostent->h_name)
- ares_free((char *) hostent->h_name);
- if (hostent->h_aliases)
- {
- for (alias = hostent->h_aliases; *alias; alias++)
- ares_free(*alias);
- ares_free(hostent->h_aliases);
- }
- if (hostent->h_addr_list)
- {
- if (hostent->h_addr_list[0])
- ares_free(hostent->h_addr_list[0]);
- ares_free(hostent->h_addr_list);
- }
- ares_free(hostent);
+ if (status == ARES_SUCCESS) {
+ /* Memory allocation failure; clean up. */
+ if (hostent) {
+ if (hostent->h_name) {
+ ares_free(hostent->h_name);
+ }
+ if (hostent->h_aliases) {
+ for (alias = hostent->h_aliases; *alias; alias++) {
+ ares_free(*alias);
}
- return ARES_ENOMEM;
+ ares_free(hostent->h_aliases);
+ }
+ if (hostent->h_addr_list) {
+ if (hostent->h_addr_list[0]) {
+ ares_free(hostent->h_addr_list[0]);
+ }
+ ares_free(hostent->h_addr_list);
+ }
+ ares_free(hostent);
}
+ return ARES_ENOMEM;
+ }
return status;
}