summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix von Leitner <felix-libowfat@fefe.de>2017-08-06 21:43:09 +0000
committerFelix von Leitner <felix-libowfat@fefe.de>2017-08-06 21:43:09 +0000
commit5a711cb7eea79d0aeacd324199207d4d446a38f7 (patch)
treee1cdf404b73a88d159721acf14172032df322c8f
parentcceba75ddcc93ec81ee91f1a1ded9a7faf89f2a4 (diff)
downloadlibowfat-5a711cb7eea79d0aeacd324199207d4d446a38f7.tar.gz
libowfat-5a711cb7eea79d0aeacd324199207d4d446a38f7.zip
fmt_ip6 was violating rfc5952 section 4.2.2
-rw-r--r--socket/fmt_ip6.c6
-rw-r--r--test/fmt_ip6.c9
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 <assert.h>
+#include <string.h>
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;
}