From a4a2aed3defacb3c63521307fc39ef4942f433cd Mon Sep 17 00:00:00 2001 From: leitner Date: Sun, 6 Aug 2017 21:43:09 +0000 Subject: [PATCH] fmt_ip6 was violating rfc5952 section 4.2.2 --- socket/fmt_ip6.c | 6 ++++-- test/fmt_ip6.c | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/socket/fmt_ip6.c b/socket/fmt_ip6.c index 63f6a18..a23104e 100644 --- a/socket/fmt_ip6.c +++ b/socket/fmt_ip6.c @@ -11,8 +11,10 @@ size_t fmt_ip6(char *s,const char ip[16]) for (k=0; k<16; k+=2) { if (ip[k]==0 && ip[k+1]==0) { if (!compr) { - compr=1; - pos1=k; + if (k==14 || (ip[k+2]==0 && ip[k+3]==0)) { + compr=1; + pos1=k; + } } if (k==14) { k=16; goto last; } } else if (compr) { diff --git a/test/fmt_ip6.c b/test/fmt_ip6.c index 8cbfe1d..727cf8f 100644 --- a/test/fmt_ip6.c +++ b/test/fmt_ip6.c @@ -1,14 +1,19 @@ #include "ip6.h" #include +#include int main() { char buf[100]; int i; - buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")]=0; assert(i==2 && !strcmp(buf,"::")); - buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01")]=0; assert(i==3 && !strcmp(buf,"::1")); + buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")]=0; + assert(i==2 && !strcmp(buf,"::")); + buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01")]=0; + assert(i==3 && !strcmp(buf,"::1")); buf[i=fmt_ip6(buf,"\xfe\xc0\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x01")]=0; assert(i==16 && !strcmp(buf,"fec0:0:0:ffff::1")); buf[i=fmt_ip6(buf,"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x7f\x00\x00\x01")]=0; assert(i==16 && !strcmp(buf,"::ffff:127.0.0.1")); + buf[i=fmt_ip6(buf,"\x20\x01\x0d\xb8\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01")]=0; + assert(i==20 && !strcmp(buf,"2001:db8:0:1:1:1:1:1")); return 0; }