diff --git a/ChangeLog b/ChangeLog index 8f2ed2e2..1c1b9b06 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-10-29 Nicolas François + + * lib/prototypes.h, libmisc/Makefile.am, libmisc/root_flag.c, + po/POTFILES.in: Add process_root_flag() to process the --root + option and chroot so that the chroot config is used and changes + are applied to the chroot. + 2011-10-22 Nicolas François * man/ja/Makefile.am, man/fr/Makefile.am, man/ru/Makefile.am, diff --git a/README b/README index 5a05783f..0619ac75 100644 --- a/README +++ b/README @@ -80,6 +80,7 @@ Joshua Cowan Judd Bourgeois Juergen Heinzl Juha Virtanen +Julian Pidancet Julianne Frances Haugh Leonard N. Zubkoff Luca Berra @@ -99,6 +100,7 @@ Phillip Street Rafał Maszkowski Rani Chouha Sami Kerola +Scott Garman Sebastian Rick Rijkers Seraphim Mellos Shane Watts diff --git a/lib/prototypes.h b/lib/prototypes.h index 7a0bb2f7..e2a0129b 100644 --- a/lib/prototypes.h +++ b/lib/prototypes.h @@ -291,6 +291,9 @@ extern int remove_tree (const char *root, bool remove_root); extern int do_rlogin (const char *remote_host, char *name, size_t namelen, char *term, size_t termlen); +/* root_flag.c */ +extern void process_root_flag (const char* short_opt, int argc, char **argv); + /* salt.c */ extern /*@observer@*/const char *crypt_make_salt (/*@null@*//*@observer@*/const char *meth, /*@null@*/void *arg); diff --git a/libmisc/Makefile.am b/libmisc/Makefile.am index a8afc177..41c9e901 100644 --- a/libmisc/Makefile.am +++ b/libmisc/Makefile.am @@ -45,6 +45,7 @@ libmisc_a_SOURCES = \ pwd_init.c \ remove_tree.c \ rlogin.c \ + root_flag.c \ salt.c \ setugid.c \ setupenv.c \ diff --git a/libmisc/root_flag.c b/libmisc/root_flag.c new file mode 100644 index 00000000..1d54fb3f --- /dev/null +++ b/libmisc/root_flag.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2011 , Julian Pidancet + * Copyright (c) 2011 , Nicolas François + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the copyright holders or contributors may not be used to + * endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#ident "$Id$" + +#include +#include "defines.h" +#include "prototypes.h" +#include "exitcodes.h" + +static void change_root (const char* newroot); + +/* + * process_root_flag - chroot if given the --root option + * + * This shall be called before accessing the passwd, group, shadow, + * gshadow, useradd's default, login.defs files (non exhaustive list) + * or authenticating the caller. + * + * The audit, syslog, or locale files shall be open before + */ +extern void process_root_flag (const char* short_opt, int argc, char **argv) +{ + /* + * Parse the command line options. + */ + int i; + const char *newroot = NULL; + + for (i = 0; i < argc; i++) { + if ( (strcmp (argv[i], "--root") == 0) + || (strcmp (argv[i], short_opt) == 0)) { + if (NULL != newroot) { + fprintf (stderr, + _("%s: multiple --root options\n"), + Prog); + exit (E_BAD_ARG); + } + + if (i + 1 == argc) { + fprintf (stderr, + _("%s: option '%s' requires an argument\n"), + Prog, argv[i]); + exit (E_BAD_ARG); + } + newroot = argv[i + 1]; + } + } + + if (NULL != newroot) { + change_root (newroot); + } +} + +static void change_root (const char* newroot) +{ + if ('/' != newroot[0]) { + fprintf (stderr, + _("%s: invalid chroot path '%s'\n"), + Prog, newroot); + exit (E_BAD_ARG); + } + + if (access (newroot, F_OK) != 0) { + fprintf(stderr, + _("%s: chroot directory %s does not exist\n"), + Prog, newroot); + exit (E_BAD_ARG); + } + if (chroot (newroot) != 0) { + fprintf(stderr, + _("%s: unable to chroot to directory %s\n"), + Prog, newroot); + exit (E_BAD_ARG); + } +} + diff --git a/po/POTFILES.in b/po/POTFILES.in index 4fa02f98..b90be888 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -62,6 +62,7 @@ libmisc/pwdcheck.c libmisc/pwd_init.c libmisc/remove_tree.c libmisc/rlogin.c +libmisc/root_flag.c libmisc/salt.c libmisc/setugid.c libmisc/setupenv.c