Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
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.