bus error in argus_dlpi 2.0.6
William Setzer
William_Setzer at ncsu.edu
Wed Dec 10 10:13:11 EST 2003
Under Solaris 8 and compiled with gcc 2.9.5, for some reason the
variables `oip' and `icmp' in the following bit of the argus
server (Argus_icmp.c, lines 197-201, the 2.0.6 RC):
struct ip *oip = &icmp->icmp_ip;
icmpObj->isrcaddr = ntohl(oip->ip_src.s_addr);
icmpObj->idstaddr = ntohl(oip->ip_dst.s_addr);
icmpObj->igwaddr = ntohl(icmp->icmp_gwaddr.s_addr);
can sometimes be misaligned and put on a 2 byte boundary instead
of a 4 byte boundary, and so cause a bus error on lines 199-201
when accessed.
I tried compiling both with and without optimization, and also
tried moving the two variables around in the source, but neither
worked. This patch seems to work, but is exceedingly cheesy:
--- Argus_icmp.c.orig 2003-03-26 23:11:13.000001000 -0500
+++ Argus_icmp.c 2003-12-09 17:00:49.000026000 -0500
@@ -195,10 +195,16 @@
}
} else {
struct ip *oip = &icmp->icmp_ip;
-
- icmpObj->isrcaddr = ntohl(oip->ip_src.s_addr);
- icmpObj->idstaddr = ntohl(oip->ip_dst.s_addr);
- icmpObj->igwaddr = ntohl(icmp->icmp_gwaddr.s_addr);
+ struct icmp *oicmp = icmp;
+ struct ip oipcopy;
+ struct icmp oicmpcopy;
+
+ bcopy((char *)oip, (char *)&oipcopy, sizeof(struct ip));
+ bcopy((char *)oicmp, (char *)&oicmpcopy, sizeof(struct icmp));
+
+ icmpObj->isrcaddr = ntohl(oipcopy.ip_src.s_addr);
+ icmpObj->idstaddr = ntohl(oipcopy.ip_dst.s_addr);
+ icmpObj->igwaddr = ntohl(oicmpcopy.icmp_gwaddr.s_addr);
}
}
} else {
I'm afraid it's been so long since I've done any C that I've lost
any idea how to do this properly. I'll leave it up to the experts
then. :)
William
More information about the argus
mailing list