mailing list of musl libc
 help / color / mirror / code / Atom feed
* getaddrinfo usage with wrong ip family
@ 2015-09-22 14:40 Julien Ramseier
  2015-09-22 15:16 ` Rich Felker
  0 siblings, 1 reply; 7+ messages in thread
From: Julien Ramseier @ 2015-09-22 14:40 UTC (permalink / raw)
  To: musl

[-- Attachment #1: Type: text/plain, Size: 835 bytes --]

Hello,

I discovered a potential problem in getaddrinfo/__lookup_name.
When calling getaddrinfo  with an IP string not matching the specified family,
name_from_numeric() in __lookup_name() will not recognize it and the 
external dns resolver will be used.

So the following code:

const struct addrinfo hints = {
    .ai_flags = AI_ADDRCONFIG,
    .ai_family = AF_INET,
    .ai_socktype = SOCK_STREAM,
};

getaddrinfo("::1", NULL, &hints, &result);

will actually succeed instead of returning EAI_NONAME,
and perform a "A ::1" query.
Some misbehaving dns servers will then answer with 0.0.0.1.

I don’t know if this behavior is desirable. If not, I’m still not sure
where this should be fixed. Maybe should we prevent sending
A and AAAA dns queries with IP as hostname in __res_mkquery() ?

—
Julien


[-- Attachment #2: Type: text/html, Size: 2002 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: getaddrinfo usage with wrong ip family
  2015-09-22 14:40 getaddrinfo usage with wrong ip family Julien Ramseier
@ 2015-09-22 15:16 ` Rich Felker
  2015-09-24 10:27   ` Julien Ramseier
  0 siblings, 1 reply; 7+ messages in thread
From: Rich Felker @ 2015-09-22 15:16 UTC (permalink / raw)
  To: musl

On Tue, Sep 22, 2015 at 04:40:30PM +0200, Julien Ramseier wrote:
> Hello,
> 
> I discovered a potential problem in getaddrinfo/__lookup_name.
> When calling getaddrinfo  with an IP string not matching the specified family,
> name_from_numeric() in __lookup_name() will not recognize it and the 
> external dns resolver will be used.
> 
> So the following code:
> 
> const struct addrinfo hints = {
>     .ai_flags = AI_ADDRCONFIG,
>     .ai_family = AF_INET,
>     .ai_socktype = SOCK_STREAM,
> };
> 
> getaddrinfo("::1", NULL, &hints, &result);
> 
> will actually succeed instead of returning EAI_NONAME,
> and perform a "A ::1" query.
> Some misbehaving dns servers will then answer with 0.0.0.1.
> 
> I don’t know if this behavior is desirable. If not, I’m still not sure
> where this should be fixed. Maybe should we prevent sending
> A and AAAA dns queries with IP as hostname in __res_mkquery() ?

Sometime (it's been "soon" for a long time) I intend to add IDN
support, so the same place that goes would be the natural place to
pre-validate strings before sending them off in DNS queries. But I'm
not sure what the right filtering would be.

Another approach might be having __lookup_numeric always parse with
AF_UNSPEC, but return error rather than 0 results if the resulting
family does not match the requested family.

Anyone else have opinions on these ideas?

Rich


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: getaddrinfo usage with wrong ip family
  2015-09-22 15:16 ` Rich Felker
@ 2015-09-24 10:27   ` Julien Ramseier
  2015-09-24 10:59     ` Szabolcs Nagy
  0 siblings, 1 reply; 7+ messages in thread
From: Julien Ramseier @ 2015-09-24 10:27 UTC (permalink / raw)
  To: musl

