Thanks, I fixed it differently by fixing the hash function and using
proper typing.
-----
From 7dec1bf88bc34e2d0b320f0c23bd1a060c73852b Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <[EMAIL PROTECTED]>
Date: Thu, 8 May 2008 09:11:04 -0700
Subject: [PATCH] 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.
---
lib/utils.c | 12 +++++++-----
1 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/lib/utils.c b/lib/utils.c
index d99deac..fa4fe3e 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:
--
1.5.4.3
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]