|
Message-ID: <20131021020817.GL20515@brightrain.aerifal.cx> Date: Sun, 20 Oct 2013 22:08:17 -0400 From: Rich Felker <dalias@...ifal.cx> To: musl@...ts.openwall.com Cc: Paul Schutte <sjpschutte@...il.com> Subject: Re: inet_pton It's not an annoyance at all, and your test cases may be useful for writing a regression test, so I'm replying on-list. As you may have noticed, I already fixed the first issue you reported, but the second issue does remain. nsz has proposed a simple fix: at line 61, - if (s[j]!='.') return 0; + if (s[j]!='.' || brk<0) return 0; I have not checked this yet but I suspect it's correct. Please let me know if it works for you. Rich On Sun, Oct 20, 2013 at 09:35:32PM +0200, Paul Schutte wrote: > Hi Rich, > > I send this directly to you as I think I am starting to annoy the people on > the list with this. > > I have done some testing on this and here is the result: > > > > proper > before : 0 > 1 :: 1 > 1 ::: 0 > 0 192.168.1.1 0 > 1 :192.168.1.1 0 > 1 ::192.168.1.1 1 > 1 :ffff:192.168.1.1 0 > 1 ::ffff:192.168.1.1 1 > 1 .192.168.1.1 0 > 0 :.192.168.1.1 0 > 0 ffff:c0a8:5e4 0 > 0 :ffff:c0a8:5e4 0 > 1 0:0:0:0:0:ffff:c0a8:5e4 1 > 1 0:0:0:0:ffff:c0a8:5e4 0 > 0 0::ffff:c0a8:5e4 1 > 1 ::0::ffff:c0a8:5e4 0 > 0 c0a8 0 > 0 > The following seems to produce the correct output: > > --- a/musl/src/network/inet_pton.c > +++ b/musl/src/network/inet_pton.c > @@ -14,11 +14,11 @@ > return -1; > } > > -int inet_pton(int af, const char *restrict s, void *restrict a0) > +int inet_pton(int af, const char *restrict s0, void *restrict a0) > { > uint16_t ip[8]; > unsigned char *a = a0; > - const char *z; > + const char *z, *s = s0; > unsigned long x; > int i, j, v, d, brk=-1, need_v4=0; > > @@ -36,7 +36,13 @@ > return -1; > } > > - if (s[0]==':' && s[1]==':') s++; > + if (s[0]==':') { > + if (s[1]==':') { > + s++; > + } else { > + return 0; > + } > + } > > for (i=0; ; i++, s+=j+1) { > if (s[0]==':' && brk<0) { > @@ -73,6 +79,9 @@ > *a++ = ip[j]>>8; > *a++ = ip[j]; > } > + > + if (s==s0) return 0; > + > if (need_v4 && inet_pton(AF_INET, (void *)s, a-4) <= 0) return 0; > return 1; > } > > > I used the following to test: > > #include <ctype.h> > #include <netdb.h> > #include <stdarg.h> > #include <stdio.h> > #include <stdlib.h> > #include <string.h> > #include <sys/socket.h> > #include <sys/un.h> > #include <netinet/in.h> > #include <arpa/inet.h> > > void test(char *s) { > char buf[256]; > int musl; > musl=inet_pton(AF_INET6, s, (void*)buf); > printf("%s=%d\n",s,musl); > } > > int main() { > > test(":"); > test("::"); > test(":::"); > test("192.168.1.1"); > test(":192.168.1.1"); > test("::192.168.1.1"); > test(":ffff:192.168.1.1"); > test("::ffff:192.168.1.1"); > test(".192.168.1.1"); > test(":.192.168.1.1"); > test("ffff:c0a8:5e4"); > test(":ffff:c0a8:5e4"); > test("0:0:0:0:0:ffff:c0a8:5e4"); > test("0:0:0:0:ffff:c0a8:5e4"); > test("0::ffff:c0a8:5e4"); > test("::0::ffff:c0a8:5e4"); > test("c0a8"); > > return 0; > } > > The output is as follows which seems to be the desired outcome: > :=0 > ::=1 > :::=0 > 192.168.1.1=0 > :192.168.1.1=0 > ::192.168.1.1=1 > :ffff:192.168.1.1=0 > ::ffff:192.168.1.1=1 > ..192.168.1.1=0 > :.192.168.1.1=0 > ffff:c0a8:5e4=0 > :ffff:c0a8:5e4=0 > 0:0:0:0:0:ffff:c0a8:5e4=1 > 0:0:0:0:ffff:c0a8:5e4=0 > 0::ffff:c0a8:5e4=1 > ::0::ffff:c0a8:5e4=0 > c0a8=0 > > > Hope I you find this use full. > > Regards > Paul
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.