[-- Attachment #1: Type: text/plain, Size: 380 bytes --]


> Le 22 sept. 2015 à 17:16, Rich Felker <dalias@libc.org> a écrit :
> 
> Another approach might be having __lookup_numeric always parse with
> AF_UNSPEC, but return error rather than 0 results if the resulting
> family does not match the requested family.

This seems the simplest solution in the meantime.

Here’s the patch I applied to my trunk.



—
Julien

[-- Attachment #2.1: Type: text/html, Size: 2933 bytes --]

[-- Attachment #2.2: lookup_ipliteral-error-on-incorrect-family.patch --]
[-- Type: application/octet-stream, Size: 2053 bytes --]

diff --git a/src/network/lookup_ipliteral.c b/src/network/lookup_ipliteral.c
index 7bcb85f..209dc55 100644
--- a/src/network/lookup_ipliteral.c
+++ b/src/network/lookup_ipliteral.c
@@ -15,38 +15,43 @@ int __lookup_ipliteral(struct address buf[static 1], const char *name, int famil
 {
 	struct in_addr a4;
 	struct in6_addr a6;
-	if (family != AF_INET6 && __inet_aton(name, &a4)>0) {
+	if (__inet_aton(name, &a4) > 0) {
+		if (family == AF_INET6) /* wrong family */
+			return EAI_NONAME;
 		memcpy(&buf[0].addr, &a4, sizeof a4);
 		buf[0].family = AF_INET;
 		buf[0].scopeid = 0;
 		return 1;
 	}
-	if (family != AF_INET) {
-		char tmp[64];
-		char *p = strchr(name, '%'), *z;
-		unsigned long long scopeid;
-		if (p && p-name < 64) {
-			memcpy(tmp, name, p-name);
-			tmp[p-name] = 0;
-			name = tmp;
-		}
-		if (inet_pton(AF_INET6, name, &a6)<=0) return 0;
-		memcpy(&buf[0].addr, &a6, sizeof a6);
-		buf[0].family = AF_INET6;
-		if (p) {
-			if (isdigit(*++p)) scopeid = strtoull(p, &z, 10);
-			else z = p-1;
-			if (*z) {
-				if (!IN6_IS_ADDR_LINKLOCAL(&a6) &&
-				    !IN6_IS_ADDR_MC_LINKLOCAL(&a6))
-					return EAI_NONAME;
-				scopeid = if_nametoindex(p);
-				if (!scopeid) return EAI_NONAME;
-			}
-			if (scopeid > UINT_MAX) return EAI_NONAME;
-			buf[0].scopeid = scopeid;
+
+	char tmp[64];
+	char *p = strchr(name, '%'), *z;
+	unsigned long long scopeid;
+	if (p && p-name < 64) {
+		memcpy(tmp, name, p-name);
+		tmp[p-name] = 0;
+		name = tmp;
+	}
+
+	if (inet_pton(AF_INET6, name, &a6) <= 0)
+		return 0;
+	if (family == AF_INET) /* wrong family */
+		return EAI_NONAME;
+
+	memcpy(&buf[0].addr, &a6, sizeof a6);
+	buf[0].family = AF_INET6;
+	if (p) {
+		if (isdigit(*++p)) scopeid = strtoull(p, &z, 10);
+		else z = p-1;
+		if (*z) {
+			if (!IN6_IS_ADDR_LINKLOCAL(&a6) &&
+			    !IN6_IS_ADDR_MC_LINKLOCAL(&a6))
+				return EAI_NONAME;
+			scopeid = if_nametoindex(p);
+			if (!scopeid) return EAI_NONAME;
 		}
-		return 1;
+		if (scopeid > UINT_MAX) return EAI_NONAME;
+		buf[0].scopeid = scopeid;
 	}
-	return 0;
+	return 1;
 }

[-- Attachment #2.3: Type: text/html, Size: 292 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: getaddrinfo usage with wrong ip family
  2015-09-24 10:27   ` Julien Ramseier
@ 2015-09-24 10:59     ` Szabolcs Nagy
  2015-09-24 15:11       ` Julien Ramseier
  0 siblings, 1 reply; 7+ messages in thread
From: Szabolcs Nagy @ 2015-09-24 10:59 UTC (permalink / raw)
  To: musl

* Julien Ramseier <j.ramseier@gmail.com> [2015-09-24 12:27:22 +0200]:
> > Le 22 sept. 2015 à 17:16, Rich Felker <dalias@libc.org> a écrit :
> > 
> > Another approach might be having __lookup_numeric always parse with
> > AF_UNSPEC, but return error rather than 0 results if the resulting
> > family does not match the requested family.
> 
> This seems the simplest solution in the meantime.
> 
> Here???s the patch I applied to my trunk.
> 

forgot to attach the patch?


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: getaddrinfo usage with wrong ip family
  2015-09-24 10:59     ` Szabolcs Nagy
@ 2015-09-24 15:11       ` Julien Ramseier
  2015-09-24 15:39         ` Rich Felker
  0 siblings, 1 reply; 7+ messages in thread
From: Julien Ramseier @ 2015-09-24 15:11 UTC (permalink / raw)
  To: musl


> Le 24 sept. 2015 à 12:59, Szabolcs Nagy <nsz@port70.net> a écrit :
> 
> * Julien Ramseier <j.ramseier@gmail.com> [2015-09-24 12:27:22 +0200]:
>>> Le 22 sept. 2015 à 17:16, Rich Felker <dalias@libc.org> a écrit :
>>> 
>>> Another approach might be having __lookup_numeric always parse with
>>> AF_UNSPEC, but return error rather than 0 results if the resulting
>>> family does not match the requested family.
>> 
>> This seems the simplest solution in the meantime.
>> 
>> Here???s the patch I applied to my trunk.
>> 
> 
> forgot to attach the patch?

No, but maybe my mail client screwed it up.


---
diff --git a/src/network/lookup_ipliteral.c b/src/network/lookup_ipliteral.c
index 7bcb85f..209dc55 100644
--- a/src/network/lookup_ipliteral.c
+++ b/src/network/lookup_ipliteral.c
@@ -15,38 +15,43 @@ int __lookup_ipliteral(struct address buf[static 1], const char *name, int famil
 {
 	struct in_addr a4;
 	struct in6_addr a6;
-	if (family != AF_INET6 && __inet_aton(name, &a4)>0) {
+	if (__inet_aton(name, &a4) > 0) {
+		if (family == AF_INET6) /* wrong family */
+			return EAI_NONAME;
 		memcpy(&buf[0].addr, &a4, sizeof a4);
 		buf[0].family = AF_INET;
 		buf[0].scopeid = 0;
 		return 1;
 	}
-	if (family != AF_INET) {
-		char tmp[64];
-		char *p = strchr(name, '%'), *z;
-		unsigned long long scopeid;
-		if (p && p-name < 64) {
-			memcpy(tmp, name, p-name);
-			tmp[p-name] = 0;
-			name = tmp;
-		}
-		if (inet_pton(AF_INET6, name, &a6)<=0) return 0;
-		memcpy(&buf[0].addr, &a6, sizeof a6);
-		buf[0].family = AF_INET6;
-		if (p) {
-			if (isdigit(*++p)) scopeid = strtoull(p, &z, 10);
-			else z = p-1;
-			if (*z) {
-				if (!IN6_IS_ADDR_LINKLOCAL(&a6) &&
-				    !IN6_IS_ADDR_MC_LINKLOCAL(&a6))
-					return EAI_NONAME;
-				scopeid = if_nametoindex(p);
-				if (!scopeid) return EAI_NONAME;
-			}
-			if (scopeid > UINT_MAX) return EAI_NONAME;
-			buf[0].scopeid = scopeid;
+
+	char tmp[64];
+	char *p = strchr(name, '%'), *z;
+	unsigned long long scopeid;
+	if (p && p-name < 64) {
+		memcpy(tmp, name, p-name);
+		tmp[p-name] = 0;
+		name = tmp;
+	}
+
+	if (inet_pton(AF_INET6, name, &a6) <= 0)
+		return 0;
+	if (family == AF_INET) /* wrong family */
+		return EAI_NONAME;
+
+	memcpy(&buf[0].addr, &a6, sizeof a6);
+	buf[0].family = AF_INET6;
+	if (p) {
+		if (isdigit(*++p)) scopeid = strtoull(p, &z, 10);
+		else z = p-1;
+		if (*z) {
+			if (!IN6_IS_ADDR_LINKLOCAL(&a6) &&
+			    !IN6_IS_ADDR_MC_LINKLOCAL(&a6))
+				return EAI_NONAME;
+			scopeid = if_nametoindex(p);
+			if (!scopeid) return EAI_NONAME;
 		}
-		return 1;
+		if (scopeid > UINT_MAX) return EAI_NONAME;
+		buf[0].scopeid = scopeid;
 	}
-	return 0;
+	return 1;
 }





^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: getaddrinfo usage with wrong ip family
  2015-09-24 15:11       ` Julien Ramseier
@ 2015-09-24 15:39         ` Rich Felker
  2015-09-25  1:48           ` Rich Felker
  0 siblings, 1 reply; 7+ messages in thread
From: Rich Felker @ 2015-09-24 15:39 UTC (permalink / raw)
  To: musl

On Thu, Sep 24, 2015 at 05:11:03PM +0200, Julien Ramseier wrote:
> 
> > Le 24 sept. 2015 à 12:59, Szabolcs Nagy <nsz@port70.net> a écrit :
> > 
> > * Julien Ramseier <j.ramseier@gmail.com> [2015-09-24 12:27:22 +0200]:
> >>> Le 22 sept. 2015 à 17:16, Rich Felker <dalias@libc.org> a écrit :
> >>> 
> >>> Another approach might be having __lookup_numeric always parse with
> >>> AF_UNSPEC, but return error rather than 0 results if the resulting
> >>> family does not match the requested family.
> >> 
> >> This seems the simplest solution in the meantime.
> >> 
> >> Here???s the patch I applied to my trunk.
> >> 
> > 
> > forgot to attach the patch?
> 
> No, but maybe my mail client screwed it up.

It was there, just deeply embedded in multiple layers of MIME.

Rich


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: getaddrinfo usage with wrong ip family
  2015-09-24 15:39         ` Rich Felker
@ 2015-09-25  1:48           ` Rich Felker
  0 siblings, 0 replies; 7+ messages in thread
From: Rich Felker @ 2015-09-25  1:48 UTC (permalink / raw)
  To: musl

On Thu, Sep 24, 2015 at 11:39:04AM -0400, Rich Felker wrote:
> On Thu, Sep 24, 2015 at 05:11:03PM +0200, Julien Ramseier wrote:
> > 
> > > Le 24 sept. 2015 à 12:59, Szabolcs Nagy <nsz@port70.net> a écrit :
> > > 
> > > * Julien Ramseier <j.ramseier@gmail.com> [2015-09-24 12:27:22 +0200]:
> > >>> Le 22 sept. 2015 à 17:16, Rich Felker <dalias@libc.org> a écrit :
> > >>> 
> > >>> Another approach might be having __lookup_numeric always parse with
> > >>> AF_UNSPEC, but return error rather than 0 results if the resulting
> > >>> family does not match the requested family.
> > >> 
> > >> This seems the simplest solution in the meantime.
> > >> 
> > >> Here???s the patch I applied to my trunk.
> > >> 
> > > 
> > > forgot to attach the patch?
> > 
> > No, but maybe my mail client screwed it up.
> 
> It was there, just deeply embedded in multiple layers of MIME.

The patch conflicted with commit
cb1c88d42b0ee5e950d85e933c6eb6ecb8175e1d, but I've adapted and applied
it. Let me know if you see anything I did wrong.

Rich


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-09-25  1:48 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-22 14:40 getaddrinfo usage with wrong ip family Julien Ramseier
2015-09-22 15:16 ` Rich Felker
2015-09-24 10:27   ` Julien Ramseier
2015-09-24 10:59     ` Szabolcs Nagy
2015-09-24 15:11       ` Julien Ramseier
2015-09-24 15:39         ` Rich Felker
2015-09-25  1:48           ` Rich Felker

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).