You can find few patches for various bugs in attachement. -- Regards
Václav Pavlín and Lukáš Nykrýn
>From 55fa1c1b09933e55ce105279f2591674381c5345 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 12:04:02 +0200 Subject: [PATCH 01/18] cgtop: missing '-' Return codes in systemd are negated and if (r < 0) if (r == ENOENT) was never true. --- src/cgtop/cgtop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c index 3756328..9eb2d2f 100644 --- a/src/cgtop/cgtop.c +++ b/src/cgtop/cgtop.c @@ -300,7 +300,7 @@ static int refresh_one( r = cg_enumerate_subgroups(controller, path, &d); if (r < 0) { - if (r == ENOENT) + if (r == -ENOENT) return 0; return r; -- 1.7.11.4
>From c8f330a8910d6d04c9c073961d3ab280a17cfd32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 12:17:23 +0200 Subject: [PATCH 02/18] udev: check malloc return in collect/collect.c Returns from no memory checks updated with log_oom call --- src/udev/collect/collect.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/udev/collect/collect.c b/src/udev/collect/collect.c index 4162c43..47c2ddd 100644 --- a/src/udev/collect/collect.c +++ b/src/udev/collect/collect.c @@ -142,7 +142,7 @@ static int checkout(int fd) buf = calloc(1,bufsize + 1); if (!buf) { fprintf(stderr, "Out of memory.\n"); - return -1; + return log_oom(); } memset(buf, ' ', bufsize); ptr = buf + len; @@ -167,7 +167,16 @@ static int checkout(int fd) if (debug) fprintf(stderr, "Found word %s\n", word); him = malloc(sizeof (struct _mate)); + if (!him) { + free(buf); + return log_oom(); + } him->name = strdup(word); + if (!him->name) { + free(buf); + free(him); + return log_oom(); + } him->state = STATE_OLD; udev_list_node_append(&him->node, &bunch); word = NULL; @@ -276,7 +285,7 @@ static int missing(int fd) buf = malloc(bufsize); if (!buf) - return -1; + return log_oom(); udev_list_node_foreach(him_node, &bunch) { struct _mate *him = node_to_mate(him_node); @@ -291,7 +300,7 @@ static int missing(int fd) tmpbuf = realloc(buf, bufsize); if (!tmpbuf) { free(buf); - return -1; + return log_oom(); } buf = tmpbuf; } @@ -431,7 +440,17 @@ int main(int argc, char **argv) if (debug) fprintf(stderr, "ID %s: not in database\n", argv[i]); him = malloc(sizeof (struct _mate)); + if (!him) { + ret = ENOMEM; + goto out; + } + him->name = malloc(strlen(argv[i]) + 1); + if (!him->name) { + ret = ENOMEM; + goto out; + } + strcpy(him->name, argv[i]); him->state = STATE_NONE; udev_list_node_append(&him->node, &bunch); -- 1.7.11.4
>From 6497710f8a333866eb21b96816134409e69b1de4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 12:40:29 +0200 Subject: [PATCH 03/18] libudev: check return value of rename --- src/libudev/libudev-device-private.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libudev/libudev-device-private.c b/src/libudev/libudev-device-private.c index 00fa3b8..489bea8 100644 --- a/src/libudev/libudev-device-private.c +++ b/src/libudev/libudev-device-private.c @@ -101,6 +101,7 @@ int udev_device_update_db(struct udev_device *udev_device) char filename[UTIL_PATH_SIZE]; char filename_tmp[UTIL_PATH_SIZE]; FILE *f; + int r; id = udev_device_get_id_filename(udev_device); if (id == NULL) @@ -161,7 +162,9 @@ int udev_device_update_db(struct udev_device *udev_device) } fclose(f); - rename(filename_tmp, filename); + r = rename(filename_tmp, filename); + if (r < 0) + return -1; udev_dbg(udev, "created %s file '%s' for '%s'\n", has_info ? "db" : "empty", filename, udev_device_get_devpath(udev_device)); return 0; -- 1.7.11.4
>From 440c47ec09f8a37c48b20f9eec4e68e429e60bf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 12:52:08 +0200 Subject: [PATCH 04/18] udev: check return value of symlink --- src/udev/udev-watch.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/udev/udev-watch.c b/src/udev/udev-watch.c index c27a280..eebcee6 100644 --- a/src/udev/udev-watch.c +++ b/src/udev/udev-watch.c @@ -98,6 +98,7 @@ void udev_watch_begin(struct udev *udev, struct udev_device *dev) { char filename[UTIL_PATH_SIZE]; int wd; + int r; if (inotify_fd < 0) return; @@ -113,7 +114,9 @@ void udev_watch_begin(struct udev *udev, struct udev_device *dev) snprintf(filename, sizeof(filename), "/run/udev/watch/%d", wd); mkdir_parents(filename, 0755); unlink(filename); - symlink(udev_device_get_id_filename(dev), filename); + r = symlink(udev_device_get_id_filename(dev), filename); + if (r < 0) + log_error("Failed to create symlink: %m"); udev_device_set_watch_handle(dev, wd); } -- 1.7.11.4
>From 007090da825584e7bc4a797bb4e39069cd551661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 13:01:39 +0200 Subject: [PATCH 05/18] logind: check return value, log warning on error --- src/login/logind-session.c | 4 +++- src/login/logind-user.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/login/logind-session.c b/src/login/logind-session.c index f670db8..958b516 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -526,7 +526,9 @@ static int session_create_cgroup(Session *s) { } } - hashmap_put(s->manager->session_cgroups, s->cgroup_path, s); + r = hashmap_put(s->manager->session_cgroups, s->cgroup_path, s); + if (r < 0) + log_warning("Failed to create mapping between cgroup and session"); return 0; } diff --git a/src/login/logind-user.c b/src/login/logind-user.c index 9dfead9..b692b53 100644 --- a/src/login/logind-user.c +++ b/src/login/logind-user.c @@ -339,7 +339,9 @@ static int user_create_cgroup(User *u) { log_warning("Failed to create cgroup %s:%s: %s", *k, p, strerror(-r)); } - hashmap_put(u->manager->user_cgroups, u->cgroup_path, u); + r = hashmap_put(u->manager->user_cgroups, u->cgroup_path, u); + if (r < 0) + log_warning("Failed to create mapping between cgroup and user"); return 0; } -- 1.7.11.4
>From 91500e3372a4ff2feed4a440f923a1cdedb73671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 13:19:46 +0200 Subject: [PATCH 06/18] login: check return value of safe_atou32 --- src/login/pam-module.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/login/pam-module.c b/src/login/pam-module.c index d7f4128..6622103 100644 --- a/src/login/pam-module.c +++ b/src/login/pam-module.c @@ -452,10 +452,11 @@ _public_ PAM_EXTERN int pam_sm_open_session( tty = ""; } + r = 0; if (!isempty(cvtnr)) - safe_atou32(cvtnr, &vtnr); + r = safe_atou32(cvtnr, &vtnr); - if (!isempty(display) && vtnr <= 0) { + if (!isempty(display) && !r && vtnr <= 0) { if (isempty(seat)) get_seat_from_display(display, &seat, &vtnr); else if (streq(seat, "seat0")) -- 1.7.11.4
>From 21354b48e0b2dc5cd650706e44f5ca3e1492f979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 13:38:40 +0200 Subject: [PATCH 07/18] login: check return value of session_get_idle_hint --- src/login/logind-session-dbus.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index 9103781..2e7bfe0 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -183,12 +183,16 @@ static int bus_session_append_idle_hint_since(DBusMessageIter *i, const char *pr Session *s = data; dual_timestamp t; uint64_t u; + int r; assert(i); assert(property); assert(s); - session_get_idle_hint(s, &t); + r = session_get_idle_hint(s, &t); + if (r < 0) + return r; + u = streq(property, "IdleSinceHint") ? t.realtime : t.monotonic; if (!dbus_message_iter_append_basic(i, DBUS_TYPE_UINT64, &u)) -- 1.7.11.4
>From 259e40bc689a701261a8a74f73ddaad6c5437333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 13:51:45 +0200 Subject: [PATCH 08/18] udev: check return value of write --- src/udev/collect/collect.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/udev/collect/collect.c b/src/udev/collect/collect.c index 47c2ddd..feae4bb 100644 --- a/src/udev/collect/collect.c +++ b/src/udev/collect/collect.c @@ -305,7 +305,10 @@ static int missing(int fd) buf = tmpbuf; } snprintf(buf, strlen(him->name)+2, "%s ", him->name); - write(fd, buf, strlen(buf)); + if (write(fd, buf, strlen(buf)) < 0) { + free(buf); + return -1; + } } } -- 1.7.11.4
>From abeffd3d50ac6916c146f95efe218fcdbd8f2d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 14:07:53 +0200 Subject: [PATCH 09/18] nspawn: check return value of mount --- src/nspawn/nspawn.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index ab7a239..c1a5b16 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -341,8 +341,13 @@ static int setup_timezone(const char *dest) { if (!where) return log_oom(); - if (mount("/etc/localtime", where, "bind", MS_BIND, NULL) >= 0) - mount("/etc/localtime", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL); + if (mount("/etc/localtime", where, "bind", MS_BIND, NULL) >= 0) { + if (mount("/etc/localtime", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL) < 0) + log_warning("mount(%s) failed, file will be writable: %m", where); + } else { + log_error("mount(%s) failed: %m", where); + return -errno; + } free(where); @@ -350,8 +355,13 @@ static int setup_timezone(const char *dest) { if (!where) return log_oom(); - if (mount("/etc/timezone", where, "bind", MS_BIND, NULL) >= 0) - mount("/etc/timezone", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL); + if (mount("/etc/timezone", where, "bind", MS_BIND, NULL) >= 0) { + if (mount("/etc/timezone", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL) < 0) + log_warning("mount(%s) failed, file will be writable: %m", where); + } else { + log_error("mount(%s) failed: %m", where); + return -errno; + } free(where); @@ -371,8 +381,13 @@ static int setup_resolv_conf(const char *dest) { if (!where) return log_oom(); - if (mount("/etc/resolv.conf", where, "bind", MS_BIND, NULL) >= 0) - mount("/etc/resolv.conf", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL); + if (mount("/etc/resolv.conf", where, "bind", MS_BIND, NULL) >= 0) { + if (mount("/etc/resolv.conf", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL) < 0) + log_warning("mount(%s) failed, file will be writable: %m", where); + } else { + log_error("mount(%s) failed: %m", where); + return -errno; + } free(where); -- 1.7.11.4
>From 6e9f291b7f798155205fc51052e97475cfe6f71c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 14:54:30 +0200 Subject: [PATCH 10/18] udev: free rule structure on error --- src/udev/udev-rules.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index d86e6bc..234620b 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -1728,30 +1728,24 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names) /* init token array and string buffer */ rules->tokens = malloc(PREALLOC_TOKEN * sizeof(struct token)); - if (rules->tokens == NULL) { - free(rules); - return NULL; - } + if (rules->tokens == NULL) + return udev_rules_unref(rules); + rules->token_max = PREALLOC_TOKEN; rules->buf = malloc(PREALLOC_STRBUF); - if (rules->buf == NULL) { - free(rules->tokens); - free(rules); - return NULL; - } + if (rules->buf == NULL) + return udev_rules_unref(rules); + rules->buf_max = PREALLOC_STRBUF; /* offset 0 is always '\0' */ rules->buf[0] = '\0'; rules->buf_cur = 1; rules->trie_nodes = malloc(PREALLOC_TRIE * sizeof(struct trie_node)); - if (rules->trie_nodes == NULL) { - free(rules->buf); - free(rules->tokens); - free(rules); - return NULL; - } + if (rules->trie_nodes == NULL) + return udev_rules_unref(rules); + rules->trie_nodes_max = PREALLOC_TRIE; /* offset 0 is the trie root, with an empty string */ memset(rules->trie_nodes, 0x00, sizeof(struct trie_node)); @@ -1763,11 +1757,11 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names) NULL); if (!rules->dirs) { log_error("failed to build config directory array"); - return NULL; + return udev_rules_unref(rules); } if (!path_strv_canonicalize(rules->dirs)) { log_error("failed to canonicalize config directories\n"); - return NULL; + return udev_rules_unref(rules); } strv_uniq(rules->dirs); @@ -1777,8 +1771,11 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names) r = conf_files_list_strv(&files, ".rules", (const char **)rules->dirs); if (r < 0) { log_error("failed to enumerate rules files: %s\n", strerror(-r)); - return NULL; + return udev_rules_unref(rules); } + rules->dirs_ts_usec = calloc(strv_length(rules->dirs), sizeof(long long)); + if(!rules->dirs_ts_usec) + return udev_rules_unref(rules); /* * The offset value in the rules strct is limited; add all -- 1.7.11.4
>From 9d8ec3a8ab4689ac4db41c4819e116f562cd2739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 15:00:43 +0200 Subject: [PATCH 11/18] locale: make sure that l is freed --- src/locale/localed.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/locale/localed.c b/src/locale/localed.c index 667c5d1..a2d3814 100644 --- a/src/locale/localed.c +++ b/src/locale/localed.c @@ -1123,7 +1123,9 @@ static DBusHandlerResult locale_message_handler( "Locale\0"); if (!changed) goto oom; - } + } else + strv_free(l); + } else if (dbus_message_is_method_call(message, "org.freedesktop.locale1", "SetVConsoleKeyboard")) { const char *keymap, *keymap_toggle; -- 1.7.11.4
>From 111a65c37996299a2ba5545c185ed211465cd8dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Pavl=C3=ADn?= <vpav...@redhat.com> Date: Fri, 21 Sep 2012 15:03:28 +0200 Subject: [PATCH 12/18] modules-load: initalize files to null --- src/modules-load/modules-load.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules-load/modules-load.c b/src/modules-load/modules-load.c index 6aeaf45..e72e382 100644 --- a/src/modules-load/modules-load.c +++ b/src/modules-load/modules-load.c @@ -171,7 +171,7 @@ static int load_module(struct kmod_ctx *ctx, const char *m) { int main(int argc, char *argv[]) { int r = EXIT_FAILURE, k; - char **files, **fn, **i; + char **files = NULL, **fn, **i; struct kmod_ctx *ctx; if (argc > 1) { -- 1.7.11.4
>From f33438f0980f90192e8442090177f5282b16e93a Mon Sep 17 00:00:00 2001 From: Lukas Nykryn <lnyk...@redhat.com> Date: Fri, 21 Sep 2012 12:30:56 +0200 Subject: [PATCH 13/18] sysctl: fix error code handling After if (r <= 0) r can't be 0 so if (k < 0 && r == 0) never happens. --- src/sysctl/sysctl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c index 793796d..62d4c81 100644 --- a/src/sysctl/sysctl.c +++ b/src/sysctl/sysctl.c @@ -260,6 +260,8 @@ int main(int argc, char *argv[]) { if (r <= 0) return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + r = 0; + log_set_target(LOG_TARGET_AUTO); log_parse_environment(); log_open(); -- 1.7.11.4
>From ee8ae476ec42927e57de727dbd94c9e4c59a6632 Mon Sep 17 00:00:00 2001 From: Lukas Nykryn <lnyk...@redhat.com> Date: Fri, 21 Sep 2012 12:33:32 +0200 Subject: [PATCH 14/18] login: missing break for getopt ARG_NO_ASK_PASSWORD in loginctl --- src/login/loginctl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 5ff8ea6..7ef9dde 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -1446,6 +1446,7 @@ static int parse_argv(int argc, char *argv[]) { case ARG_NO_ASK_PASSWORD: arg_ask_password = false; + break; case ARG_KILL_WHO: arg_kill_who = optarg; -- 1.7.11.4
>From f083cca7f926d95149b66e4237ec614d9f42b1dd Mon Sep 17 00:00:00 2001 From: Lukas Nykryn <lnyk...@redhat.com> Date: Fri, 21 Sep 2012 12:45:49 +0200 Subject: [PATCH 15/18] hwclock: check return value of strappend for null --- src/shared/hwclock.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/shared/hwclock.c b/src/shared/hwclock.c index b93855d..7f38e74 100644 --- a/src/shared/hwclock.c +++ b/src/shared/hwclock.c @@ -78,7 +78,7 @@ static int rtc_open(int flags) { p = strjoin("/sys/class/rtc/", de->d_name, "/hctosys", NULL); if (!p) { closedir(d); - return -ENOMEM; + return log_oom(); } r = read_one_line_file(p, &v); @@ -94,6 +94,12 @@ static int rtc_open(int flags) { continue; p = strappend("/dev/", de->d_name); + + if (!p) { + closedir(d); + return log_oom(); + } + fd = open(p, flags); free(p); -- 1.7.11.4
>From 4f9408af71ff55aeac3b51d2fe6208c1cb8e2417 Mon Sep 17 00:00:00 2001 From: Lukas Nykryn <lnyk...@redhat.com> Date: Fri, 21 Sep 2012 12:59:15 +0200 Subject: [PATCH 16/18] journal: free JournalFile when *ret is null --- src/journal/journal-file.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c index e778e1c..dec3bfa 100644 --- a/src/journal/journal-file.c +++ b/src/journal/journal-file.c @@ -2156,9 +2156,10 @@ int journal_file_open( if (r < 0) goto fail; - if (ret) - *ret = f; + if (!ret) + goto fail; + *ret = f; return 0; fail: -- 1.7.11.4
>From 2f17b5ea8ef280aa18692739d7c100413f0ebdde Mon Sep 17 00:00:00 2001 From: Lukas Nykryn <lnyk...@redhat.com> Date: Fri, 21 Sep 2012 13:01:29 +0200 Subject: [PATCH 17/18] udev: free fd before return in scsi_serial.c --- src/udev/scsi_id/scsi_serial.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/udev/scsi_id/scsi_serial.c b/src/udev/scsi_id/scsi_serial.c index 5ad0c31..3c52dee 100644 --- a/src/udev/scsi_id/scsi_serial.c +++ b/src/udev/scsi_id/scsi_serial.c @@ -921,7 +921,8 @@ int scsi_get_serial(struct udev *udev, } } else if (page_code != 0x00) { log_debug("%s: unsupported page code 0x%d\n", dev_scsi->kernel, page_code); - return 1; + retval = 1; + goto completed; } /* -- 1.7.11.4
>From 6dab974e452bc7a73efba316f91c1de1e76b331b Mon Sep 17 00:00:00 2001 From: Lukas Nykryn <lnyk...@redhat.com> Date: Fri, 21 Sep 2012 13:03:00 +0200 Subject: [PATCH 18/18] udev: free fd before return in accelerometer.c --- src/udev/accelerometer/accelerometer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/udev/accelerometer/accelerometer.c b/src/udev/accelerometer/accelerometer.c index b8ed7b8..67fed27 100644 --- a/src/udev/accelerometer/accelerometer.c +++ b/src/udev/accelerometer/accelerometer.c @@ -205,8 +205,10 @@ static void test_orientation(struct udev *udev, r = read(fd, ev, sizeof(struct input_event) * 64); - if (r < (int) sizeof(struct input_event)) + if (r < (int) sizeof(struct input_event)) { + close(fd); return; + } for (i = 0; i < r / (int) sizeof(struct input_event); i++) { if (got_syn == 1) { -- 1.7.11.4
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel