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 =================================================================== 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);