mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@libc.org>
To: Wolf <wolf@wolfsden.cz>
Cc: musl@lists.openwall.com
Subject: Re: [musl] Proposal to match behaviour of gethostbyname to glibc
Date: Fri, 17 Apr 2020 14:46:40 -0400	[thread overview]
Message-ID: <20200417184640.GM11469@brightrain.aerifal.cx> (raw)
In-Reply-To: <20200417184222.GL11469@brightrain.aerifal.cx>

On Fri, Apr 17, 2020 at 02:42:22PM -0400, Rich Felker wrote:
> On Fri, Mar 13, 2020 at 10:46:48PM +0100, Wolf wrote:
> > Hello,
> > 
> > today I've noticed difference in behavior of gethostbyname in musl and
> > in glibc. Given /etc/hosts
> > 
> > 	127.0.0.1   foo.bar foo
> > 	127.0.0.1   bar.foo foo
> > 
> > and simple test program
> > 
> > 	#include <netdb.h>
> > 	#include <stdio.h>
> > 
> > 	int main(int argc, char **argv) {
> > 		struct hostent *he = gethostbyname(argv[1]);
> > 		printf("Hostname: %s\n", he->h_name);
> > 	}
> > 
> > , I've run it both under musl (alpine) and glibc (archlinux).
> > 
> > musl:
> > 
> > 	/test # ./test foo
> > 	Hostname: bar.foo
> > 
> > glibc:
> > 
> > 	[root@foo test]# ./test foo
> > 	Hostname: foo.bar
> > 
> > I don't think there is an actual reason to iterate through all of the
> > /etc/hosts and first match can be returned instead. Following patch
> > should in my opinion fix this.
> > 
> > 
> > 
> > diff --git a/src/network/lookup_name.c b/src/network/lookup_name.c
> > index c93263a9..da8db9d4 100644
> > --- a/src/network/lookup_name.c
> > +++ b/src/network/lookup_name.c
> > @@ -87,7 +87,10 @@ static int name_from_hosts(struct address buf[static MAXADDRS], char canon[stati
> >                 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)) {
> > +                       memcpy(canon, p, z-p+1);
> > +                       break;
> > +               }
> >         }
> >         __fclose_ca(f);
> >         return cnt ? cnt : badfam;
> > 
> > 
> > 
> > While this is admittedly edge case that most users will not run into, I
> > still think it would be nice to behave the same way as glibc does on
> > this one. And as a bonus, it will be *tiny* bit faster, since there
> > would not be any need to iterate rest of the /etc/hosts file.
> > 
> > 
> > 
> > Thank you for considering this,
> 
> Patch does not apply as submitted (your mail software corrupted it in
> the message body; for future reference, use attachment if you don't
> have patch-clean mail software) but I'll apply it manually. Thanks.

Actually now that I'm doing this I'm not sure it's correct. The
existing code reports all matches from the hosts file, not just the
first one. This patch will prevent getting both ipv4 and ipv6 results,
or multiple results for the same address family, by stopping after the
first one.

If you want the canonical name to come from the first result, rather
than suppressing all but the first result, the code instead needs to
be changed to remember that it already found one name and not copy any
others.

So this needs more discussion to clarify what the actual intent is,
and whether that change is okay,  before it can move forward.

Rich

  reply	other threads:[~2020-04-17 18:46 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-13 21:46 Wolf
2020-03-13 22:16 ` Rich Felker
2020-03-13 23:43   ` Wolf
2020-04-13 23:18     ` Wolf
2020-04-15  8:31     ` Natanael Copa
2020-04-15 16:03       ` Rich Felker
2020-03-14  8:24 ` Florian Weimer
2020-03-14 14:54   ` Rich Felker
2020-03-14 16:31     ` Jeffrey Walton
2020-04-17 18:42 ` Rich Felker
2020-04-17 18:46   ` Rich Felker [this message]
2020-04-26  0:15     ` Wolf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200417184640.GM11469@brightrain.aerifal.cx \
    --to=dalias@libc.org \
    --cc=musl@lists.openwall.com \
    --cc=wolf@wolfsden.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).