From: Lennart Poettering Date: Tue, 19 Sep 2023 14:09:26 +0000 (+0200) Subject: pidref: add pidref_equal() helper X-Git-Tag: v255-rc1~487 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3b74b4958b4f62db8ab9b3ca3568eb080339da16;p=thirdparty%2Fsystemd.git pidref: add pidref_equal() helper This compares two PidRef structures via the pid_t field. Ideally we'd do a stricter comparison here, that is safe towards PID reuse, but so far the pidfd API lacks suitable mechanisms for that, hence do the best we can do. --- diff --git a/src/basic/pidref.h b/src/basic/pidref.h index 65c77199380..84f3dee1298 100644 --- a/src/basic/pidref.h +++ b/src/basic/pidref.h @@ -15,6 +15,18 @@ static inline bool pidref_is_set(const PidRef *pidref) { return pidref && pidref->pid > 0; } +static inline bool pidref_equal(const PidRef *a, const PidRef *b) { + + if (pidref_is_set(a)) { + if (!pidref_is_set(b)) + return false; + + return a->pid == b->pid; + } + + return !pidref_is_set(b); +} + int pidref_set_pid(PidRef *pidref, pid_t pid); int pidref_set_pidstr(PidRef *pidref, const char *pid); int pidref_set_pidfd(PidRef *pidref, int fd); diff --git a/src/core/service.c b/src/core/service.c index 05a2bb6ddf1..65278dae4ae 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -193,12 +193,12 @@ static int service_set_main_pidref(Service *s, PidRef *pidref) { if (pidref->pid == getpid_cached()) return -EINVAL; - if (s->main_pid.pid == pidref->pid && s->main_pid_known) { + if (pidref_equal(&s->main_pid, pidref) && s->main_pid_known) { pidref_done(pidref); return 0; } - if (s->main_pid.pid != pidref->pid) { + if (!pidref_equal(&s->main_pid, pidref)) { service_unwatch_main_pid(s); exec_status_start(&s->main_exec_status, pidref->pid); }