diff --git a/src/auth.c b/src/auth.c index 9c15bb0..53076e6 100644 --- a/src/auth.c +++ b/src/auth.c @@ -255,18 +255,19 @@ int handleredirect(struct clientparam * param, struct ace * acentry){ if(SAISNULL(¶m->sinsl))param->sinsl = param->sincr; #ifndef NOIPV6 else if(cur->cidr && *SAFAMILY(¶m->sinsl) == AF_INET6){ - char c; + uint16_t c; int i; - for(i = 0; i < 16; i++){ - if(i%8)myrand(¶m->sincr, sizeof(param->sincr)); - else if(i%4) myrand(¶m->req, sizeof(param->req)); + for(i = 0; i < 8; i++){ + if(i==4)myrand(¶m->sincr, sizeof(param->sincr)); + else if(i==6) myrand(¶m->req, sizeof(param->req)); - if(i*8 >= cur->cidr) ((char *)SAADDR(¶m->sinsl))[i] = rand(); - else if ((i+1)*8 > cur->cidr){ + if(i*16 >= cur->cidr) ((uint16_t *)SAADDR(¶m->sinsl))[i] |= rand(); + else if ((i+1)*16 > cur->cidr){ c = rand(); - c >>= (cur->cidr - (i*8)); - ((char *)SAADDR(¶m->sinsl))[i] |= c; + c >>= (cur->cidr - (i*16)); + c |= ntohs(((uint16_t *)SAADDR(¶m->sinsl))[i]); + ((uint16_t *)SAADDR(¶m->sinsl))[i] = htons(c); } } }