* Re: inet_pton
[not found] <CAKHv7pi-VhjkzOpUuz3RBachSPfPOHXN09G7rhM9uFtw4ri2-A@mail.gmail.com>
@ 2013-10-21 2:08 ` Rich Felker
2013-10-21 19:59 ` inet_pton Paul Schutte
0 siblings, 1 reply; 6+ messages in thread
From: Rich Felker @ 2013-10-21 2:08 UTC (permalink / raw)
To: musl; +Cc: Paul Schutte
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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Re: inet_pton
2013-10-21 2:08 ` inet_pton Rich Felker
@ 2013-10-21 19:59 ` Paul Schutte
2013-10-21 22:25 ` Szabolcs Nagy
2013-10-25 15:44 ` Rich Felker
0 siblings, 2 replies; 6+ messages in thread
From: Paul Schutte @ 2013-10-21 19:59 UTC (permalink / raw)
To: musl
[-- Attachment #1: Type: text/plain, Size: 4500 bytes --]
Hi,
I have tested the suggested fix and this is the result:
: 1 <--
:: 1
::: 0
192.168.1.1 0
:192.168.1.1 1 <--
::192.168.1.1 1
:ffff:192.168.1.1 1 <--
::ffff:192.168.1.1 1
.192.168.1.1 0
:.192.168.1.1 0
ffff:c0a8:5e4 0
:ffff:c0a8:5e4 1 <--
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
Those marked with the <-- are still incorrect.
Regards
Paul
On Mon, Oct 21, 2013 at 4:08 AM, Rich Felker <dalias@aerifal.cx> wrote:
> 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
>
[-- Attachment #2: Type: text/html, Size: 6178 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Re: inet_pton
2013-10-21 19:59 ` inet_pton Paul Schutte
@ 2013-10-21 22:25 ` Szabolcs Nagy
2013-10-21 23:20 ` Szabolcs Nagy
2013-10-25 15:44 ` Rich Felker
1 sibling, 1 reply; 6+ messages in thread
From: Szabolcs Nagy @ 2013-10-21 22:25 UTC (permalink / raw)
To: musl
* Paul Schutte <sjpschutte@gmail.com> [2013-10-21 21:59:16 +0200]:
> I have tested the suggested fix and this is the result:
i've added your test cases to libc-test and some more
which revealed further issues
src/functional/inet_pton.c:59: inet_pton(AF_INET, "1.2.3.", addr) returned 1, want 0
src/functional/inet_pton.c:60: inet_pton(AF_INET, "1.2.3.4.5", addr) returned 1, want 0
src/functional/inet_pton.c:62: inet_pton(AF_INET, "1.2.03.4", addr) returned 1, want 0
src/functional/inet_pton.c:68: inet_pton(AF_INET6, ":", addr) returned 1, want 0
src/functional/inet_pton.c:73: inet_pton(AF_INET6, ":192.168.1.1", addr) returned 1, want 0
src/functional/inet_pton.c:75: inet_pton(AF_INET6, ":ffff:192.168.1.1", addr) returned 1, want 0
src/functional/inet_pton.c:81: inet_pton(AF_INET6, ":ffff:c0a8:5e4", addr) returned 1, want 0
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Re: inet_pton
2013-10-21 22:25 ` Szabolcs Nagy
@ 2013-10-21 23:20 ` Szabolcs Nagy
0 siblings, 0 replies; 6+ messages in thread
From: Szabolcs Nagy @ 2013-10-21 23:20 UTC (permalink / raw)
To: musl
* Szabolcs Nagy <nsz@port70.net> [2013-10-22 00:25:17 +0200]:
> * Paul Schutte <sjpschutte@gmail.com> [2013-10-21 21:59:16 +0200]:
> > I have tested the suggested fix and this is the result:
>
> i've added your test cases to libc-test and some more
> which revealed further issues
>
these two changes fix the v6 bugs, but leading zeros of the v4 part
are still swallowed incorrectly (even if v4 parsing gets fixed)
- if (s[0]==':' && s[1]==':') s++;
+ if (s[0]==':' && *++s!=':') return 0;
- if (s[j]!='.') return 0;
+ if (s[j]!='.' || (i<6 && brk<0)) return 0;
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Re: inet_pton
2013-10-21 19:59 ` inet_pton Paul Schutte
2013-10-21 22:25 ` Szabolcs Nagy
@ 2013-10-25 15:44 ` Rich Felker
2013-10-26 13:22 ` Paul Schutte
1 sibling, 1 reply; 6+ messages in thread
From: Rich Felker @ 2013-10-25 15:44 UTC (permalink / raw)
To: musl
On Mon, Oct 21, 2013 at 09:59:16PM +0200, Paul Schutte wrote:
> Hi,
>
> I have tested the suggested fix and this is the result:
>
> : 1 <--
> :: 1
> ::: 0
> 192.168.1.1 0
> :192.168.1.1 1 <--
> ::192.168.1.1 1
> :ffff:192.168.1.1 1 <--
> ::ffff:192.168.1.1 1
> ..192.168.1.1 0
> :.192.168.1.1 0
> ffff:c0a8:5e4 0
> :ffff:c0a8:5e4 1 <--
> 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
>
>
>
> Those marked with the <-- are still incorrect.
I've merged nsz's fixes and they seem to be handled correctly now. nsz
added your test cases to libc-test too. Please let me know if you're
still experiencing problems.
Rich
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Re: inet_pton
2013-10-25 15:44 ` Rich Felker
@ 2013-10-26 13:22 ` Paul Schutte
0 siblings, 0 replies; 6+ messages in thread
From: Paul Schutte @ 2013-10-26 13:22 UTC (permalink / raw)
To: musl
Thanks you very much Nsz and Rich !
It is working perfectly now.
Big thanks
Paul
On 10/25/13, Rich Felker <dalias@aerifal.cx> wrote:
> On Mon, Oct 21, 2013 at 09:59:16PM +0200, Paul Schutte wrote:
>> Hi,
>>
>> I have tested the suggested fix and this is the result:
>>
>> : 1 <--
>> :: 1
>> ::: 0
>> 192.168.1.1 0
>> :192.168.1.1 1 <--
>> ::192.168.1.1 1
>> :ffff:192.168.1.1 1 <--
>> ::ffff:192.168.1.1 1
>> ..192.168.1.1 0
>> :.192.168.1.1 0
>> ffff:c0a8:5e4 0
>> :ffff:c0a8:5e4 1 <--
>> 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
>>
>>
>>
>> Those marked with the <-- are still incorrect.
>
> I've merged nsz's fixes and they seem to be handled correctly now. nsz
> added your test cases to libc-test too. Please let me know if you're
> still experiencing problems.
>
> Rich
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-10-26 13:22 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <CAKHv7pi-VhjkzOpUuz3RBachSPfPOHXN09G7rhM9uFtw4ri2-A@mail.gmail.com>
2013-10-21 2:08 ` inet_pton Rich Felker
2013-10-21 19:59 ` inet_pton Paul Schutte
2013-10-21 22:25 ` Szabolcs Nagy
2013-10-21 23:20 ` Szabolcs Nagy
2013-10-25 15:44 ` Rich Felker
2013-10-26 13:22 ` Paul Schutte
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).