[systemd-commits] src/service.c

Michal Schmidt michich at kemper.freedesktop.org
Thu Jan 19 16:08:26 PST 2012


 src/service.c |   23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

New commits:
commit 3e52541ef51b1004357fbcd4bf863fb955ab83e9
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Thu Jan 19 23:58:07 2012 +0100

    service: add missing pid file unwatch in the destructor
    
    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

diff --git a/src/service.c b/src/service.c
index 0a5c35e..4dcd306 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", UNIT(s)->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(u, s->bus_name);
@@ -1389,17 +1401,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", UNIT(s)->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);



More information about the systemd-commits mailing list