diff options
author | Balint Reczey <balint@balintreczey.hu> | 2021-11-07 15:18:49 +0100 |
---|---|---|
committer | Balint Reczey <balint@balintreczey.hu> | 2021-11-07 15:18:49 +0100 |
commit | 749c1780621163ca5108f164861324bafa9e0ae8 (patch) | |
tree | 51001872624a692018c45bf39276df94b603fb19 /libmisc/root_flag.c | |
parent | d906ecd3b652d95af6ffb974a2f6669501bb9496 (diff) | |
download | shadow-749c1780621163ca5108f164861324bafa9e0ae8.tar.gz |
New upstream version 4.9upstream/4.9
Diffstat (limited to 'libmisc/root_flag.c')
-rw-r--r-- | libmisc/root_flag.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/libmisc/root_flag.c b/libmisc/root_flag.c index 7f5e6110..e9a97d44 100644 --- a/libmisc/root_flag.c +++ b/libmisc/root_flag.c @@ -56,25 +56,31 @@ extern void process_root_flag (const char* short_opt, int argc, char **argv) * Parse the command line options. */ int i; - const char *newroot = NULL; + const char *newroot = NULL, *val; for (i = 0; i < argc; i++) { + val = NULL; if ( (strcmp (argv[i], "--root") == 0) + || ((strncmp (argv[i], "--root=", 7) == 0) + && (val = argv[i] + 7)) || (strcmp (argv[i], short_opt) == 0)) { if (NULL != newroot) { - fprintf (stderr, + fprintf (shadow_logfd, _("%s: multiple --root options\n"), Prog); exit (E_BAD_ARG); } - if (i + 1 == argc) { - fprintf (stderr, + if (val) { + newroot = val; + } else if (i + 1 == argc) { + fprintf (shadow_logfd, _("%s: option '%s' requires an argument\n"), Prog, argv[i]); exit (E_BAD_ARG); + } else { + newroot = argv[++ i]; } - newroot = argv[i + 1]; } } @@ -88,34 +94,34 @@ static void change_root (const char* newroot) /* Drop privileges */ if ( (setregid (getgid (), getgid ()) != 0) || (setreuid (getuid (), getuid ()) != 0)) { - fprintf (stderr, _("%s: failed to drop privileges (%s)\n"), + fprintf (shadow_logfd, _("%s: failed to drop privileges (%s)\n"), Prog, strerror (errno)); exit (EXIT_FAILURE); } if ('/' != newroot[0]) { - fprintf (stderr, + fprintf (shadow_logfd, _("%s: invalid chroot path '%s'\n"), Prog, newroot); exit (E_BAD_ARG); } if (access (newroot, F_OK) != 0) { - fprintf(stderr, + fprintf(shadow_logfd, _("%s: cannot access chroot directory %s: %s\n"), Prog, newroot, strerror (errno)); exit (E_BAD_ARG); } if (chdir (newroot) != 0) { - fprintf(stderr, + fprintf(shadow_logfd, _("%s: cannot chdir to chroot directory %s: %s\n"), Prog, newroot, strerror (errno)); exit (E_BAD_ARG); } if (chroot (newroot) != 0) { - fprintf(stderr, + fprintf(shadow_logfd, _("%s: unable to chroot to directory %s: %s\n"), Prog, newroot, strerror (errno)); exit (E_BAD_ARG); |