core: improve error message when setting up service mounts

Right now we include the private working directory when we say some files
where not found, which is confusing. Strip it from the error string.

For example, with a BindPaths=/var/bar that does not exist on the host:

Before:

  foo.service: Failed to set up mount namespacing: /run/systemd/unit-root/var/bar: No such file or directory

After:

  foo.service: Failed to set up mount namespacing: /var/bar: No such file or directory
This commit is contained in:
Luca Boccassi
2023-09-28 15:19:03 +01:00
committed by Luca Boccassi
parent 3cb5d34ce0
commit 13b3af4aa2
+38 -10
View File
@@ -1812,6 +1812,39 @@ static int create_symlinks_from_tuples(const char *root, char **strv_symlinks) {
return 0;
}
static void mount_entry_path_debug_string(const char *root, MountEntry *m, char **error_path) {
assert(m);
/* Create a string suitable for debugging logs, stripping for example the local working directory.
* For example, with a BindPaths=/var/bar that does not exist on the host:
*
* Before:
* foo.service: Failed to set up mount namespacing: /run/systemd/unit-root/var/bar: No such file or directory
* After:
* foo.service: Failed to set up mount namespacing: /var/bar: No such file or directory
*
* Note that this is an error path, so no OOM check is done on purpose. */
if (!error_path)
return;
if (!mount_entry_path(m)) {
*error_path = NULL;
return;
}
if (root) {
const char *e = startswith(mount_entry_path(m), root);
if (e) {
*error_path = strdup(e);
return;
}
}
*error_path = strdup(mount_entry_path(m));
return;
}
static int apply_mounts(
const char *root,
const ImagePolicy *mount_image_policy,
@@ -1857,8 +1890,7 @@ static int apply_mounts(
/* ExtensionImages/Directories are first opened in the propagate directory, not in the root_directory */
r = follow_symlink(!IN_SET(m->mode, EXTENSION_IMAGES, EXTENSION_DIRECTORIES) ? root : NULL, m);
if (r < 0) {
if (error_path && mount_entry_path(m))
*error_path = strdup(mount_entry_path(m));
mount_entry_path_debug_string(root, m, error_path);
return r;
}
if (r == 0) {
@@ -1872,8 +1904,7 @@ static int apply_mounts(
r = apply_one_mount(root, m, mount_image_policy, extension_image_policy, ns_info);
if (r < 0) {
if (error_path && mount_entry_path(m))
*error_path = strdup(mount_entry_path(m));
mount_entry_path_debug_string(root, m, error_path);
return r;
}
@@ -1906,8 +1937,7 @@ static int apply_mounts(
for (MountEntry *m = mounts; m < mounts + *n_mounts; ++m) {
r = make_read_only(m, deny_list, proc_self_mountinfo);
if (r < 0) {
if (error_path && mount_entry_path(m))
*error_path = strdup(mount_entry_path(m));
mount_entry_path_debug_string(root, m, error_path);
return r;
}
}
@@ -1921,8 +1951,7 @@ static int apply_mounts(
for (MountEntry *m = mounts; m < mounts + *n_mounts; ++m) {
r = make_noexec(m, deny_list, proc_self_mountinfo);
if (r < 0) {
if (error_path && mount_entry_path(m))
*error_path = strdup(mount_entry_path(m));
mount_entry_path_debug_string(root, m, error_path);
return r;
}
}
@@ -1932,8 +1961,7 @@ static int apply_mounts(
for (MountEntry *m = mounts; m < mounts + *n_mounts; ++m) {
r = make_nosuid(m, proc_self_mountinfo);
if (r < 0) {
if (error_path && mount_entry_path(m))
*error_path = strdup(mount_entry_path(m));
mount_entry_path_debug_string(root, m, error_path);
return r;
}
}