svn commit: r323710 - head/sys/compat/linsysfs
Conrad Meyer
cem at FreeBSD.org
Mon Sep 18 17:14:14 UTC 2017
Author: cem
Date: Mon Sep 18 17:14:13 2017
New Revision: 323710
URL: https://svnweb.freebsd.org/changeset/base/323710
Log:
linsysfs(5): Fix two unrelated issues
1. Swap the order of device_get_ivars with device_get_devclass and devclass
name validation. This bug was introduced in r323692.
2. Error check device_get_children and free the returned list. This bug was
introduced in the original linsysfs commit.
Reported by: Oleg V. Nauman <oleg AT theweb.org.ua>, hselasky (1); hselasky (2)
Reviewed by: hselasky
Sponsored by: Dell EMC Isilon
Differential Revision: https://reviews.freebsd.org/D12407
Modified:
head/sys/compat/linsysfs/linsysfs.c
Modified: head/sys/compat/linsysfs/linsysfs.c
==============================================================================
--- head/sys/compat/linsysfs/linsysfs.c Mon Sep 18 16:42:13 2017 (r323709)
+++ head/sys/compat/linsysfs/linsysfs.c Mon Sep 18 17:14:13 2017 (r323710)
@@ -252,7 +252,7 @@ linsysfs_run_bus(device_t dev, struct pfs_node *dir, s
{
struct scsi_host_queue *scsi_host;
struct pfs_node *sub_dir, *cur_file, *cur_chardev;
- int i, nchildren;
+ int i, nchildren, error;
device_t *children, parent;
devclass_t devclass;
const char *name = NULL;
@@ -353,13 +353,15 @@ linsysfs_run_bus(device_t dev, struct pfs_node *dir, s
}
}
- dinfo = device_get_ivars(parent);
- if (dinfo != NULL && dinfo->cfg.baseclass == PCIC_DISPLAY) {
- devclass = device_get_devclass(dev);
- if (devclass != NULL)
- name = devclass_get_name(devclass);
- if (name != NULL && strcmp(name, DRMN_DEV) == 0 &&
- device_get_unit(dev) >= 0) {
+ devclass = device_get_devclass(dev);
+ if (devclass != NULL)
+ name = devclass_get_name(devclass);
+ else
+ name = NULL;
+ if (name != NULL && strcmp(name, DRMN_DEV) == 0 &&
+ device_get_unit(dev) >= 0) {
+ dinfo = device_get_ivars(parent);
+ if (dinfo != NULL && dinfo->cfg.baseclass == PCIC_DISPLAY) {
sprintf(chardevname, "226:%d",
device_get_unit(dev));
cur_chardev = pfs_create_dir(chardev,
@@ -376,10 +378,13 @@ linsysfs_run_bus(device_t dev, struct pfs_node *dir, s
}
}
- device_get_children(dev, &children, &nchildren);
- for (i = 0; i < nchildren; i++) {
- if (children[i])
- linsysfs_run_bus(children[i], dir, scsi, chardev, new_path, prefix);
+ error = device_get_children(dev, &children, &nchildren);
+ if (error == 0) {
+ for (i = 0; i < nchildren; i++)
+ if (children[i])
+ linsysfs_run_bus(children[i], dir, scsi,
+ chardev, new_path, prefix);
+ free(children, M_TEMP);
}
if (new_path != path)
free(new_path, M_TEMP);
More information about the svn-src-head
mailing list