daandemeyer / rpms / systemd

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