be52b9f
From fa74dedd21c2c64dc6cf20f49be9db32d909db74 Mon Sep 17 00:00:00 2001
be52b9f
From: David Herrmann <dh.herrmann@gmail.com>
be52b9f
Date: Wed, 4 Sep 2013 12:36:19 +0200
51b11df
Subject: [PATCH] libudev: fix memleak when enumerating childs
be52b9f
be52b9f
We need to free udev-devices again if they don't match. Funny that no-one
be52b9f
noticed it yet since valgrind is quite verbose about it.
be52b9f
Fix it and free non-matching devices.
be52b9f
---
be52b9f
 src/libudev/libudev-enumerate.c | 14 +++++++++-----
be52b9f
 1 file changed, 9 insertions(+), 5 deletions(-)
be52b9f
be52b9f
diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c
674ca7d
index 5ccaabdc6c..7e63820cba 100644
be52b9f
--- a/src/libudev/libudev-enumerate.c
be52b9f
+++ b/src/libudev/libudev-enumerate.c
be52b9f
@@ -826,23 +826,27 @@ nomatch:
be52b9f
 static int parent_add_child(struct udev_enumerate *enumerate, const char *path)
be52b9f
 {
be52b9f
         struct udev_device *dev;
be52b9f
+        int r = 0;
be52b9f
 
be52b9f
         dev = udev_device_new_from_syspath(enumerate->udev, path);
be52b9f
         if (dev == NULL)
be52b9f
                 return -ENODEV;
be52b9f
 
be52b9f
         if (!match_subsystem(enumerate, udev_device_get_subsystem(dev)))
be52b9f
-                return 0;
be52b9f
+                goto nomatch;
be52b9f
         if (!match_sysname(enumerate, udev_device_get_sysname(dev)))
be52b9f
-                return 0;
be52b9f
+                goto nomatch;
be52b9f
         if (!match_property(enumerate, dev))
be52b9f
-                return 0;
be52b9f
+                goto nomatch;
be52b9f
         if (!match_sysattr(enumerate, dev))
be52b9f
-                return 0;
be52b9f
+                goto nomatch;
be52b9f
 
be52b9f
         syspath_add(enumerate, udev_device_get_syspath(dev));
be52b9f
+        r = 1;
be52b9f
+
be52b9f
+nomatch:
be52b9f
         udev_device_unref(dev);
be52b9f
-        return 1;
be52b9f
+        return r;
be52b9f
 }
be52b9f
 
be52b9f
 static int parent_crawl_children(struct udev_enumerate *enumerate, const char *path, int maxdepth)