From 3b74b4958b4f62db8ab9b3ca3568eb080339da16 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 19 Sep 2023 16:09:26 +0200 Subject: [PATCH] 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. --- src/basic/pidref.h | 12 ++++++++++++ src/core/service.c | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) 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); } -- 2.47.3