diff options
author | Rich Felker <dalias@aerifal.cx> | 2020-08-04 14:20:40 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2020-08-04 14:20:40 -0400 |
commit | 20c6d83f5566590a65895b4fa11bf31fee3dcc44 (patch) | |
tree | 92958212e92d7d14dd339d0df445c047958a5092 /src/network | |
parent | 73cc775bee53300c7cf759f37580220b18ac13d3 (diff) | |
download | musl-20c6d83f5566590a65895b4fa11bf31fee3dcc44.zip musl-20c6d83f5566590a65895b4fa11bf31fee3dcc44.tar.gz musl-20c6d83f5566590a65895b4fa11bf31fee3dcc44.tar.bz2 |
in hosts file lookups, use only first match for canonical name
the existing code clobbered the canonical name already discovered
every time another matching line was found, which will necessarily be
the case when a hostname has both IPv4 and v6 definitions.
patch by Wolf.
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/lookup_name.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/network/lookup_name.c b/src/network/lookup_name.c index aae0d95..0462484 100644 --- a/src/network/lookup_name.c +++ b/src/network/lookup_name.c @@ -50,7 +50,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, badfam = 0; + int cnt = 0, badfam = 0, have_canon = 0; unsigned char _buf[1032]; FILE _f, *f = __fopen_rb_ca("/etc/hosts", &_f, _buf, sizeof _buf); if (!f) switch (errno) { @@ -83,11 +83,16 @@ static int name_from_hosts(struct address buf[static MAXADDRS], char canon[stati continue; } + if (have_canon) continue; + /* Extract first name as canonical name */ for (; *p && isspace(*p); p++); for (z=p; *z && !isspace(*z); z++); *z = 0; - if (is_valid_hostname(p)) memcpy(canon, p, z-p+1); + if (is_valid_hostname(p)) { + have_canon = 1; + memcpy(canon, p, z-p+1); + } } __fclose_ca(f); return cnt ? cnt : badfam; |