From: Lennart Poettering Date: Mon, 13 Jan 2025 10:06:27 +0000 (+0100) Subject: pidref: various shortcuts to pidref_equal() X-Git-Tag: v258-rc1~1580^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8110b34b64bfdda0a82b04544a7be07b7f0a5c7a;p=thirdparty%2Fsystemd.git pidref: various shortcuts to pidref_equal() This adds some shortcuts to pidref_equal(), so that we don't have to query the pidfs id if there's no need. --- diff --git a/src/basic/pidref.c b/src/basic/pidref.c index a275f77b569..ccfa2903b60 100644 --- a/src/basic/pidref.c +++ b/src/basic/pidref.c @@ -40,6 +40,10 @@ int pidref_acquire_pidfd_id(PidRef *pidref) { bool pidref_equal(PidRef *a, PidRef *b) { + /* If this is the very same structure, it definitely refers to the same process */ + if (a == b) + return true; + if (!pidref_is_set(a)) return !pidref_is_set(b); @@ -58,9 +62,15 @@ bool pidref_equal(PidRef *a, PidRef *b) { if (a->fd_id == 0 || b->fd_id == 0) return true; } else { + /* If the other side is remote, then this is not the same */ if (pidref_is_remote(b)) return false; + /* PID1 cannot exit, hence it cannot change pidfs ids, hence no point in comparing them, we + * can shortcut things */ + if (a->pid == 1) + return true; + /* Try to compare pidfds using their inode numbers. This way we can ensure that we * don't spuriously consider two PidRefs equal if the pid has been reused once. Note * that we ignore all errors here, not only EOPNOTSUPP, as fstat() might fail due to