Sorry, I sent the wrong patch 2014-2-15 上午2:34于 "Yuxuan Shui" <yshu...@gmail.com>写道:
> Commit 5ba6985b moves the UNIT_VTABLE(u)->sigchld_event before systemd > actually reap the zombie. Which leads to service_load_pid_file accept > zombie as a valid pid. > --- > src/core/service.c | 3 +++ > src/shared/util.c | 24 ++++++++++++++++++++++++ > src/shared/util.h | 1 + > 3 files changed, 28 insertions(+) > > diff --git a/src/core/service.c b/src/core/service.c > index 5129784..64a0670 100644 > --- a/src/core/service.c > +++ b/src/core/service.c > @@ -1376,6 +1376,9 @@ static int service_load_pid_file(Service *s, bool > may_warn) { > return -ESRCH; > } > > + if ('Z' == get_process_state(pid)) > + return -ESRCH; > + > if (s->main_pid_known) { > if (pid == s->main_pid) > return 0; > diff --git a/src/shared/util.c b/src/shared/util.c > index 3482b9b..6c3cf6c 100644 > --- a/src/shared/util.c > +++ b/src/shared/util.c > @@ -513,6 +513,30 @@ char *truncate_nl(char *s) { > return s; > } > > +char get_process_state(pid_t pid) { > + const char *p; > + int r; > + > + assert(name); > + assert(pid >= 0); > + > + p = procfs_file_alloca(pid, "stat"); > + r = read_one_line_file(p, &line); > + if (r < 0) > + return r; > + > + p = strrchr(line, ')'); > + if (!p) > + return -EIO; > + > + p++; > + > + if (sscanf(p, " %c", &state) != 1) > + return -EIO; > + > + return state; > +} > + > int get_process_comm(pid_t pid, char **name) { > const char *p; > int r; > diff --git a/src/shared/util.h b/src/shared/util.h > index 9aea3a4..8dede1f 100644 > --- a/src/shared/util.h > +++ b/src/shared/util.h > @@ -238,6 +238,7 @@ char *file_in_same_dir(const char *path, const char > *filename); > > int rmdir_parents(const char *path, const char *stop); > > +char get_process_state(pid_t pid); > int get_process_comm(pid_t pid, char **name); > int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, > char **line); > int get_process_exe(pid_t pid, char **name); > -- > 1.8.5.4 > >
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel