core: Refuse mount on symlink
This commit is contained in:
parent
1bd27a45d0
commit
5261ba9018
|
@ -827,6 +827,23 @@ void warn_if_dir_nonempty(const char *unit, const char* where) {
|
|||
NULL);
|
||||
}
|
||||
|
||||
static int fail_if_symlink(const char *unit, const char* where) {
|
||||
assert(where);
|
||||
|
||||
if (is_symlink(where) > 0) {
|
||||
log_struct_unit(LOG_WARNING,
|
||||
unit,
|
||||
"MESSAGE=%s: Mount on symlink %s not allowed.",
|
||||
unit, where,
|
||||
"WHERE=%s", where,
|
||||
MESSAGE_ID(SD_MESSAGE_OVERMOUNTING),
|
||||
NULL);
|
||||
|
||||
return -ELOOP;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mount_enter_unmounting(Mount *m) {
|
||||
int r;
|
||||
|
||||
|
@ -877,6 +894,10 @@ static void mount_enter_mounting(Mount *m) {
|
|||
if (p && mount_is_bind(p))
|
||||
mkdir_p_label(p->what, m->directory_mode);
|
||||
|
||||
r = fail_if_symlink(m->meta.id, m->where);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
if (m->from_fragment)
|
||||
r = exec_command_set(
|
||||
m->control_command,
|
||||
|
|
|
@ -6918,3 +6918,15 @@ int take_password_lock(const char *root) {
|
|||
|
||||
return fd;
|
||||
}
|
||||
|
||||
int is_symlink(const char *path) {
|
||||
struct stat info;
|
||||
|
||||
if (lstat(path, &info) < 0)
|
||||
return -errno;
|
||||
|
||||
if (S_ISLNK(info.st_mode))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -966,3 +966,5 @@ char *tempfn_random(const char *p);
|
|||
bool is_localhost(const char *hostname);
|
||||
|
||||
int take_password_lock(const char *root);
|
||||
|
||||
int is_symlink(const char *path);
|
Loading…
Reference in New Issue