chiark / gitweb /
libudev: fix memleak when enumerating childs
authorDavid Herrmann <dh.herrmann@gmail.com>
Wed, 4 Sep 2013 10:36:19 +0000 (12:36 +0200)
committerKay Sievers <kay@vrfy.org>
Wed, 4 Sep 2013 12:56:06 +0000 (14:56 +0200)
We need to free udev-devices again if they don't match. Funny that no-one
noticed it yet since valgrind is quite verbose about it.
Fix it and free non-matching devices.

src/libudev/libudev-enumerate.c

index 3e791074f39b7235e5542209bd3808a67251b9ba..b96e5b278fa0f13b84450042b15e7ad949c39035 100644 (file)
@@ -829,23 +829,27 @@ nomatch:
 static int parent_add_child(struct udev_enumerate *enumerate, const char *path)
 {
         struct udev_device *dev;
+        int r = 0;
 
         dev = udev_device_new_from_syspath(enumerate->udev, path);
         if (dev == NULL)
                 return -ENODEV;
 
         if (!match_subsystem(enumerate, udev_device_get_subsystem(dev)))
-                return 0;
+                goto nomatch;
         if (!match_sysname(enumerate, udev_device_get_sysname(dev)))
-                return 0;
+                goto nomatch;
         if (!match_property(enumerate, dev))
-                return 0;
+                goto nomatch;
         if (!match_sysattr(enumerate, dev))
-                return 0;
+                goto nomatch;
 
         syspath_add(enumerate, udev_device_get_syspath(dev));
+        r = 1;
+
+nomatch:
         udev_device_unref(dev);
-        return 1;
+        return r;
 }
 
 static int parent_crawl_children(struct udev_enumerate *enumerate, const char *path, int maxdepth)