multipath: fix libudev bug in sysfs_get_tgt_nodename
authorBenjamin Marzinski <bmarzins@redhat.com>
Mon, 11 Jun 2012 21:32:35 +0000 (16:32 -0500)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Tue, 12 Jun 2012 04:30:25 +0000 (06:30 +0200)
In a recent patch, I introduced a bug into sysfs_get_tgt_nodename().
multipath must not unreference the target udevice before it copies the
tgt_nodename to another location, otherwise the value pointer will be
pointing at freed memory.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
libmultipath/discovery.c

index 25c7cda..96ed308 100644 (file)
@@ -216,11 +216,13 @@ sysfs_get_tgt_nodename (struct path *pp, char * node)
                const char *value;
 
                value = udev_device_get_sysattr_value(tgtdev, "node_name");
-               udev_device_unref(tgtdev);
                if (value) {
                        strncpy(node, value, NODE_NAME_SIZE);
+                       udev_device_unref(tgtdev);
                        return 0;
                }
+               else
+                       udev_device_unref(tgtdev);
        }
 
        /* Check for iSCSI */
@@ -239,11 +241,13 @@ sysfs_get_tgt_nodename (struct path *pp, char * node)
                        const char *value;
 
                        value = udev_device_get_sysattr_value(tgtdev, "targetname");
-                       udev_device_unref(tgtdev);
                        if (value) {
                                strncpy(node, value, NODE_NAME_SIZE);
+                               udev_device_unref(tgtdev);
                                return 0;
                        }
+                       else
+                               udev_device_unref(tgtdev);
                }
        }
        return 1;