155 lines
8.2 KiB
Diff
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);
|
|
|
|
|
|
|