[systemd] systemd-206-11

Harald Hoyer harald at fedoraproject.org
Fri Sep 6 05:48:18 UTC 2013


commit db3a9fa0d988569a2d8005c8911c95729e235ee9
Author: Harald Hoyer <harald at redhat.com>
Date:   Fri Sep 6 07:47:41 2013 +0200

    systemd-206-11
    
    - support "debug" kernel command line parameter
    - journald: fix fd leak in journal_file_empty
    - journald: fix vacuuming of archived journals
    - libudev: enumerate - do not try to match against an empty subsystem
    - cgtop: fixup the online help
    - libudev: fix memleak when enumerating childs

 ...-when-debug-is-used-on-the-kernel-command.patch |   30 ++++++++++++
 ...budev-fix-memleak-when-enumerating-childs.patch |   49 ++++++++++++++++++++
 0044-cgtop-fixup-the-online-help.patch             |   27 +++++++++++
 ...merate-fix-NULL-deref-for-subsystem-match.patch |   44 ++++++++++++++++++
 ...merate-do-not-try-to-match-against-an-emp.patch |   38 +++++++++++++++
 ...urnald-fix-vacuuming-of-archived-journals.patch |   42 +++++++++++++++++
 ...ournald-fix-fd-leak-in-journal_file_empty.patch |   32 +++++++++++++
 systemd.spec                                       |   18 ++++++-
 8 files changed, 278 insertions(+), 2 deletions(-)
