diff options
Diffstat (limited to 'src/firstboot')
-rw-r--r-- | src/firstboot/firstboot.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index 807a4f5729..a86a7a8672 100644 --- a/src/firstboot/firstboot.c +++ b/src/firstboot/firstboot.c @@ -604,6 +604,24 @@ static int prompt_root_password(void) { return 0; } +static int find_shell(const char *path, const char *root) { + int r; + + assert(path); + + if (!valid_shell(path)) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "%s is not a valid shell", path); + + r = chase_symlinks(path, root, CHASE_PREFIX_ROOT, NULL, NULL); + if (r < 0) { + const char *p; + p = prefix_roota(root, path); + return log_error_errno(r, "Failed to resolve shell %s: %m", p); + } + + return 0; +} + static int prompt_root_shell(void) { int r; @@ -625,10 +643,9 @@ static int prompt_root_shell(void) { break; } - if (!valid_shell(s)) { - log_error("Specified shell invalid."); + r = find_shell(s, arg_root); + if (r < 0) continue; - } arg_root_shell = TAKE_PTR(s); break; @@ -1167,9 +1184,9 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_ROOT_SHELL: - if (!valid_shell(optarg)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "%s is not a valid shell path", optarg); + r = find_shell(optarg, arg_root); + if (r < 0) + return r; r = free_and_strdup(&arg_root_shell, optarg); if (r < 0) |