]> xenbits.xensource.com Git - libvirt.git/commitdiff
node_device: avoid null dereference on error
authorEric Blake <eblake@redhat.com>
Wed, 4 May 2011 23:03:52 +0000 (17:03 -0600)
committerEric Blake <eblake@redhat.com>
Wed, 11 May 2011 17:55:16 +0000 (11:55 -0600)
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
src/node_device/node_device_udev.c

index 975abb3345c6442a08b91f3fcb1f97e3f1140365..e90bdc5003eb8832c7af5f7c47e558b07cd0984e 100644 (file)
@@ -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);
index 3b987e8f0b7cbb607d8f184a24b9b6a2f7463055..293851208e8cffb5aeb8bd11e7750246e4d72cf5 100644 (file)
@@ -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,