X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fsystemd.git;a=blobdiff_plain;f=src%2Ffirstboot%2Ffirstboot.c;h=a86a7a8672a232790dac2a4d7aa978495fd5eef5;hp=82cd4040f9cfd1935e382eec8738f723128335ef;hb=31363bd564021e52a192d062f18459205cbf7685;hpb=01b92946c5bc4be0ca1e2f6c2519f7162c25bb80 diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index 82cd4040f9c..a86a7a8672a 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; @@ -685,7 +702,7 @@ static int write_root_passwd(const char *passwd_path, const char *password, cons if (errno != ENOENT) return -errno; - r = fchmod(fileno(passwd), 0000); + r = fchmod(fileno(passwd), 0644); if (r < 0) return -errno; @@ -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)