pidref: use fd_inode_same to compare pidfds

This commit is contained in:
Mike Yuan
2024-03-11 22:57:50 +08:00
parent 945a8210c7
commit 2f41f10bcd
2 changed files with 28 additions and 11 deletions
+27
View File
@@ -8,6 +8,33 @@
#include "pidref.h"
#include "process-util.h"
#include "signal-util.h"
#include "stat-util.h"
bool pidref_equal(const PidRef *a, const PidRef *b) {
int r;
if (pidref_is_set(a)) {
if (!pidref_is_set(b))
return false;
if (a->pid != b->pid)
return false;
if (a->fd < 0 || b->fd < 0)
return true;
/* pidfds live in their own pidfs and each process comes with a unique inode number since
* kernel 6.8. We can safely do this on older kernels too though, as previously anonymous
* inode was used and inode number was the same for all pidfds. */
r = fd_inode_same(a->fd, b->fd);
if (r < 0)
log_debug_errno(r, "Failed to check whether pidfds for pid " PID_FMT " are equal, assuming yes: %m",
a->pid);
return r != 0;
}
return !pidref_is_set(b);
}
int pidref_set_pid(PidRef *pidref, pid_t pid) {
int fd;