Skip to content

Commit b74023d

Browse files
authored
Merge pull request systemd#7003 from yuwata/enable-dynamic-user
timesyncd, journal-upload: Enable DynamicUser=
2 parents e2c2d70 + 4240cb0 commit b74023d

File tree

19 files changed

+43
-37
lines changed

19 files changed

+43
-37
lines changed

src/basic/mkdir-label.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
#include "label.h"
2626
#include "mkdir.h"
2727

28-
int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid) {
29-
return mkdir_safe_internal(path, mode, uid, gid, mkdir_label);
28+
int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink) {
29+
return mkdir_safe_internal(path, mode, uid, gid, follow_symlink, mkdir_label);
3030
}
3131

3232
int mkdir_parents_label(const char *path, mode_t mode) {

src/basic/mkdir.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@
2222
#include <string.h>
2323
#include <sys/stat.h>
2424

25+
#include "alloc-util.h"
2526
#include "fs-util.h"
2627
#include "macro.h"
2728
#include "mkdir.h"
2829
#include "path-util.h"
2930
#include "stat-util.h"
3031
#include "user-util.h"
3132

32-
int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, mkdir_func_t _mkdir) {
33+
int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink, mkdir_func_t _mkdir) {
3334
struct stat st;
3435
int r;
3536

@@ -42,6 +43,19 @@ int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, mkd
4243
if (lstat(path, &st) < 0)
4344
return -errno;
4445

46+
if (follow_symlink && S_ISLNK(st.st_mode)) {
47+
_cleanup_free_ char *p = NULL;
48+
49+
r = chase_symlinks(path, NULL, CHASE_NONEXISTENT, &p);
50+
if (r < 0)
51+
return r;
52+
if (r == 0)
53+
return mkdir_safe_internal(p, mode, uid, gid, false, _mkdir);
54+
55+
if (lstat(p, &st) < 0)
56+
return -errno;
57+
}
58+
4559
if ((st.st_mode & 0007) > (mode & 0007) ||
4660
(st.st_mode & 0070) > (mode & 0070) ||
4761
(st.st_mode & 0700) > (mode & 0700) ||
@@ -53,8 +67,8 @@ int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, mkd
5367
return 0;
5468
}
5569

56-
int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid) {
57-
return mkdir_safe_internal(path, mode, uid, gid, mkdir);
70+
int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink) {
71+
return mkdir_safe_internal(path, mode, uid, gid, follow_symlink, mkdir);
5872
}
5973

6074
int mkdir_parents_internal(const char *prefix, const char *path, mode_t mode, mkdir_func_t _mkdir) {

src/basic/mkdir.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@
2222

2323
#include <sys/types.h>
2424

25-
int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid);
25+
int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink);
2626
int mkdir_parents(const char *path, mode_t mode);
2727
int mkdir_p(const char *path, mode_t mode);
2828

2929
/* mandatory access control(MAC) versions */
30-
int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid);
30+
int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink);
3131
int mkdir_parents_label(const char *path, mode_t mode);
3232
int mkdir_p_label(const char *path, mode_t mode);
3333

3434
/* internally used */
3535
typedef int (*mkdir_func_t)(const char *pathname, mode_t mode);
36-
int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, mkdir_func_t _mkdir);
36+
int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, bool follow_symlink, mkdir_func_t _mkdir);
3737
int mkdir_parents_internal(const char *prefix, const char *path, mode_t mode, mkdir_func_t _mkdir);
3838
int mkdir_p_internal(const char *prefix, const char *path, mode_t mode, mkdir_func_t _mkdir);

src/core/execute.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1974,7 +1974,7 @@ static int setup_exec_directory(
19741974
}
19751975

19761976
/* First set up private root if it doesn't exist yet, with access mode 0700 and owned by root:root */
1977-
r = mkdir_safe_label(private_root, 0700, 0, 0);
1977+
r = mkdir_safe_label(private_root, 0700, 0, 0, false);
19781978
if (r < 0)
19791979
goto fail;
19801980

