net-snmp/net-snmp-5.4.1-xen-crash.patch

155 lines
8.2 KiB
Diff

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 <jsafrane@redhat.com>
Index: agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c
===================================================================
diff -up net-snmp-5.4.1/agent/mibgroup/ip-mib/data_access/ipaddress_common.c.backup_patch_16 net-snmp-5.4.1/agent/mibgroup/ip-mib/data_access/ipaddress_common.c
--- net-snmp-5.4.1/agent/mibgroup/ip-mib/data_access/ipaddress_common.c.backup_patch_16 2007-07-17 01:59:44.000000000 +0200
+++ net-snmp-5.4.1/agent/mibgroup/ip-mib/data_access/ipaddress_common.c 2008-07-25 12:53:57.000000000 +0200
@@ -411,6 +411,7 @@ static int _access_ipaddress_entry_compa
{
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 +427,17 @@ static int _access_ipaddress_entry_compa
/*
* 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;
}
diff -up net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.c.backup_patch_16 net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.c
--- net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.c.backup_patch_16 2006-12-06 16:10:40.000000000 +0100
+++ net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.c 2008-07-25 12:53:57.000000000 +0200
@@ -348,10 +348,18 @@ ipAddressAddrType_map(u_long * mib_ipAdd
*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 @@ int
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 @@ ipAddressTable_indexes_set_tbl_idx(ipAdd
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 @@ int
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(ipAddressTabl
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;
/*
diff -up net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_constants.h.backup_patch_16 net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_constants.h
--- net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_constants.h.backup_patch_16 2005-12-01 18:00:57.000000000 +0100
+++ net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_constants.h 2008-07-25 12:53:57.000000000 +0200
@@ -106,7 +106,9 @@ extern "C" {
* 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
/*************************************************************
diff -up net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c.backup_patch_16 net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c
--- net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c.backup_patch_16 2007-05-17 23:53:28.000000000 +0200
+++ net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c 2008-07-25 12:53:57.000000000 +0200
@@ -258,9 +258,10 @@ _add_new_entry(netsnmp_ipaddress_entry *
if ((NULL != rowreq_ctx) &&
(MFD_SUCCESS ==
ipAddressTable_indexes_set(rowreq_ctx,
- ipaddress_entry->ia_address_len,
+ ipaddress_entry->ia_address_len + 1,
ipaddress_entry->ia_address,
- ipaddress_entry->ia_address_len))) {
+ 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);
diff -up net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.h.backup_patch_16 net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.h
--- net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.h.backup_patch_16 2006-01-25 17:28:12.000000000 +0100
+++ net-snmp-5.4.1/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable.h 2008-07-25 12:53:57.000000000 +0200
@@ -273,14 +273,16 @@ config_require(ip-mib/ipAddressTable/ipA
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);