From: Stephen Hemminger Date: Thu, 8 May 2008 16:11:04 +0000 (-0700) Subject: Fix bad hash calculation because of signed address X-Git-Tag: v2.6.26~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7dec1bf88bc34e2d0b320f0c23bd1a060c73852b;p=thirdparty%2Fiproute2.git Fix bad hash calculation because of signed address The addr[] was being used signed, but this causes hash calcultion to overflow. Originally reported as Debian bug 480173. --- diff --git a/lib/utils.c b/lib/utils.c index d99deacd4..fa4fe3e6d 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -518,13 +518,14 @@ const char *rt_addr_n2a(int af, int len, const void *addr, char *buf, int buflen struct namerec { struct namerec *next; + const char *name; inet_prefix addr; - char *name; }; -static struct namerec *nht[256]; +#define NHASH 257 +static struct namerec *nht[NHASH]; -char *resolve_address(const char *addr, int len, int af) +static const char *resolve_address(const void *addr, int len, int af) { struct namerec *n; struct hostent *h_ent; @@ -539,7 +540,7 @@ char *resolve_address(const char *addr, int len, int af) len = 4; } - hash = addr[len-1] ^ addr[len-2] ^ addr[len-3] ^ addr[len-4]; + hash = *(__u32 *)(addr + len - 4) % NHASH; for (n = nht[hash]; n; n = n->next) { if (n->addr.family == af && @@ -573,7 +574,8 @@ const char *format_host(int af, int len, const void *addr, { #ifdef RESOLVE_HOSTNAMES if (resolve_hosts) { - char *n; + const char *n; + if (len <= 0) { switch (af) { case AF_INET: