|
Message-Id: <418CD580-74BC-4B3E-BA64-CB3AEA305843@gmail.com> Date: Thu, 24 Sep 2015 17:11:03 +0200 From: Julien Ramseier <j.ramseier@...il.com> To: musl@...ts.openwall.com Subject: Re: getaddrinfo usage with wrong ip family > Le 24 sept. 2015 à 12:59, Szabolcs Nagy <nsz@...t70.net> a écrit : > > * Julien Ramseier <j.ramseier@...il.com> [2015-09-24 12:27:22 +0200]: >>> Le 22 sept. 2015 à 17:16, Rich Felker <dalias@...c.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; }
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.