Browse Source

fmt_ip6 was violating rfc5952 section 4.2.2

master
Felix von Leitner 4 years ago
parent
commit
5a711cb7ee
  1. 6
      socket/fmt_ip6.c
  2. 9
      test/fmt_ip6.c

6
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) {

9
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;
}

Loading…
Cancel
Save