svn commit: r241003 - stable/9/usr.sbin/bsnmpd/modules/snmp_hostres
Mikolaj Golub
trociny at FreeBSD.org
Thu Sep 27 18:51:04 UTC 2012
Author: trociny
Date: Thu Sep 27 18:51:03 2012
New Revision: 241003
URL: http://svn.freebsd.org/changeset/base/241003
Log:
MFC r240595:
In snmp_hostres, device_map table is used for consistent device table
indexing. When a device has gone it is not removed from device_map
table but just its entry_p field is set to NULL.
So when traversing device_map in disk_OS_get_ATA_disks() and
disk_OS_get_MD_disks() check for entry_p being NULL, otherwise the
bsnmpd crash is possible when a removed map entry is dereferenced.
Before the fix, for disk_OS_get_ATA_disks() the crash could be easily
reproduced running:
atacontrol detach ata1
The crash was not observed in disk_OS_get_MD_disks() because currently
snmp_hostres does no see md(4) disks: to get the device list it uses
devinfo(3), which does not return md devices.
Reported by: Miroslav Lachman 000.fbsd quip.cz
Modified:
stable/9/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_diskstorage_tbl.c
Directory Properties:
stable/9/usr.sbin/bsnmpd/ (props changed)
Modified: stable/9/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_diskstorage_tbl.c
==============================================================================
--- stable/9/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_diskstorage_tbl.c Thu Sep 27 18:15:01 2012 (r241002)
+++ stable/9/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_diskstorage_tbl.c Thu Sep 27 18:51:03 2012 (r241003)
@@ -287,6 +287,9 @@ disk_OS_get_ATA_disks(void)
/* Walk over the device table looking for ata disks */
STAILQ_FOREACH(map, &device_map, link) {
+ /* Skip deleted entries. */
+ if (map->entry_p == NULL)
+ continue;
for (found = lookup; found->media != DSM_UNKNOWN; found++) {
if (strncmp(map->name_key, found->dev_name,
strlen(found->dev_name)) != 0)
@@ -345,6 +348,9 @@ disk_OS_get_MD_disks(void)
/* Look for md devices */
STAILQ_FOREACH(map, &device_map, link) {
+ /* Skip deleted entries. */
+ if (map->entry_p == NULL)
+ continue;
if (sscanf(map->name_key, "md%d", &unit) != 1)
continue;
More information about the svn-src-stable-9
mailing list