From 83ed7924676cfdb289cce4c5fbba0e62e7a17e3c Mon Sep 17 00:00:00 2001 From: Michal Schmidt Date: Jan 20 2012 00:56:20 +0000 Subject: Fix a crash related to pid file watch and daemon-reload (#783118) --- diff --git a/0132-service-add-missing-pid-file-unwatch-in-the-destruct.patch b/0132-service-add-missing-pid-file-unwatch-in-the-destruct.patch new file mode 100644 index 0000000..0024ad1 --- /dev/null +++ b/0132-service-add-missing-pid-file-unwatch-in-the-destruct.patch @@ -0,0 +1,81 @@ +From b56feb27b829f7babd41dfa610d191ddf1c9aa03 Mon Sep 17 00:00:00 2001 +From: Michal Schmidt +Date: Thu, 19 Jan 2012 23:58:07 +0100 +Subject: [PATCH] service: add missing pid file unwatch in the destructor +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The pid file watch could outlive the service unit if a daemon-reload +request came at the right time. The inotify event would then be +delivered to who knows where. + +Fix it by unwatching in the service destructor. + +Further changes will be needed to preserve the state of the pid file +watch across daemon-reload. For now let's just fix the crash observed +by Jóhann Guðmundsson: +Assertion 's->state == SERVICE_START || s->state == SERVICE_START_POST' +failed at src/service.c:2609, function service_fd_event(). Aborting + +Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=783118 +(cherry picked from commit 3e52541ef51b1004357fbcd4bf863fb955ab83e9) + +Conflicts: + + src/service.c +--- + src/service.c | 23 ++++++++++++----------- + 1 files changed, 12 insertions(+), 11 deletions(-) + +diff --git a/src/service.c b/src/service.c +index 81a2954..f99ee60 100644 +--- a/src/service.c ++++ b/src/service.c +@@ -147,6 +147,17 @@ static void service_unwatch_main_pid(Service *s) { + s->main_pid = 0; + } + ++static void service_unwatch_pid_file(Service *s) { ++ if (!s->pid_file_pathspec) ++ return; ++ ++ log_debug("Stopping watch for %s's PID file %s", s->meta.id, s->pid_file_pathspec->path); ++ path_spec_unwatch(s->pid_file_pathspec, UNIT(s)); ++ path_spec_done(s->pid_file_pathspec); ++ free(s->pid_file_pathspec); ++ s->pid_file_pathspec = NULL; ++} ++ + static int service_set_main_pid(Service *s, pid_t pid) { + pid_t ppid; + +@@ -222,6 +233,7 @@ static void service_done(Unit *u) { + * our resources */ + service_unwatch_main_pid(s); + service_unwatch_control_pid(s); ++ service_unwatch_pid_file(s); + + if (s->bus_name) { + unit_unwatch_bus_name(UNIT(u), s->bus_name); +@@ -1381,17 +1393,6 @@ static void service_notify_sockets_dead(Service *s) { + return; + } + +-static void service_unwatch_pid_file(Service *s) { +- if (!s->pid_file_pathspec) +- return; +- +- log_debug("Stopping watch for %s's PID file %s", s->meta.id, s->pid_file_pathspec->path); +- path_spec_unwatch(s->pid_file_pathspec, UNIT(s)); +- path_spec_done(s->pid_file_pathspec); +- free(s->pid_file_pathspec); +- s->pid_file_pathspec = NULL; +-} +- + static void service_set_state(Service *s, ServiceState state) { + ServiceState old_state; + assert(s); +-- +1.7.7.5 + diff --git a/systemd.spec b/systemd.spec index f6538ae..eb4ed6c 100644 --- a/systemd.spec +++ b/systemd.spec @@ -2,7 +2,7 @@ Name: systemd Url: http://www.freedesktop.org/wiki/Software/systemd BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Version: 37 -Release: 8%{?dist} +Release: 9%{?dist} License: GPLv2+ Group: System Environment/Base Summary: A System and Service Manager @@ -179,6 +179,7 @@ Patch0128: 0128-pam-work-correctly-if-a-seat-is-specified-but-not-vt.patch Patch0129: 0129-pam-fix-build.patch Patch0130: 0130-mount-fix-quota.patch Patch0131: 0131-logind-downgrade-login-message-to-debug.patch +Patch0132: 0132-service-add-missing-pid-file-unwatch-in-the-destruct.patch # For sysvinit tools Obsoletes: SysVinit < 2.86-24, sysvinit < 2.86-24 @@ -497,6 +498,9 @@ fi %{_bindir}/systemd-sysv-convert %changelog +* Fri Jan 20 2012 Michal Schmidt - 37-9 +- Fix a crash related to pid file watch and daemon-reload (#783118). + * Tue Jan 17 2012 Michal Schmidt - 37-8 - Shut up another logind message (#727315).