|
# --- 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
|
|
|