|
|
# --- SDE-COPYRIGHT-NOTE-BEGIN --- # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # # Filename: package/.../musl/0001-handle-non-matching-address-family-entries-in-hosts-.patch # Copyright (C) 2016 The OpenSDE Project # # More information can be found in the files COPYING and README. # # This patch file is dual-licensed. It is available under the license the # patched project is licensed under, as long as it is an OpenSource license # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms # of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # --- SDE-COPYRIGHT-NOTE-END ---
From 6d70c08a2c37745df637b231711f6dec79dbc6e1 Mon Sep 17 00:00:00 2001 From: Rich Felker <dalias@aerifal.cx> Date: Wed, 2 Mar 2016 00:34:51 -0500 Subject: [PATCH] handle non-matching address family entries in hosts file
name_from_hosts failed to account for the possibility of an address family error from name_from_numeric, wrongly counting such a return as success and using the uninitialized address data as part of the results passed up to the caller.
non-matching address family entries cannot simply be ignored or results would be inconsistent with respect to whether AF_UNSPEC or a specific address family is queried. instead, record that a non-matching entry was seen, and fail the lookup with EAI_NONAME of no matching-family entries are found. ---
src/network/lookup_name.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/network/lookup_name.c b/src/network/lookup_name.c
index a26ad53..86f90ac 100644
--- a/src/network/lookup_name.c
+++ b/src/network/lookup_name.c
@@ -49,7 +49,7 @@ static int name_from_hosts(struct address buf[static MAXADDRS], char canon[stati
{ char line[512]; size_t l = strlen(name); - int cnt = 0;
+ int cnt = 0, badfam = 0;
unsigned char _buf[1032]; FILE _f, *f = __fopen_rb_ca("/etc/hosts", &_f, _buf, sizeof _buf); if (!f) switch (errno) { @@ -71,8 +71,16 @@ static int name_from_hosts(struct address buf[static MAXADDRS], char canon[stati
/* Isolate IP address to parse */ for (p=line; *p && !isspace(*p); p++); *p++ = 0; - if (name_from_numeric(buf+cnt, line, family))
+ switch (name_from_numeric(buf+cnt, line, family)) {
+ case 1:
cnt++; + break;
+ case 0:
+ continue;
+ default:
+ badfam = EAI_NONAME;
+ continue;
+ }
/* Extract first name as canonical name */ for (; *p && isspace(*p); p++); @@ -81,7 +89,7 @@ static int name_from_hosts(struct address buf[static MAXADDRS], char canon[stati
if (is_valid_hostname(p)) memcpy(canon, p, z-p+1); } __fclose_ca(f); - return cnt;
+ return cnt ? cnt : badfam;
} struct dpc_ctx { --
2.7.2
|