---
diff --git a/0042-log-to-kmsg-when-debug-is-used-on-the-kernel-command.patch b/0042-log-to-kmsg-when-debug-is-used-on-the-kernel-command.patch
new file mode 100644
index 0000000..0b4bbf8
--- /dev/null
+++ b/0042-log-to-kmsg-when-debug-is-used-on-the-kernel-command.patch
@@ -0,0 +1,30 @@
+From ea7df0ea7dd50f119f5f6b8cecffdbbbe49deda0 Mon Sep 17 00:00:00 2001
+From: Kay Sievers <kay at vrfy.org>
+Date: Tue, 27 Aug 2013 18:25:06 +0200
+Subject: [PATCH] log to kmsg when "debug" is used on the kernel command line
+
+---
+ src/core/main.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/src/core/main.c b/src/core/main.c
+index 77cdcfe..716def7 100644
+--- a/src/core/main.c
++++ b/src/core/main.c
+@@ -413,9 +413,14 @@ static int parse_proc_cmdline_word(const char *word) {
+ 
+         } else if (streq(word, "quiet"))
+                 arg_show_status = false;
+-        else if (streq(word, "debug"))
++        else if (streq(word, "debug")) {
++                /* Log to kmsg, the journal socket will fill up before the
++                 * journal is started and tools running during that time
++                 * will block with every log message for for 60 seconds,
++                 * before they give up. */
+                 log_set_max_level(LOG_DEBUG);
+-        else if (!in_initrd()) {
++                log_set_target(LOG_TARGET_KMSG);
++        } else if (!in_initrd()) {
+                 unsigned i;
+ 
+                 /* SysV compatibility */
diff --git a/0043-libudev-fix-memleak-when-enumerating-childs.patch b/0043-libudev-fix-memleak-when-enumerating-childs.patch
new file mode 100644
index 0000000..cf471f8
--- /dev/null
+++ b/0043-libudev-fix-memleak-when-enumerating-childs.patch
@@ -0,0 +1,49 @@
+From 407df48ed36526f773dcc60ab6cef0f5ce441fe7 Mon Sep 17 00:00:00 2001
+From: David Herrmann <dh.herrmann at gmail.com>
+Date: Wed, 4 Sep 2013 12:36:19 +0200
+Subject: [PATCH] libudev: fix memleak when enumerating childs
+
+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 | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c
+index 3e79107..b96e5b2 100644
+--- a/src/libudev/libudev-enumerate.c
++++ b/src/libudev/libudev-enumerate.c
+@@ -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)
diff --git a/0044-cgtop-fixup-the-online-help.patch b/0044-cgtop-fixup-the-online-help.patch
new file mode 100644
index 0000000..0eccf77
--- /dev/null
+++ b/0044-cgtop-fixup-the-online-help.patch
@@ -0,0 +1,27 @@
+From 3af2fb43cba8a683cbe8bbcb3bc44dbce8d553af Mon Sep 17 00:00:00 2001
+From: Brandon Philips <brandon at ifup.co>
+Date: Tue, 3 Sep 2013 21:34:02 -0700
+Subject: [PATCH] cgtop: fixup the online help
+
+The online help shows the keys as uppercase but the code and manpage say
+lower case. Make the online help follow reality.
+---
+ src/cgtop/cgtop.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c
+index fb523a3..cacf705 100644
+--- a/src/cgtop/cgtop.c
++++ b/src/cgtop/cgtop.c
+@@ -824,9 +824,9 @@ int main(int argc, char *argv[]) {
+                 case '?':
+                 case 'h':
+                         fprintf(stdout,
+-                                "\t<" ON "P" OFF "> By path; <" ON "T" OFF "> By tasks; <" ON "C" OFF "> By CPU; <" ON "M" OFF "> By memory; <" ON "I" OFF "> By I/O\n"
++                                "\t<" ON "p" OFF "> By path; <" ON "t" OFF "> By tasks; <" ON "c" OFF "> By CPU; <" ON "m" OFF "> By memory; <" ON "i" OFF "> By I/O\n"
+                                 "\t<" ON "+" OFF "> Increase delay; <" ON "-" OFF "> Decrease delay; <" ON "%%" OFF "> Toggle time\n"
+-                                "\t<" ON "Q" OFF "> Quit; <" ON "SPACE" OFF "> Refresh");
++                                "\t<" ON "q" OFF "> Quit; <" ON "SPACE" OFF "> Refresh");
+                         fflush(stdout);
+                         sleep(3);
+                         break;
diff --git a/0045-libudev-enumerate-fix-NULL-deref-for-subsystem-match.patch b/0045-libudev-enumerate-fix-NULL-deref-for-subsystem-match.patch
new file mode 100644
index 0000000..e143776
--- /dev/null
+++ b/0045-libudev-enumerate-fix-NULL-deref-for-subsystem-match.patch
@@ -0,0 +1,44 @@
+From 8d74c49c208f4e36ef844a584557fc5577272c27 Mon Sep 17 00:00:00 2001
+From: David Herrmann <dh.herrmann at gmail.com>
+Date: Fri, 30 Aug 2013 15:50:41 +0200
+Subject: [PATCH] libudev: enumerate: fix NULL-deref for subsystem-matches
+
+udev_device_get_subsystem() may return NULL if no subsystem could be
+figured out by libudev. This might be due to OOM or if the device
+disconnected between the udev_device_new() call and
+udev_device_get_subsystem(). Therefore, we need to handle subsystem==NULL
+safely.
+
+Instead of testing for it in each helper, we treat subsystem==NULL as
+empty subsystem in match_subsystem().
+
+Backtrace of udev_enumerate with an input-device disconnecting in exactly
+this time-frame:
+ (gdb) bt
+ #0  0x00007ffff569dc24 in strnlen () from /usr/lib/libc.so.6
+ #1  0x00007ffff56d9e04 in fnmatch@@GLIBC_2.2.5 () from /usr/lib/libc.so.6
+ #2  0x00007ffff5beb83d in match_subsystem (udev_enumerate=0x7a05f0, subsystem=0x0) at src/libudev/libudev-enumerate.c:727
+ #3  0x00007ffff5bebb30 in parent_add_child (enumerate=enumerate at entry=0x7a05f0, path=<optimized out>) at src/libudev/libudev-enumerate.c:834
+ #4  0x00007ffff5bebc3f in parent_crawl_children (enumerate=enumerate at entry=0x7a05f0, path=0x7a56b0 "/sys/devices/<shortened>/input/input97", maxdepth=maxdepth at entry=254) at src/libudev/libudev-enumerate.c:866
+ #5  0x00007ffff5bebc54 in parent_crawl_children (enumerate=enumerate at entry=0x7a05f0, path=0x79e8c0 "/sys/devices/<shortened>/input", maxdepth=maxdepth at entry=255) at src/libudev/libudev-enumerate.c:868
+ #6  0x00007ffff5bebc54 in parent_crawl_children (enumerate=enumerate at entry=0x7a05f0, path=path at entry=0x753190 "/sys/devices/<shortened>", maxdepth=maxdepth at entry=256) at src/libudev/libudev-enumerate.c:868
+ #7  0x00007ffff5bec7df in scan_devices_children (enumerate=0x7a05f0) at src/libudev/libudev-enumerate.c:882
+ #8  udev_enumerate_scan_devices (udev_enumerate=udev_enumerate at entry=0x7a05f0) at src/libudev/libudev-enumerate.c:919
+ #9  0x00007ffff5df8777 in <random_caller> () at some/file.c:181
+---
+ src/libudev/libudev-enumerate.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c
+index b96e5b2..385829d 100644
+--- a/src/libudev/libudev-enumerate.c
++++ b/src/libudev/libudev-enumerate.c
+@@ -721,6 +721,8 @@ static bool match_subsystem(struct udev_enumerate *udev_enumerate, const char *s
+ {
+         struct udev_list_entry *list_entry;
+ 
++        subsystem = subsystem ? : "";
++
+         udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->subsystem_nomatch_list)) {
+                 if (fnmatch(udev_list_entry_get_name(list_entry), subsystem, 0) == 0)
+                         return false;
diff --git a/0046-libudev-enumerate-do-not-try-to-match-against-an-emp.patch b/0046-libudev-enumerate-do-not-try-to-match-against-an-emp.patch
new file mode 100644
index 0000000..fa630ff
--- /dev/null
+++ b/0046-libudev-enumerate-do-not-try-to-match-against-an-emp.patch
@@ -0,0 +1,38 @@
+From 138ef72fbc2264a341873c1cf8c771c1c143922a Mon Sep 17 00:00:00 2001
+From: Kay Sievers <kay at vrfy.org>
+Date: Wed, 4 Sep 2013 17:59:14 +0200
+Subject: [PATCH] libudev: enumerate - do not try to match against an empty
+ subsystem
+
+---
+ src/libudev/libudev-enumerate.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c
+index 385829d..bc1e37d 100644
+--- a/src/libudev/libudev-enumerate.c
++++ b/src/libudev/libudev-enumerate.c
+@@ -721,12 +721,14 @@ static bool match_subsystem(struct udev_enumerate *udev_enumerate, const char *s
+ {
+         struct udev_list_entry *list_entry;
+ 
+-        subsystem = subsystem ? : "";
++        if (!subsystem)
++                return false;
+ 
+         udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->subsystem_nomatch_list)) {
+                 if (fnmatch(udev_list_entry_get_name(list_entry), subsystem, 0) == 0)
+                         return false;
+         }
++
+         if (udev_list_get_entry(&udev_enumerate->subsystem_match_list) != NULL) {
+                 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->subsystem_match_list)) {
+                         if (fnmatch(udev_list_entry_get_name(list_entry), subsystem, 0) == 0)
+@@ -734,6 +736,7 @@ static bool match_subsystem(struct udev_enumerate *udev_enumerate, const char *s
+                 }
+                 return false;
+         }
++
+         return true;
+ }
+ 
diff --git a/0047-journald-fix-vacuuming-of-archived-journals.patch b/0047-journald-fix-vacuuming-of-archived-journals.patch
new file mode 100644
index 0000000..8dc2355
--- /dev/null
+++ b/0047-journald-fix-vacuuming-of-archived-journals.patch
@@ -0,0 +1,42 @@
+From 2c284b172a7474731df01a7c3280e30de844ba75 Mon Sep 17 00:00:00 2001
+From: George McCollister <george.mccollister at gmail.com>
+Date: Wed, 4 Sep 2013 07:12:43 -0500
+Subject: [PATCH] journald: fix vacuuming of archived journals
+
+d_name is modified on line 227 so if the entire journal name is needed
+again p must be used. Before this change when journal_file_empty was called
+on archived journals it would always return with -2.
+
+Signed-off-by: George McCollister <george.mccollister at gmail.com>
+---
+ src/journal/journal-vacuum.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/journal/journal-vacuum.c b/src/journal/journal-vacuum.c
+index 79572f1..ace7722 100644
+--- a/src/journal/journal-vacuum.c
++++ b/src/journal/journal-vacuum.c
+@@ -265,18 +265,18 @@ int journal_directory_vacuum(
+                         /* We do not vacuum active files or unknown files! */
+                         continue;
+ 
+-                if (journal_file_empty(dirfd(d), de->d_name)) {
++                if (journal_file_empty(dirfd(d), p)) {
+ 
+                         /* Always vacuum empty non-online files. */
+ 
+-                        if (unlinkat(dirfd(d), de->d_name, 0) >= 0)
+-                                log_debug("Deleted empty journal %s/%s.", directory, de->d_name);
++                        if (unlinkat(dirfd(d), p, 0) >= 0)
++                                log_debug("Deleted empty journal %s/%s.", directory, p);
+                         else if (errno != ENOENT)
+-                                log_warning("Failed to delete %s/%s: %m", directory, de->d_name);
++                                log_warning("Failed to delete %s/%s: %m", directory, p);
+                         continue;
+                 }
+ 
+-                patch_realtime(directory, de->d_name, &st, &realtime);
++                patch_realtime(directory, p, &st, &realtime);
+ 
+                 GREEDY_REALLOC(list, n_allocated, n_list + 1);
+ 
diff --git a/0048-journald-fix-fd-leak-in-journal_file_empty.patch b/0048-journald-fix-fd-leak-in-journal_file_empty.patch
new file mode 100644
index 0000000..0f9cd82
--- /dev/null
+++ b/0048-journald-fix-fd-leak-in-journal_file_empty.patch
@@ -0,0 +1,32 @@
+From f29938b8d28e574ae614f6db4e70478d8ccac4d0 Mon Sep 17 00:00:00 2001
+From: George McCollister <george.mccollister at gmail.com>
+Date: Wed, 4 Sep 2013 07:12:44 -0500
+Subject: [PATCH] journald: fix fd leak in journal_file_empty
+
+Before my previous patch, journal_file_empty wasn't be called with the
+correct filename. Now that it's being called with the correct filename
+it leaks file descriptors. This patch closes the file descriptors before
+returning.
+
+Signed-off-by: George McCollister <george.mccollister at gmail.com>
+
+[Edit harald at redhat.com: make use of _cleanup_close_ instead]
+---
+ src/journal/journal-vacuum.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/journal/journal-vacuum.c b/src/journal/journal-vacuum.c
+index ace7722..178c803 100644
+--- a/src/journal/journal-vacuum.c
++++ b/src/journal/journal-vacuum.c
+@@ -129,8 +129,9 @@ static void patch_realtime(
+ }
+ 
+ static int journal_file_empty(int dir_fd, const char *name) {
+-        int fd, r;
++        int r;
+         le64_t n_entries;
++        _cleanup_close_ int fd;
+ 
+         fd = openat(dir_fd, name, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
+         if (fd < 0)
diff --git a/systemd.spec b/systemd.spec
index 31a3e56..bb9d98c 100644
--- a/systemd.spec
+++ b/systemd.spec
@@ -16,7 +16,7 @@
 Name:           systemd
 Url:            http://www.freedesktop.org/wiki/Software/systemd
 Version:        206
-Release:        10%{?gitcommit:.git%{gitcommit}}%{?dist}
+Release:        11%{?gitcommit:.git%{gitcommit}}%{?dist}
 # For a breakdown of the licensing, see README
 License:        LGPLv2+ and MIT and GPLv2+
 Summary:        A System and Service Manager
@@ -75,7 +75,13 @@ Patch0038: 0038-journal-fix-parsing-of-facility-in-syslog-messages.patch
 Patch0039: 0039-cgroup.c-check-return-value-of-unit_realize_cgroup_n.patch
 Patch0040: 0040-Revert-cgroup.c-check-return-value-of-unit_realize_c.patch
 Patch0041: 0041-Do-not-realloc-strings-which-are-already-in-the-hash.patch
-
+Patch0042: 0042-log-to-kmsg-when-debug-is-used-on-the-kernel-command.patch
+Patch0043: 0043-libudev-fix-memleak-when-enumerating-childs.patch
+Patch0044: 0044-cgtop-fixup-the-online-help.patch
+Patch0045: 0045-libudev-enumerate-fix-NULL-deref-for-subsystem-match.patch
+Patch0046: 0046-libudev-enumerate-do-not-try-to-match-against-an-emp.patch
+Patch0047: 0047-journald-fix-vacuuming-of-archived-journals.patch
+Patch0048: 0048-journald-fix-fd-leak-in-journal_file_empty.patch
 
 # kernel-install patch for grubby, drop if grubby is obsolete
 Patch1000:      kernel-install-grubby.patch
@@ -697,6 +703,14 @@ getent passwd systemd-journal-gateway >/dev/null 2>&1 || useradd -r -l -u 191 -g
 %{_datadir}/systemd/gatewayd
 
 %changelog
+* Fri Sep 06 2013 Harald Hoyer <harald at redhat.com> 206-11
+- support "debug" kernel command line parameter
+- journald: fix fd leak in journal_file_empty
+- journald: fix vacuuming of archived journals
+- libudev: enumerate - do not try to match against an empty subsystem
+- cgtop: fixup the online help
+- libudev: fix memleak when enumerating childs
+
 * Wed Sep 04 2013 Harald Hoyer <harald at redhat.com> 206-10
 - Do not require grubby, lorax now takes care of grubby
 - cherry-picked a lot of patches from upstream


More information about the scm-commits mailing list