mirror of
https://github.com/systemd/systemd.git
synced 2024-11-08 11:27:32 +03:00
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
This commit is contained in:
parent
a3f914b2a2
commit
3e52541ef5
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user