src/login/logind-dbus.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,7 +1170,7 @@ static int method_set_user_linger(sd_bus_message *message, void *userdata, sd_bu
11701170

11711171
mkdir_p_label("/var/lib/systemd", 0755);
11721172

1173-
r = mkdir_safe_label("/var/lib/systemd/linger", 0755, 0, 0);
1173+
r = mkdir_safe_label("/var/lib/systemd/linger", 0755, 0, 0, false);
11741174
if (r < 0)
11751175
return r;
11761176

@@ -1904,7 +1904,7 @@ static int update_schedule_file(Manager *m) {
19041904

19051905
assert(m);
19061906

1907-
r = mkdir_safe_label("/run/systemd/shutdown", 0755, 0, 0);
1907+
r = mkdir_safe_label("/run/systemd/shutdown", 0755, 0, 0, false);
19081908
if (r < 0)
19091909
return log_error_errno(r, "Failed to create shutdown subdirectory: %m");
19101910

src/login/logind-inhibit.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ int inhibitor_save(Inhibitor *i) {
8686

8787
assert(i);
8888

89-
r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0);
89+
r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0, false);
9090
if (r < 0)
9191
goto fail;
9292

@@ -290,7 +290,7 @@ int inhibitor_create_fifo(Inhibitor *i) {
290290

291291
/* Create FIFO */
292292
if (!i->fifo_path) {
293-
r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0);
293+
r = mkdir_safe_label("/run/systemd/inhibit", 0755, 0, 0, false);
294294
if (r < 0)
295295
return r;
296296

src/login/logind-seat.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ int seat_save(Seat *s) {
9393
if (!s->started)
9494
return 0;
9595

96-
r = mkdir_safe_label("/run/systemd/seats", 0755, 0, 0);
96+
r = mkdir_safe_label("/run/systemd/seats", 0755, 0, 0, false);
9797
if (r < 0)
9898
goto fail;
9999

src/login/logind-session.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ int session_save(Session *s) {
179179
if (!s->started)
180180
return 0;
181181

182-
r = mkdir_safe_label("/run/systemd/sessions", 0755, 0, 0);
182+
r = mkdir_safe_label("/run/systemd/sessions", 0755, 0, 0, false);
183183
if (r < 0)
184184
goto fail;
185185

@@ -948,7 +948,7 @@ int session_create_fifo(Session *s) {
948948

949949
/* Create FIFO */
950950
if (!s->fifo_path) {
951-
r = mkdir_safe_label("/run/systemd/sessions", 0755, 0, 0);
951+
r = mkdir_safe_label("/run/systemd/sessions", 0755, 0, 0, false);
952952
if (r < 0)
953953
return r;
954954

src/login/logind-user.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ static int user_save_internal(User *u) {
141141
assert(u);
142142
assert(u->state_file);
143143

144-
r = mkdir_safe_label("/run/systemd/users", 0755, 0, 0);
144+
r = mkdir_safe_label("/run/systemd/users", 0755, 0, 0, false);
145145
if (r < 0)
146146
goto fail;
147147

@@ -334,7 +334,7 @@ static int user_mkdir_runtime_path(User *u) {
334334

335335
assert(u);
336336

337-
r = mkdir_safe_label("/run/user", 0755, 0, 0);
337+
r = mkdir_safe_label("/run/user", 0755, 0, 0, false);
338338
if (r < 0)
339339
return log_error_errno(r, "Failed to create /run/user: %m");
340340

src/machine/machine.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ int machine_save(Machine *m) {
128128
if (!m->started)
129129
return 0;
130130

131-
r = mkdir_safe_label("/run/systemd/machines", 0755, 0, 0);
131+
r = mkdir_safe_label("/run/systemd/machines", 0755, 0, 0, false);
132132
if (r < 0)
133133
goto fail;
134134

0 commit comments

Comments
 (0)