From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7098 invoked by alias); 6 Jan 2018 22:54:50 -0000 Mailing-List: contact libc-help-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Post: List-Help: , Sender: libc-help-owner@sourceware.org Received: (qmail 7087 invoked by uid 89); 6 Jan 2018 22:54:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM,KAM_LOTSOFHASH,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=no version=3.3.2 spammy=HTo:U*libc-help X-HELO: mail-yb0-f193.google.com Received: from mail-yb0-f193.google.com (HELO mail-yb0-f193.google.com) (209.85.213.193) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 06 Jan 2018 22:54:48 +0000 Received: by mail-yb0-f193.google.com with SMTP id f16so3205136ybn.0 for ; Sat, 06 Jan 2018 14:54:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:content-transfer-encoding; bh=rvKvv1r1C99TIMPhw2+cWf2BzvEdtMsNcymyidhK79U=; b=iO5xUmuW7Edc8fbpxjBgTZpHPt5BbyrlNpFfRTguM7Ed+bp92eJxRvsPCRIDqZkF3s nqF6xtZoLJeWiVP2Z6laLDFdCw9p5j8wXojGtt1Ip6HRfNIY4jika+9HUHMMwiwv40uG aJueRYAoyPUsRAi15Z9zemsi63t44sz809l11EbHCIjjv205OmvkV/08dqD5GzyYtN70 xvRZUz1Ef+Zq1ZMYdgcgDys7OvQ9mwfyVueTh2nD8s92TvQD4stD74fd2SxQSvSELff9 sEuTGuPz87xJrOYOW4wXJtBM3e7r/1xTjytTvK2ruk3ZpCNcx1aeZzo5q6wulTb/B6C7 aCcg== X-Gm-Message-State: AKGB3mJOyTp7pZx/CiJILP8T3dgCNeCSz/fRxTUaoK2jMeb8BdGAYnlH pRDPLnxJKtbnqsIX88OTkjgfdY6Oluj4ap+KMChB X-Google-Smtp-Source: ACJfBotHICPiiuUsbxJN1To4R/tpUF9fD9M9xWNEQFZXOFZz6qU6dd7d4Z0pEcB3IjsVAe0bAfwgeO8xadTaTOENf30= X-Received: by 10.37.39.65 with SMTP id n62mr7024490ybn.481.1515279286357; Sat, 06 Jan 2018 14:54:46 -0800 (PST) MIME-Version: 1.0 Received: by 10.37.244.75 with HTTP; Sat, 6 Jan 2018 14:54:45 -0800 (PST) In-Reply-To: References: From: Yuri Kanivetsky Date: Sat, 06 Jan 2018 22:54:00 -0000 Message-ID: Subject: Re: getaddrinfo() returns two identical results To: libc-help@sourceware.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes X-SW-Source: 2018-01/txt/msg00004.txt.bz2 Hi, Okay, I more or less see now: int getaddrinfo (const char *name, const char *service, const struct addrinfo *hints, struct addrinfo **pai) https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dsysdeps/posix/ge= taddrinfo.c;h=3D2c4b6d6793a4c3a96eb1e545570ac28867681751;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l2206 last_i =3D gaih_inet (name, pservice, hints, end, &naddrs, &tmpbuf); https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dsysdeps/posix/ge= taddrinfo.c;h=3D2c4b6d6793a4c3a96eb1e545570ac28867681751;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l2304 static int gaih_inet (const char *name, const struct gaih_service *service, const struct addrinfo *req, struct addrinfo **pai, unsigned int *naddrs, struct scratch_buffer *tmpbuf) https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dsysdeps/posix/ge= taddrinfo.c;h=3D2c4b6d6793a4c3a96eb1e545570ac28867681751;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l342 rc =3D __gethostbyname2_r (name, AF_INET, &th, tmpbuf->data, tmpbuf->length, &h, &h_errno); https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dsysdeps/posix/ge= taddrinfo.c;h=3D2c4b6d6793a4c3a96eb1e545570ac28867681751;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l595 int INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffe= r, size_t buflen, LOOKUP_TYPE **result H_ERRNO_= PARM EXTRA_PARAMS) https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/getXXbyYY_r.= c;h=3Dbce80e05dd2d176467809faf353828f50cf76eaf;hb=3D633e2f7f3d88df6427aa3a7= a984d3a6b796d9611#l189 status =3D DL_CALL_FCT (fct.l, (ADD_VARIABLES, resbuf, buffer, buflen, &errno H_ERRNO_VAR EXTRA_VARIABLES)); https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/getXXbyYY_r.= c;h=3Dbce80e05dd2d176467809faf353828f50cf76eaf;hb=3D633e2f7f3d88df6427aa3a7= a984d3a6b796d9611#l316 enum nss_status _nss_files_gethostbyname2_r (const char *name, int af, struct hostent *result, char *buffer, size_t buflen, int *errnop, int *herrnop) https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-hosts.c;h=3D6f7cc4d94ba69ab58d684f63cc685f6fa5c6ad4a;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l385 return _nss_files_gethostbyname3_r (name, af, result, buffer, buflen, errnop, herrnop, NULL, NULL); https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-hosts.c;h=3D6f7cc4d94ba69ab58d684f63cc685f6fa5c6ad4a;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l389 enum nss_status _nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result, char *buffer, size_t buflen, int *errnop, int *herrnop, int32_t *ttlp, char **canonp) https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-hosts.c;h=3D6f7cc4d94ba69ab58d684f63cc685f6fa5c6ad4a;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l334 Here we get first match, and=E2=80=94if multi is on in /etc/host.conf=E2=80= =94the rest of them: while ((status =3D internal_getent (stream, result, buffer, buflen, err= nop, herrnop, af, flags)) =3D=3D NSS_STATUS_SUCCESS) { LOOKUP_NAME_CASE (h_name, h_aliases) } if (status =3D=3D NSS_STATUS_SUCCESS && _res_hconf.flags & HCONF_FLAG_MULTI) status =3D gethostbyname3_multi (stream, name, af, result, buffer, buflen, errnop, herrnop, flags); https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-hosts.c;h=3D6f7cc4d94ba69ab58d684f63cc685f6fa5c6ad4a;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l352 static enum nss_status gethostbyname3_multi (FILE * stream, const char *name, int af, struct hostent *result, char *buffer, size_t bufl= en, int *errnop, int *herrnop, int flags) https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-hosts.c;h=3D6f7cc4d94ba69ab58d684f63cc685f6fa5c6ad4a;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l127 status =3D internal_getent (stream, &tmp_result_buf, tmp_buffer.data, tmp_buffer.length, errnop, herrnop, af, flags); https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-hosts.c;h=3D6f7cc4d94ba69ab58d684f63cc685f6fa5c6ad4a;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l162 static enum nss_status internal_getent (FILE *stream, struct STRUCTURE *result, char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO EXTRA_ARGS_DECL) https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-XXX.c;h=3D265331ef21cd60ed301ab49eac4d6681d74bb388;hb=3D633e2f7f3d88df6= 427aa3a7a984d3a6b796d9611#l178 || ! (parse_result =3D parse_line (p, result, data, buflen, errnop EXTRA_ARGS))); https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-XXX.c;h=3D265331ef21cd60ed301ab49eac4d6681d74bb388;hb=3D633e2f7f3d88df6= 427aa3a7a984d3a6b796d9611#l222 Here we parse "::1 localhost.localdomain localhost" line. We try to run inet_pton over "::1". That fails, since af =3D=3D AF_INET. Then we notice that "::1" is IPv6 loopback address, so we return IPv4 loopback address: LINE_PARSER https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-hosts.c;h=3D6f7cc4d94ba69ab58d684f63cc685f6fa5c6ad4a;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l51 if (inet_pton (af =3D=3D AF_UNSPEC ? AF_INET : af, addr, entdata->host_= addr) > 0) af =3D af =3D=3D AF_UNSPEC ? AF_INET : af; else { if (...) ... else if (af =3D=3D AF_INET && inet_pton (AF_INET6, addr, entdata->host_addr) > 0) { if (...) ... else if (IN6_IS_ADDR_LOOPBACK (entdata->host_addr)) { in_addr_t localhost =3D htonl (INADDR_LOOPBACK); memcpy (entdata->host_addr, &localhost, sizeof (localhost)); } https://sourceware.org/git/?p=3Dglibc.git;a=3Dblob;f=3Dnss/nss_files/fi= les-hosts.c;h=3D6f7cc4d94ba69ab58d684f63cc685f6fa5c6ad4a;hb=3D633e2f7f3d88d= f6427aa3a7a984d3a6b796d9611#l59 Can you explain why does not fail in this case? For what it's needed? Also, it doesn't look like a major issue, but the behavior doesn't seem to be expected. Should I report a bug? Regards, Yuri