From: Alan T. DeKok Date: Sat, 6 Mar 2010 11:13:54 +0000 (+0100) Subject: Work around implementation-dependent shift results X-Git-Tag: release_2_1_9~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e72a07da86b1894ce0424d19bd37eb77fe55e5e;p=thirdparty%2Ffreeradius-server.git Work around implementation-dependent shift results uint32 foo = ~0; foo <<= 32; Q: what's foo? A: undefined. --- diff --git a/src/main/client.c b/src/main/client.c index 2349a8eb0bd..79fc4f6eecc 100644 --- a/src/main/client.c +++ b/src/main/client.c @@ -221,11 +221,16 @@ static int client_sane(RADCLIENT *client) uint32_t mask, *addr; addr = (uint32_t *) &client->ipaddr.ipaddr.ip6addr; - mask = ~ ((uint32_t) 0); - mask <<= (32 - (client->prefix & 0x1f)); - mask = htonl(mask); - switch ((client->prefix - 1) >> 5) { + if ((client->prefix & 0x1f) == 0) { + mask = 0; + } else { + mask = ~ ((uint32_t) 0); + mask <<= (32 - (client->prefix & 0x1f)); + mask = htonl(mask); + } + + switch (client->prefix >> 5) { case 0: addr[0] &= mask; mask = 0;