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