sysext: Check for /etc/initrd-release in given --root= tree
Both sysext and confext used the host's /etc/initrd-release file even when --root=/somewhere was specified. A workaround was the SYSTEMD_IN_INITRD= env var but without knowing this it was quite confusing. Aside from users validating their extensions, the primary use case for this to matter is when the extensions are set up from the initrd where the initrd-release file is present when running but we want to prepare the extensions for the final system and thus should match for the right scope. Make systemd-sysext check for /etc/initrd-release inside the given --root= tree. An alternative would be to always ignore the initrd-release check when --root= is passed but this way it is more consistent. The image policy logic for EFI-loader-passed extensions won't take effect when --root= is used, though.
This commit is contained in:
@@ -619,6 +619,7 @@ static int image_make(
|
||||
static int pick_image_search_path(
|
||||
RuntimeScope scope,
|
||||
ImageClass class,
|
||||
const char *root,
|
||||
char ***ret) {
|
||||
|
||||
int r;
|
||||
@@ -635,11 +636,11 @@ static int pick_image_search_path(
|
||||
if (scope < 0) {
|
||||
_cleanup_strv_free_ char **a = NULL, **b = NULL;
|
||||
|
||||
r = pick_image_search_path(RUNTIME_SCOPE_USER, class, &a);
|
||||
r = pick_image_search_path(RUNTIME_SCOPE_USER, class, root, &a);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = pick_image_search_path(RUNTIME_SCOPE_SYSTEM, class, &b);
|
||||
r = pick_image_search_path(RUNTIME_SCOPE_SYSTEM, class, root, &b);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -655,8 +656,15 @@ static int pick_image_search_path(
|
||||
|
||||
case RUNTIME_SCOPE_SYSTEM: {
|
||||
const char *ns;
|
||||
bool is_initrd;
|
||||
|
||||
r = chase_and_access("/etc/initrd-release", root, CHASE_PREFIX_ROOT, F_OK, /* ret_path= */ NULL);
|
||||
if (r < 0 && r != -ENOENT)
|
||||
return r;
|
||||
is_initrd = r >= 0;
|
||||
|
||||
/* Use the initrd search path if there is one, otherwise use the common one */
|
||||
ns = in_initrd() && image_search_path_initrd[class] ?
|
||||
ns = is_initrd && image_search_path_initrd[class] ?
|
||||
image_search_path_initrd[class] :
|
||||
image_search_path[class];
|
||||
if (!ns)
|
||||
@@ -763,7 +771,7 @@ int image_find(RuntimeScope scope,
|
||||
return -ENOMEM;
|
||||
|
||||
_cleanup_strv_free_ char **search = NULL;
|
||||
r = pick_image_search_path(scope, class, &search);
|
||||
r = pick_image_search_path(scope, class, root, &search);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -954,7 +962,7 @@ int image_discover(
|
||||
assert(images);
|
||||
|
||||
_cleanup_strv_free_ char **search = NULL;
|
||||
r = pick_image_search_path(scope, class, &search);
|
||||
r = pick_image_search_path(scope, class, root, &search);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -2101,7 +2109,7 @@ bool image_in_search_path(
|
||||
assert(image);
|
||||
|
||||
_cleanup_strv_free_ char **search = NULL;
|
||||
r = pick_image_search_path(scope, class, &search);
|
||||
r = pick_image_search_path(scope, class, root, &search);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user