From 15e02142dcb7bcff418dd9b0753d1994b3eac496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C5=A0afr=C3=A1nek?= Date: Mon, 19 Nov 2007 07:50:57 +0000 Subject: [PATCH] fixed crash on reading xen interfaces Resolves: #386611 --- net-snmp-5.4.1-xen-crash.patch | 157 +++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 net-snmp-5.4.1-xen-crash.patch diff --git a/net-snmp-5.4.1-xen-crash.patch b/net-snmp-5.4.1-xen-crash.patch new file mode 100644 index 0000000..707b8fe --- /dev/null +++ b/net-snmp-5.4.1-xen-crash.patch @@ -0,0 +1,157 @@ +386611: snmpd segfaults on xen network interfaces +Source: http://sourceforge.net/tracker/index.php?func=detail&aid=1794532&group_id=12694&atid=112694 +Reviewed-By: Jan Safranek + +Index: agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c +=================================================================== +--- agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c (revision 16711) ++++ agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c (working copy) +@@ -258,9 +258,10 @@ + if ((NULL != rowreq_ctx) && + (MFD_SUCCESS == + ipAddressTable_indexes_set(rowreq_ctx, ++ ipaddress_entry->ia_address_len + 1, ++ ipaddress_entry->ia_address, + ipaddress_entry->ia_address_len, +- ipaddress_entry->ia_address, +- ipaddress_entry->ia_address_len))) { ++ ipaddress_entry->if_index))) { + if (CONTAINER_INSERT(container, rowreq_ctx) < 0) { + DEBUGMSGTL (("ipAddressTable:access","container insert failed for new entry\n")); + ipAddressTable_release_rowreq_ctx(rowreq_ctx); +Index: agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.c +=================================================================== +--- agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.c (revision 16711) ++++ agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.c (working copy) +@@ -348,10 +348,18 @@ + *mib_ipAddressAddrType_val_ptr = INETADDRESSTYPE_IPV4; + break; + ++ case INTERNAL_IPADDRESSTABLE_IPADDRESSADDRTYPE_IPV4Z: ++ *mib_ipAddressAddrType_val_ptr = INETADDRESSTYPE_IPV4Z; ++ break; ++ + case INTERNAL_IPADDRESSTABLE_IPADDRESSADDRTYPE_IPV6: + *mib_ipAddressAddrType_val_ptr = INETADDRESSTYPE_IPV6; + break; + ++ case INTERNAL_IPADDRESSTABLE_IPADDRESSADDRTYPE_IPV6Z: ++ *mib_ipAddressAddrType_val_ptr = INETADDRESSTYPE_IPV6Z; ++ break; ++ + default: + snmp_log(LOG_ERR, "couldn't map value %ld for ipAddressAddrType\n", + raw_ipAddressAddrType_val); +@@ -382,8 +390,11 @@ + ipAddressTable_indexes_set_tbl_idx(ipAddressTable_mib_index * tbl_idx, + u_long ipAddressAddrType_val, + char *ipAddressAddr_val_ptr, +- size_t ipAddressAddr_val_ptr_len) ++ size_t ipAddressAddr_val_ptr_len, ++ u_long ipAddressAddr_ifIndex) + { ++ uint32_t zone = htonl(ipAddressAddr_ifIndex); ++ + DEBUGMSGTL(("verbose:ipAddressTable:ipAddressTable_indexes_set_tbl_idx", "called\n")); + + /* +@@ -409,6 +420,11 @@ + memcpy(tbl_idx->ipAddressAddr, ipAddressAddr_val_ptr, + ipAddressAddr_val_ptr_len * sizeof(ipAddressAddr_val_ptr[0])); + ++ /** zone */ ++ tbl_idx->ipAddressAddr_len += sizeof(zone); ++ memcpy(&tbl_idx->ipAddressAddr[ipAddressAddr_val_ptr_len * ++ sizeof(ipAddressAddr_val_ptr[0])], ++ &zone, sizeof(zone)); + + return MFD_SUCCESS; + } /* ipAddressTable_indexes_set_tbl_idx */ +@@ -430,7 +446,8 @@ + ipAddressTable_indexes_set(ipAddressTable_rowreq_ctx * rowreq_ctx, + u_long ipAddressAddrType_val, + char *ipAddressAddr_val_ptr, +- size_t ipAddressAddr_val_ptr_len) ++ size_t ipAddressAddr_val_ptr_len, ++ u_long ipAddressAddr_ifIndex) + { + DEBUGMSGTL(("verbose:ipAddressTable:ipAddressTable_indexes_set", + "called\n")); +@@ -439,7 +456,8 @@ + ipAddressTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx, + ipAddressAddrType_val, + ipAddressAddr_val_ptr, +- ipAddressAddr_val_ptr_len)) ++ ipAddressAddr_val_ptr_len, ++ ipAddressAddr_ifIndex)) + return MFD_ERROR; + + /* +Index: agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_constants.h +=================================================================== +--- agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_constants.h (revision 16711) ++++ agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_constants.h (working copy) +@@ -106,7 +106,9 @@ + * simplistic map of address length to type + */ + #define INTERNAL_IPADDRESSTABLE_IPADDRESSADDRTYPE_IPV4 4 ++#define INTERNAL_IPADDRESSTABLE_IPADDRESSADDRTYPE_IPV4Z 5 + #define INTERNAL_IPADDRESSTABLE_IPADDRESSADDRTYPE_IPV6 16 ++#define INTERNAL_IPADDRESSTABLE_IPADDRESSADDRTYPE_IPV6Z 17 + + + /************************************************************* +Index: agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.h +=================================================================== +--- agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.h (revision 16711) ++++ agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.h (working copy) +@@ -273,14 +273,16 @@ + u_long ipAddressAddrType_val, + char *ipAddressAddr_val_ptr, + size_t +- ipAddressAddr_val_ptr_len); ++ ipAddressAddr_val_ptr_len, ++ u_long ipAddressAddr_ifIndex); + int ipAddressTable_indexes_set(ipAddressTable_rowreq_ctx * + rowreq_ctx, + u_long + ipAddressAddrType_val, + char *ipAddressAddr_val_ptr, + size_t +- ipAddressAddr_val_ptr_len); ++ ipAddressAddr_val_ptr_len, ++ u_long ipAddressAddr_ifIndex); + + + +Index: agent/mibgroup/ip-mib/data_access/ipaddress_common.c +=================================================================== +--- agent/mibgroup/ip-mib/data_access/ipaddress_common.c (revision 16711) ++++ agent/mibgroup/ip-mib/data_access/ipaddress_common.c (working copy) +@@ -411,6 +415,7 @@ + { + const netsnmp_ipaddress_entry *lh = (const netsnmp_ipaddress_entry *)lhs; + const netsnmp_ipaddress_entry *rh = (const netsnmp_ipaddress_entry *)rhs; ++ int rc; + + netsnmp_assert(NULL != lhs); + netsnmp_assert(NULL != rhs); +@@ -426,5 +431,17 @@ + /* + * length equal, compare address + */ +- return memcmp(lh->ia_address, rh->ia_address, lh->ia_address_len); ++ rc = memcmp(lh->ia_address, rh->ia_address, lh->ia_address_len); ++ if (rc) ++ return rc; ++ ++ /* ++ * address same, compare ifIndex ++ */ ++ if (lh->if_index < rh->if_index) ++ return -1; ++ else if (lh->if_index > rh->if_index) ++ return 1; ++ ++ return 0; + }