1
0
mirror of https://github.com/systemd/systemd synced 2026-03-19 03:24:45 +01:00

Compare commits

..

3 Commits

Author SHA1 Message Date
Yu Watanabe
e67ad3e586
core/dynamic-user: two trivial modernizations (#40264) 2026-01-04 07:26:19 +09:00
Mike Yuan
252b40c449
core/dynamic-user: use fd_verify_linked() 2026-01-03 21:25:02 +01:00
Mike Yuan
776dc1b9d5
core/dynamic-user: flock() does not return EBUSY 2026-01-03 21:14:32 +01:00

View File

@ -21,6 +21,7 @@
#include "serialize.h" #include "serialize.h"
#include "siphash24.h" #include "siphash24.h"
#include "socket-util.h" #include "socket-util.h"
#include "stat-util.h"
#include "stdio-util.h" #include "stdio-util.h"
#include "string-util.h" #include "string-util.h"
#include "uid-classification.h" #include "uid-classification.h"
@ -232,24 +233,23 @@ static int pick_uid(char **suggested_paths, const char *name, uid_t *ret_uid) {
xsprintf(lock_path, "/run/systemd/dynamic-uid/" UID_FMT, candidate); xsprintf(lock_path, "/run/systemd/dynamic-uid/" UID_FMT, candidate);
for (;;) { for (;;) {
struct stat st;
lock_fd = open(lock_path, O_CREAT|O_RDWR|O_NOFOLLOW|O_CLOEXEC|O_NOCTTY, 0600); lock_fd = open(lock_path, O_CREAT|O_RDWR|O_NOFOLLOW|O_CLOEXEC|O_NOCTTY, 0600);
if (lock_fd < 0) if (lock_fd < 0)
return -errno; return -errno;
r = flock(lock_fd, LOCK_EX|LOCK_NB); /* Try to get a BSD file lock on the UID lock file */ r = flock(lock_fd, LOCK_EX|LOCK_NB); /* Try to get a BSD file lock on the UID lock file */
if (r < 0) { if (r < 0) {
if (IN_SET(errno, EBUSY, EAGAIN)) if (errno == EAGAIN)
goto next; /* already in use */ goto next; /* already in use */
return -errno; return -errno;
} }
if (fstat(lock_fd, &st) < 0) r = fd_verify_linked(lock_fd);
return -errno; if (r >= 0)
if (st.st_nlink > 0)
break; break;
if (r != -EIDRM)
return r;
/* Oh, bummer, we got the lock, but the file was unlinked between the time we opened it and /* Oh, bummer, we got the lock, but the file was unlinked between the time we opened it and
* got the lock. Close it, and try again. */ * got the lock. Close it, and try again. */