On 05/04/2011 07:37 PM, Eric Blake wrote:
If we plow on after udev_device_get_syspath fails, we will hit a NULL
dereference.  Clang found one due to strdup later in udevSetParent,
but in fact we hit a NULL dereference sooner because of the use of
STREQ within virNodeDeviceFindBySysfsPath.

* src/conf/node_device_conf.h (virNodeDeviceFindBySysfsPath): Mark
path argument non-null.
* src/node_device/node_device_udev.c (udevSetParent): Avoid null
dereference.
---
  src/conf/node_device_conf.h        |    5 +++--
  src/node_device/node_device_udev.c |    6 ++++--
  2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h
index 975abb3..e90bdc5 100644
--- a/src/conf/node_device_conf.h
+++ b/src/conf/node_device_conf.h
@@ -1,7 +1,7 @@
  /*
   * node_device_conf.h: config handling for node devices
   *
- * Copyright (C) 2010 Red Hat, Inc.
+ * Copyright (C) 2010-2011 Red Hat, Inc.
   * Copyright (C) 2008 Virtual Iron Software, Inc.
   * Copyright (C) 2008 David F. Lively
   *
@@ -228,7 +228,8 @@ virNodeDeviceObjPtr virNodeDeviceFindByName(const 
virNodeDeviceObjListPtr devs,
                                              const char *name);
  virNodeDeviceObjPtr
  virNodeDeviceFindBySysfsPath(const virNodeDeviceObjListPtr devs,
-                             const char *sysfs_path);
+                             const char *sysfs_path)
+    ATTRIBUTE_NONNULL(2);

  virNodeDeviceObjPtr virNodeDeviceAssignDef(virNodeDeviceObjListPtr devs,
                                             const virNodeDeviceDefPtr def);
diff --git a/src/node_device/node_device_udev.c 
b/src/node_device/node_device_udev.c
index 8cf0e82..9cca375 100644
--- a/src/node_device/node_device_udev.c
+++ b/src/node_device/node_device_udev.c
@@ -1236,8 +1236,10 @@ static int udevSetParent(struct udev_device *device,

          parent_sysfs_path = udev_device_get_syspath(parent_device);
          if (parent_sysfs_path == NULL) {
-            VIR_DEBUG("Could not get syspath for parent of '%s'",
-                      udev_device_get_syspath(parent_device));
+            virNodeDeviceReportError(VIR_ERR_INTERNAL_ERROR,
+                                     _("Could not get syspath for parent of 
'%s'"),
+                                     udev_device_get_syspath(parent_device));
+            goto out;
          }

          dev = virNodeDeviceFindBySysfsPath(&driverState->devs,

ACK.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to