fmt_ip6 was violating rfc5952 section 4.2.2

master
leitner 7 years ago
parent 928da70f1d
commit a4a2aed3de

@ -11,9 +11,11 @@ size_t fmt_ip6(char *s,const char ip[16])
for (k=0; k<16; k+=2) { for (k=0; k<16; k+=2) {
if (ip[k]==0 && ip[k+1]==0) { if (ip[k]==0 && ip[k+1]==0) {
if (!compr) { if (!compr) {
if (k==14 || (ip[k+2]==0 && ip[k+3]==0)) {
compr=1; compr=1;
pos1=k; pos1=k;
} }
}
if (k==14) { k=16; goto last; } if (k==14) { k=16; goto last; }
} else if (compr) { } else if (compr) {
last: last:

@ -1,14 +1,19 @@
#include "ip6.h" #include "ip6.h"
#include <assert.h> #include <assert.h>
#include <string.h>
int main() { int main() {
char buf[100]; char buf[100];
int i; 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\x00")]=0;
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")); 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; 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")); 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; 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")); 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; return 0;
} }

Loading…
Cancel
Save