]> git.puffer.fish Git - mirror/frr.git/commitdiff
[smux] 64-bit fix for lib/smux.h SNMP_INTEGER() macro
authorChris Caputo <ccaputo@alt.net>
Tue, 2 Jun 2009 17:37:11 +0000 (18:37 +0100)
committerPaul Jakma <paul@quagga.net>
Tue, 2 Jun 2009 17:38:24 +0000 (18:38 +0100)
Macro SNMP_INTEGER() prepares data which is eventually processed
by asn_build_int().  SNMP_INTEGER() was using "int32_t" whereas
asn_build_int() uses "long".  On 32-bit systems these are the
same, both 4 bytes, but on x86 64-bit systems "long" is 8 bytes.

asn_build_int()'s reaction to an improperly sized value is to return
a NULL pointer.  Quagga's smux.c would eventually get this NULL
pointer and use it in calculations to determine how much data to send
over the smux connection, resulting in garbage being sent to the
SNMP agent.

Corrected SNMP_INTEGER() to use "long".

Tested on 32-bit and 64-bit x86 Linux 2.6.27.10 systems running
Quagga 0.99.11 with bgpd smux.

lib/smux.h

index 79d23e7065a25fdb65922aee0b18a8a7b1e379bf..bab3587bc3a7d7c29902841c195c8a9fd5ae1c22 100644 (file)
@@ -127,12 +127,12 @@ struct trap_object
 
 /* Declare SMUX return value. */
 #define SNMP_LOCAL_VARIABLES \
-  static int32_t snmp_int_val; \
+  static long snmp_int_val; \
   static struct in_addr snmp_in_addr_val;
 
 #define SNMP_INTEGER(V) \
   ( \
-    *var_len = sizeof (int32_t), \
+    *var_len = sizeof (snmp_int_val), \
     snmp_int_val = V, \
     (u_char *) &snmp_int_val \
   )