]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
Fix bad hash calculation because of signed address
authorStephen Hemminger <stephen.hemminger@vyatta.com>
Thu, 8 May 2008 16:11:04 +0000 (09:11 -0700)
committerStephen Hemminger <stephen.hemminger@vyatta.com>
Thu, 8 May 2008 16:11:04 +0000 (09:11 -0700)
The addr[] was being used signed, but this causes hash calcultion
to overflow. Originally reported as Debian bug 480173.

lib/utils.c

index d99deacd46f7115645db0c58b8f9587784b9a36d..fa4fe3e6d48e2827639d144a595fcdd85a10f427 100644 (file)
@@ -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: