]> granicus.if.org Git - sudo/commitdiff
Add support for setenv entries in login.conf. We can't use LOGIN_SETENV
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 5 Dec 2011 15:43:44 +0000 (10:43 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 5 Dec 2011 15:43:44 +0000 (10:43 -0500)
since the plugin sets up the envp the command is executed with.
Also regen the Makefile.in files while here.  Fixes bug #527

13 files changed:
MANIFEST
common/Makefile.in
configure
configure.in
mkdep.pl
plugins/sample/Makefile.in
plugins/sample_group/Makefile.in
plugins/sudoers/Makefile.in
plugins/sudoers/env.c
plugins/sudoers/login_class.c [new file with mode: 0644]
plugins/sudoers/sudoers.c
plugins/sudoers/sudoers.h
src/Makefile.in

index e3d6f352a0c01cc8245df6f78fa69b05f05e3a80..7f2ff00d7fe1351133ec939d11af213ee1e5a7fd 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -179,6 +179,7 @@ plugins/sudoers/linux_audit.c
 plugins/sudoers/linux_audit.h
 plugins/sudoers/logging.c
 plugins/sudoers/logging.h
+plugins/sudoers/login_class.c
 plugins/sudoers/logwrap.c
 plugins/sudoers/match.c
 plugins/sudoers/match_addr.c
index 13d6d694cc8b2e01fc712f847d2b3d0becefbb82..c14932f8767bfcda54e00f8021218807d9fa1fdc 100644 (file)
@@ -102,8 +102,8 @@ atobool.lo: $(srcdir)/atobool.c $(top_builddir)/config.h $(incdir)/missing.h \
             $(incdir)/sudo_debug.h
        $(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/atobool.c
 fileops.lo: $(srcdir)/fileops.c $(top_builddir)/config.h \
-            $(top_srcdir)/compat/timespec.h $(incdir)/missing.h \
-            $(incdir)/fileops.h $(incdir)/sudo_debug.h
+            $(top_srcdir)/compat/stdbool.h $(top_srcdir)/compat/timespec.h \
+            $(incdir)/missing.h $(incdir)/fileops.h $(incdir)/sudo_debug.h
        $(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/fileops.c
 fmt_string.lo: $(srcdir)/fmt_string.c $(top_builddir)/config.h \
                $(incdir)/missing.h $(incdir)/sudo_debug.h
@@ -119,9 +119,9 @@ setgroups.lo: $(srcdir)/setgroups.c $(top_builddir)/config.h \
               $(incdir)/missing.h $(incdir)/sudo_debug.h
        $(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/setgroups.c
 sudo_debug.lo: $(srcdir)/sudo_debug.c $(top_builddir)/config.h \
-               $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
-               $(incdir)/gettext.h $(incdir)/sudo_plugin.h \
-               $(incdir)/sudo_debug.h
+               $(top_srcdir)/compat/stdbool.h $(incdir)/missing.h \
+               $(incdir)/alloc.h $(incdir)/error.h $(incdir)/gettext.h \
+               $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h
        $(LIBTOOL) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/sudo_debug.c
 term.lo: $(srcdir)/term.c $(top_builddir)/config.h $(incdir)/missing.h \
          $(incdir)/sudo_debug.h
index bae370846de0d4dc6989423d9ac18dd577483517..91313be886a847b70cda670ab50fc4e101076641 100755 (executable)
--- a/configure
+++ b/configure
@@ -15445,6 +15445,7 @@ _ACEOF
                SUDOERS_LIBS="${SUDOERS_LIBS} -lutil"
                ;;
        esac
+       SUDOERS_OBJS="${SUDOERS_OBJS} login_class.lo"
 
 fi
 
index 123a2e60713fb556a8255bf631782633277a448b..ee4007fd34f6413fb8163ab3cca1446c1e3c6287 100644 (file)
@@ -1990,6 +1990,7 @@ if test ${with_logincap-'no'} != "no"; then
                SUDOERS_LIBS="${SUDOERS_LIBS} -lutil"
                ;;
        esac
+       SUDOERS_OBJS="${SUDOERS_OBJS} login_class.lo"
     ])
 fi
 if test ${with_project-'no'} != "no"; then
index 55006ba998b637ce1b902cd873d892166d24b845..abf46f51933b62d7a7463fd9b56d3ca7cc103c6b 100755 (executable)
--- a/mkdep.pl
+++ b/mkdep.pl
@@ -52,7 +52,7 @@ sub mkdep {
     $makefile =~ s:\@DEV\@::g;
     $makefile =~ s:\@COMMON_OBJS\@:aix.lo:;
     $makefile =~ s:\@SUDO_OBJS\@:preload.o selinux.o sesh.o sudo_noexec.lo:;
-    $makefile =~ s:\@SUDOERS_OBJS\@:bsm_audit.lo linux_audit.lo ldap.lo plugin_error.lo:;
+    $makefile =~ s:\@SUDOERS_OBJS\@:bsm_audit.lo linux_audit.lo ldap.lo plugin_error.lo login_class.lo:;
     # XXX - fill in AUTH_OBJS from contents of the auth dir instead
     $makefile =~ s:\@AUTH_OBJS\@:afs.lo aix_auth.lo bsdauth.lo dce.lo fwtk.lo getspwuid.lo kerb5.lo pam.lo passwd.lo rfc1938.lo secureware.lo securid5.lo sia.lo:;
     $makefile =~ s:\@LTLIBOBJS\@:closefrom.lo dlopen.lo fnmatch.lo getcwd.lo getgrouplist.lo getline.lo getprogname.lo glob.lo isblank.lo memrchr.lo mksiglist.lo mktemp.lo nanosleep.lo setenv.lo siglist.lo snprintf.lo strlcat.lo strlcpy.lo strsignal.lo unsetenv.lo utimes.lo globtest.o fnm_test.o:;
index 3ace2545916c0092f16a6cf4d17c4de71da9c86f..27dd44f719c60c1d0de6cc529a46d71783636255 100644 (file)
@@ -121,6 +121,6 @@ cleandir: realclean
 
 # Autogenerated dependencies, do not modify
 sample_plugin.lo: $(srcdir)/sample_plugin.c $(top_builddir)/config.h \
-                  $(top_builddir)/pathnames.h $(incdir)/sudo_plugin.h \
-                  $(incdir)/missing.h
+                  $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+                  $(incdir)/sudo_plugin.h $(incdir)/missing.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/sample_plugin.c
index 5c208ea0cf549cfa97e0528d0a9caa92108d8e09..8a11d97fd9cd768ef4324ff11f1bfa887a2eeab8 100644 (file)
@@ -123,5 +123,6 @@ cleandir: realclean
 getgrent.lo: $(srcdir)/getgrent.c $(top_builddir)/config.h $(incdir)/missing.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/getgrent.c
 sample_group.lo: $(srcdir)/sample_group.c $(top_builddir)/config.h \
-                 $(incdir)/sudo_plugin.h $(incdir)/missing.h
+                 $(top_srcdir)/compat/stdbool.h $(incdir)/sudo_plugin.h \
+                 $(incdir)/missing.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/sample_group.c
index 7b9ab7ad43b4a049a3ddf264d90e15159c27b86d..b2e18527f96346621f228c0c0ae48e6d757b8f60 100644 (file)
@@ -363,26 +363,27 @@ cleandir: realclean
 
 # Autogenerated dependencies, do not modify
 afs.lo: $(authdir)/afs.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-        $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-        $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-        $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-        $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-        $(incdir)/gettext.h
+        $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+        $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+        $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+        $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+        $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/afs.c
 aix_auth.lo: $(authdir)/aix_auth.c $(top_builddir)/config.h \
-             $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-             $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-             $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-             $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-             $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
+             $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+             $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
+             $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
+             $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
+             $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
+             $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/aix_auth.c
 alias.lo: $(srcdir)/alias.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-          $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-          $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-          $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-          $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-          $(incdir)/gettext.h $(srcdir)/parse.h $(srcdir)/redblack.h \
-          $(devdir)/gram.h
+          $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+          $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+          $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+          $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+          $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h \
+          $(srcdir)/parse.h $(srcdir)/redblack.h $(devdir)/gram.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/alias.c
 audit.lo: $(srcdir)/audit.c $(top_builddir)/config.h $(incdir)/missing.h \
           $(srcdir)/logging.h $(incdir)/sudo_debug.h $(srcdir)/bsm_audit.h \
@@ -392,161 +393,169 @@ boottime.lo: $(srcdir)/boottime.c $(top_builddir)/config.h $(incdir)/missing.h \
              $(incdir)/sudo_debug.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/boottime.c
 bsdauth.lo: $(authdir)/bsdauth.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-            $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-            $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-            $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-            $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
-            $(incdir)/sudo_debug.h $(incdir)/gettext.h
+            $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+            $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+            $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+            $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+            $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/bsdauth.c
 bsm_audit.lo: $(srcdir)/bsm_audit.c $(top_builddir)/config.h \
               $(srcdir)/bsm_audit.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/bsm_audit.c
 check.lo: $(srcdir)/check.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-          $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-          $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-          $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-          $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-          $(incdir)/gettext.h
+          $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+          $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+          $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+          $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+          $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/check.c
 check_addr.o: $(srcdir)/regress/parser/check_addr.c $(top_builddir)/config.h \
-              $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-              $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-              $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-              $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-              $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-              $(incdir)/gettext.h $(srcdir)/parse.h $(srcdir)/interfaces.h
+              $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+              $(top_builddir)/pathnames.h $(incdir)/missing.h \
+              $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+              $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+              $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
+              $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/parse.h \
+              $(srcdir)/interfaces.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/regress/parser/check_addr.c
 check_fill.o: $(srcdir)/regress/parser/check_fill.c $(top_builddir)/config.h \
-              $(incdir)/list.h $(srcdir)/parse.h $(srcdir)/toke.h \
+              $(top_srcdir)/compat/stdbool.h $(incdir)/list.h \
+              $(srcdir)/parse.h $(srcdir)/toke.h $(incdir)/sudo_plugin.h \
               $(devdir)/gram.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/regress/parser/check_fill.c
 check_iolog_path.o: $(srcdir)/regress/iolog_path/check_iolog_path.c \
                     $(top_builddir)/config.h $(srcdir)/sudoers.h \
-                    $(top_builddir)/pathnames.h $(incdir)/missing.h \
-                    $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
-                    $(incdir)/fileops.h $(srcdir)/defaults.h \
+                    $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+                    $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+                    $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
                     $(devdir)/def_data.h $(srcdir)/logging.h \
                     $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
                     $(incdir)/sudo_debug.h $(incdir)/gettext.h \
                     $(devdir)/def_data.c
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/regress/iolog_path/check_iolog_path.c
 check_wrap.o: $(srcdir)/regress/logging/check_wrap.c $(top_builddir)/config.h \
-              $(incdir)/missing.h $(incdir)/error.h
+              $(incdir)/missing.h $(incdir)/error.h $(incdir)/sudo_plugin.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/regress/logging/check_wrap.c
 dce.lo: $(authdir)/dce.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-        $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-        $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-        $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-        $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-        $(incdir)/gettext.h
+        $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+        $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+        $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+        $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+        $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/dce.c
 defaults.lo: $(srcdir)/defaults.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-             $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-             $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-             $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-             $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
-             $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/parse.h \
-             $(devdir)/gram.h $(devdir)/def_data.c
+             $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+             $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+             $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+             $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+             $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
+             $(incdir)/gettext.h $(srcdir)/parse.h $(devdir)/gram.h \
+             $(devdir)/def_data.c
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/defaults.c
 env.lo: $(srcdir)/env.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-        $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-        $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-        $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-        $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-        $(incdir)/gettext.h
+        $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+        $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+        $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+        $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+        $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/env.c
 error.o: $(top_srcdir)/src/error.c $(top_builddir)/config.h \
          $(incdir)/missing.h $(incdir)/error.h $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(top_srcdir)/src/error.c
 find_path.lo: $(srcdir)/find_path.c $(top_builddir)/config.h \
-              $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-              $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-              $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-              $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-              $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
+              $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+              $(top_builddir)/pathnames.h $(incdir)/missing.h \
+              $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+              $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+              $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
+              $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/find_path.c
 find_path.o: find_path.lo
 fwtk.lo: $(authdir)/fwtk.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-         $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-         $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-         $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-         $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-         $(incdir)/gettext.h
+         $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+         $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+         $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+         $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+         $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/fwtk.c
 getdate.o: $(devdir)/getdate.c $(top_builddir)/config.h \
            $(top_builddir)/config.h $(incdir)/missing.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(devdir)/getdate.c
 getspwuid.lo: $(srcdir)/getspwuid.c $(top_builddir)/config.h \
-              $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-              $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-              $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-              $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-              $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
+              $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+              $(top_builddir)/pathnames.h $(incdir)/missing.h \
+              $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+              $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+              $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
+              $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/getspwuid.c
 goodpath.lo: $(srcdir)/goodpath.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-             $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-             $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-             $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-             $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
-             $(incdir)/sudo_debug.h $(incdir)/gettext.h
+             $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+             $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+             $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+             $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+             $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/goodpath.c
 goodpath.o: goodpath.lo
 gram.lo: $(devdir)/gram.c $(top_builddir)/config.h $(top_builddir)/config.h \
-         $(srcdir)/sudoers.h $(top_builddir)/pathnames.h $(incdir)/missing.h \
-         $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
-         $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
-         $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
-         $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/parse.h \
-         $(srcdir)/toke.h $(devdir)/gram.h
+         $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+         $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
+         $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
+         $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
+         $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
+         $(incdir)/gettext.h $(srcdir)/parse.h $(srcdir)/toke.h $(devdir)/gram.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(devdir)/gram.c
 group_plugin.lo: $(srcdir)/group_plugin.c $(top_builddir)/config.h \
                  $(top_srcdir)/compat/dlfcn.h $(srcdir)/sudoers.h \
-                 $(top_builddir)/pathnames.h $(incdir)/missing.h \
-                 $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
-                 $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
-                 $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+                 $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+                 $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+                 $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+                 $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
                  $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
                  $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/group_plugin.c
 group_plugin.o: group_plugin.lo
 interfaces.lo: $(srcdir)/interfaces.c $(top_builddir)/config.h \
-               $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-               $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-               $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-               $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+               $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+               $(top_builddir)/pathnames.h $(incdir)/missing.h \
+               $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+               $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+               $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
                $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
                $(incdir)/gettext.h $(srcdir)/interfaces.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/interfaces.c
 interfaces.o: interfaces.lo
 iolog.lo: $(srcdir)/iolog.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-          $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-          $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-          $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-          $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-          $(incdir)/gettext.h
+          $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+          $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+          $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+          $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+          $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/iolog.c
 iolog_path.lo: $(srcdir)/iolog_path.c $(top_builddir)/config.h \
-               $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-               $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-               $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-               $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+               $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+               $(top_builddir)/pathnames.h $(incdir)/missing.h \
+               $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+               $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+               $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
                $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
                $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/iolog_path.c
 iolog_path.o: iolog_path.lo
 kerb5.lo: $(authdir)/kerb5.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-          $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-          $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-          $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-          $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-          $(incdir)/gettext.h
+          $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+          $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+          $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+          $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+          $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/kerb5.c
 ldap.lo: $(srcdir)/ldap.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-         $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-         $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-         $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-         $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-         $(incdir)/gettext.h $(srcdir)/parse.h $(incdir)/lbuf.h
+         $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+         $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+         $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+         $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+         $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h \
+         $(srcdir)/parse.h $(incdir)/lbuf.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/ldap.c
 linux_audit.lo: $(srcdir)/linux_audit.c $(top_builddir)/config.h \
                 $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
@@ -554,33 +563,44 @@ linux_audit.lo: $(srcdir)/linux_audit.c $(top_builddir)/config.h \
                 $(srcdir)/linux_audit.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/linux_audit.c
 logging.lo: $(srcdir)/logging.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-            $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-            $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-            $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-            $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
-            $(incdir)/sudo_debug.h $(incdir)/gettext.h
+            $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+            $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+            $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+            $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+            $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/logging.c
+login_class.lo: $(srcdir)/login_class.c $(top_builddir)/config.h \
+                $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+                $(top_builddir)/pathnames.h $(incdir)/missing.h \
+                $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+                $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+                $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+                $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
+                $(incdir)/gettext.h
+       $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/login_class.c
 logwrap.lo: $(srcdir)/logwrap.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-            $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-            $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-            $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-            $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
-            $(incdir)/sudo_debug.h $(incdir)/gettext.h
+            $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+            $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+            $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+            $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+            $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/logwrap.c
 logwrap.o: logwrap.lo
 match.lo: $(srcdir)/match.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-          $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-          $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-          $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-          $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-          $(incdir)/gettext.h $(srcdir)/parse.h $(devdir)/gram.h \
-          $(top_srcdir)/compat/fnmatch.h $(top_srcdir)/compat/glob.h
+          $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+          $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+          $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+          $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+          $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h \
+          $(srcdir)/parse.h $(devdir)/gram.h $(top_srcdir)/compat/fnmatch.h \
+          $(top_srcdir)/compat/glob.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/match.c
 match_addr.lo: $(srcdir)/match_addr.c $(top_builddir)/config.h \
-               $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-               $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-               $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-               $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+               $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+               $(top_builddir)/pathnames.h $(incdir)/missing.h \
+               $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+               $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+               $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
                $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
                $(incdir)/gettext.h $(srcdir)/interfaces.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/match_addr.c
@@ -590,37 +610,38 @@ net_ifs.o: $(top_srcdir)/src/net_ifs.c $(top_builddir)/config.h \
            $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(top_srcdir)/src/net_ifs.c
 pam.lo: $(authdir)/pam.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-        $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-        $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-        $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-        $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-        $(incdir)/gettext.h
+        $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+        $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+        $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+        $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+        $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/pam.c
 parse.lo: $(srcdir)/parse.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-          $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-          $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-          $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-          $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-          $(incdir)/gettext.h $(srcdir)/parse.h $(incdir)/lbuf.h \
-          $(devdir)/gram.h
+          $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+          $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+          $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+          $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+          $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h \
+          $(srcdir)/parse.h $(incdir)/lbuf.h $(devdir)/gram.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/parse.c
 passwd.lo: $(authdir)/passwd.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-           $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-           $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-           $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-           $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-           $(incdir)/gettext.h
+           $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+           $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+           $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+           $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+           $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/passwd.c
 plugin_error.lo: $(srcdir)/plugin_error.c $(top_builddir)/config.h \
                  $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
                  $(incdir)/sudo_plugin.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/plugin_error.c
 pwutil.lo: $(srcdir)/pwutil.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-           $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-           $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-           $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-           $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-           $(incdir)/gettext.h $(srcdir)/redblack.h
+           $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+           $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+           $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+           $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+           $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h \
+           $(srcdir)/redblack.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/pwutil.c
 pwutil.o: pwutil.lo
 redblack.lo: $(srcdir)/redblack.c $(top_builddir)/config.h $(incdir)/missing.h \
@@ -628,59 +649,65 @@ redblack.lo: $(srcdir)/redblack.c $(top_builddir)/config.h $(incdir)/missing.h \
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/redblack.c
 redblack.o: redblack.lo
 rfc1938.lo: $(authdir)/rfc1938.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-            $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-            $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-            $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-            $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
-            $(incdir)/sudo_debug.h $(incdir)/gettext.h
+            $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+            $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+            $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+            $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+            $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/rfc1938.c
 secureware.lo: $(authdir)/secureware.c $(top_builddir)/config.h \
-               $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-               $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-               $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-               $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+               $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+               $(top_builddir)/pathnames.h $(incdir)/missing.h \
+               $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+               $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+               $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
                $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
                $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/secureware.c
 securid5.lo: $(authdir)/securid5.c $(top_builddir)/config.h \
-             $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-             $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-             $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-             $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-             $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
+             $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+             $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
+             $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
+             $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
+             $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
+             $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/securid5.c
 set_perms.lo: $(srcdir)/set_perms.c $(top_builddir)/config.h \
-              $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-              $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-              $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-              $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-              $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
+              $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+              $(top_builddir)/pathnames.h $(incdir)/missing.h \
+              $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+              $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+              $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
+              $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/set_perms.c
 sia.lo: $(authdir)/sia.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-        $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-        $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-        $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-        $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-        $(incdir)/gettext.h
+        $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+        $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+        $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+        $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+        $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/sia.c
 sudo_auth.lo: $(authdir)/sudo_auth.c $(top_builddir)/config.h \
-              $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-              $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-              $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-              $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-              $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-              $(incdir)/gettext.h $(srcdir)/insults.h $(srcdir)/ins_2001.h \
-              $(srcdir)/ins_goons.h $(srcdir)/ins_classic.h \
-              $(srcdir)/ins_csops.h
+              $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+              $(top_builddir)/pathnames.h $(incdir)/missing.h \
+              $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+              $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+              $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
+              $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/insults.h \
+              $(srcdir)/ins_2001.h $(srcdir)/ins_goons.h \
+              $(srcdir)/ins_classic.h $(srcdir)/ins_csops.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(authdir)/sudo_auth.c
 sudo_nss.lo: $(srcdir)/sudo_nss.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-             $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-             $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-             $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-             $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
-             $(incdir)/sudo_debug.h $(incdir)/gettext.h $(incdir)/lbuf.h
+             $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+             $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+             $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+             $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+             $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
+             $(incdir)/gettext.h $(incdir)/lbuf.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/sudo_nss.c
-sudoers.lo: $(srcdir)/sudoers.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
+sudoers.lo: $(srcdir)/sudoers.c $(top_builddir)/config.h \
+            $(top_srcdir)/compat/getaddrinfo.h $(top_builddir)/config.h \
+            $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
             $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
             $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
             $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
@@ -695,10 +722,11 @@ sudoreplay.o: $(srcdir)/sudoreplay.c $(top_builddir)/config.h \
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/sudoreplay.c
 testsudoers.o: $(srcdir)/testsudoers.c $(top_builddir)/config.h \
                $(srcdir)/tsgetgrpw.h $(top_builddir)/config.h \
-               $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-               $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-               $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-               $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+               $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+               $(top_builddir)/pathnames.h $(incdir)/missing.h \
+               $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+               $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+               $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
                $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
                $(incdir)/gettext.h $(srcdir)/interfaces.h $(srcdir)/parse.h \
                $(devdir)/gram.h $(top_srcdir)/compat/fnmatch.h
@@ -706,37 +734,39 @@ testsudoers.o: $(srcdir)/testsudoers.c $(top_builddir)/config.h \
 timestr.lo: $(srcdir)/timestr.c $(top_builddir)/config.h $(incdir)/missing.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/timestr.c
 toke.lo: $(devdir)/toke.c $(top_builddir)/config.h $(top_builddir)/config.h \
-         $(srcdir)/sudoers.h $(top_builddir)/pathnames.h $(incdir)/missing.h \
-         $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
-         $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
-         $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
-         $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/parse.h \
-         $(srcdir)/toke.h $(devdir)/gram.h $(incdir)/lbuf.h
+         $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+         $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
+         $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
+         $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
+         $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
+         $(incdir)/gettext.h $(srcdir)/parse.h $(srcdir)/toke.h \
+         $(devdir)/gram.h $(incdir)/lbuf.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(devdir)/toke.c
 toke_util.lo: $(srcdir)/toke_util.c $(top_builddir)/config.h \
-              $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-              $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-              $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-              $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-              $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-              $(incdir)/gettext.h $(srcdir)/parse.h $(srcdir)/toke.h \
-              $(devdir)/gram.h
+              $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+              $(top_builddir)/pathnames.h $(incdir)/missing.h \
+              $(incdir)/error.h $(incdir)/alloc.h $(incdir)/list.h \
+              $(incdir)/fileops.h $(srcdir)/defaults.h $(devdir)/def_data.h \
+              $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
+              $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/parse.h \
+              $(srcdir)/toke.h $(devdir)/gram.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/toke_util.c
 toke_util.o: toke_util.lo
 tsgetgrpw.o: $(srcdir)/tsgetgrpw.c $(top_builddir)/config.h \
              $(srcdir)/tsgetgrpw.h $(top_builddir)/config.h \
-             $(srcdir)/sudoers.h $(top_builddir)/pathnames.h \
-             $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
-             $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
-             $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
-             $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h
+             $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \
+             $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
+             $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
+             $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
+             $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \
+             $(incdir)/sudo_debug.h $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/tsgetgrpw.c
 visudo.o: $(srcdir)/visudo.c $(top_builddir)/config.h $(srcdir)/sudoers.h \
-          $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/error.h \
-          $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \
-          $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \
-          $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \
-          $(incdir)/gettext.h $(srcdir)/interfaces.h $(srcdir)/parse.h \
-          $(srcdir)/redblack.h $(incdir)/gettext.h $(srcdir)/sudoers_version.h \
-          $(devdir)/gram.h
+          $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \
+          $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \
+          $(incdir)/list.h $(incdir)/fileops.h $(srcdir)/defaults.h \
+          $(devdir)/def_data.h $(srcdir)/logging.h $(srcdir)/sudo_nss.h \
+          $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h $(incdir)/gettext.h \
+          $(srcdir)/interfaces.h $(srcdir)/parse.h $(srcdir)/redblack.h \
+          $(incdir)/gettext.h $(srcdir)/sudoers_version.h $(devdir)/gram.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/visudo.c
index 7252120360f380e37e11ef97260623d0fcf5f66e..66bcd5e48adb853eed9c159c21edad431e186a87 100644 (file)
@@ -98,7 +98,6 @@ struct environment {
 /*
  * Prototypes
  */
-static void sudo_setenv(const char *, const char *, int);
 static void sudo_putenv(char *, int, int);
 
 /*
@@ -240,7 +239,7 @@ env_get(void)
  * (not environ) and it always overwrites.  The dupcheck param determines
  * whether we need to verify that the variable is not already set.
  */
-static void
+void
 sudo_setenv(const char *var, const char *val, int dupcheck)
 {
     char *estring;
diff --git a/plugins/sudoers/login_class.c b/plugins/sudoers/login_class.c
new file mode 100644 (file)
index 0000000..34270d5
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2004, 2011 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdio.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif /* STDC_HEADERS */
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif /* HAVE_STRING_H */
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif /* HAVE_STRING_H */
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#include <pwd.h>
+
+#include <login_cap.h>
+
+#include "sudoers.h"
+
+/*
+ * Check whether or not a tilde in a string should be expanded.
+ * We only do expansion for things like "~", "~/...", ~me", "~me/...".
+ */
+#define tilde_valid(s, u, l) \
+    ((s)[1] == '/' || (s)[1] == '\0' || \
+    (strncmp((s)+1, u, l) == 0 && ((s)[l+1] == '/' || (s)[l+1] == '\0')))
+
+/*
+ * Make a copy of a string, expanding '~' to the user's homedir, '$' to the
+ * login name and other escape sequences as per cgetstr(3).
+ */
+static char *
+expandstr(const char *ostr, const struct passwd *pwd)
+{
+       size_t n, olen, nlen, ulen, dlen;
+       const char *ep, *eo, *op;
+       char *nstr, *np;
+       int ch;
+
+       /* calculate the size of the new string */
+       ulen = strlen(pwd->pw_name);
+       dlen = strlen(pwd->pw_dir);
+       olen = nlen = strlen(ostr);
+       for (op = ostr, ep = ostr + olen; op < ep; op++) {
+               switch (*op) {
+               case '~':
+                       if (!tilde_valid(op, pwd->pw_name, ulen))
+                               break;
+                       if (op[1] != '/' && op[1] != '\0') {
+                               op += ulen;     /* ~username */
+                               nlen = nlen - ulen - 1 + dlen;
+                       } else
+                               nlen += dlen - 1;
+                       break;
+               case '$':
+                       nlen += ulen - 1;
+                       break;
+               case '^':
+                       /* control char */
+                       if (*++op != '\0')
+                               nlen--;
+                       break;
+               case '\\':
+                       if (op[1] == '\0')
+                               break;
+                       /*
+                        * Byte in octal notation (\123) or an escaped char (\t)
+                        */
+                       eo = op + 4;
+                       do {
+                               op++;
+                               nlen--;
+                       } while (op < eo && *op >= '0' && *op <= '7');
+                       break;
+               }
+       }
+       np = nstr = emalloc(++nlen);
+
+       for (op = ostr, ep = ostr + olen; op < ep; op++) {
+               switch ((ch = *op)) {
+               case '~':
+                       if (!tilde_valid(op, pwd->pw_name, ulen))
+                               break;
+                       if (op[1] != '/' && op[1] != '\0')
+                               op += ulen;     /* ~username */
+                       strlcpy(np, pwd->pw_dir, nlen);
+                       nlen -= dlen;
+                       np += dlen;
+                       continue;
+               case '$':
+                       strlcpy(np, pwd->pw_name, nlen);
+                       nlen -= ulen;
+                       np += ulen;
+                       continue;
+               case '^':
+                       if (op[1] != '\0')
+                               ch = *++op & 037;
+                       break;
+               case '\\':
+                       if (op[1] == '\0')
+                               break;
+                       switch(*++op) {
+                       case '0': case '1': case '2': case '3':
+                       case '4': case '5': case '6': case '7':
+                               /* byte in octal up to 3 digits long */
+                               ch = 0;
+                               n = 3;
+                               do {
+                                       ch = ch * 8 + (*op++ - '0');
+                               } while (--n && *op >= '0' && *op <= '7');
+                               break;
+                       case 'b': case 'B':
+                               ch = '\b';
+                               break;
+                       case 't': case 'T':
+                               ch = '\t';
+                               break;
+                       case 'n': case 'N':
+                               ch = '\n';
+                               break;
+                       case 'f': case 'F':
+                               ch = '\f';
+                               break;
+                       case 'r': case 'R':
+                               ch = '\r';
+                               break;
+                       case 'e': case 'E':
+                               ch = '\033';
+                               break;
+                       case 'c': case 'C':
+                               ch = ':';
+                               break;
+                       default:
+                               ch = *op;
+                               break;
+                       }
+                       break;
+               }
+               *np++ = ch;
+               nlen--;
+       }
+       *np = '\0';
+       return (nstr);
+}
+
+/*
+ * Set an environment variable, substituting for ~ and $
+ */
+static void
+login_setenv(char *name, char *ovalue, const struct passwd *pwd)
+{
+       char *value = NULL;
+
+       if (*ovalue != '\0')
+               value = expandstr(ovalue, pwd);
+       sudo_setenv(name, value ? value : ovalue, 1);
+       efree(value);
+}
+
+/*
+ * Look up "setenv" for this user in login.conf and set the comma-separated
+ * list of environment variables, expanding '~' and '$'.
+ */
+int
+sudo_login_setenv(login_cap_t *lc, const struct passwd *pwd)
+{
+       char *beg, *end, *ep, *list, *value;
+       int len;
+
+       if (lc == NULL || lc->lc_cap == NULL)
+               return (-1);            /* impossible */
+
+       if ((len = cgetustr(lc->lc_cap, "setenv", &list)) <= 0)
+               return (0);
+
+       for (beg = end = list, ep = list + len + 1; end < ep; end++) {
+               switch (*end) {
+               case '\\':
+                       if (*(end + 1) == ',')
+                               end++;  /* skip escaped comma */
+                       continue;
+               case ',':
+               case '\0':
+                       *end = '\0';
+                       if (beg == end) {
+                               beg++;
+                               continue;
+                       }
+                       break;
+               default:
+                       continue;
+               }
+
+               if ((value = strchr(beg, '=')) != NULL)
+                       *value++ = '\0';
+               else
+                       value = "";
+               login_setenv(beg, value, pwd);
+               beg = end + 1;
+       }
+       efree(list);
+       return (0);
+}
index 3dd6b856b4f039f493a2cc3321ecc575f87487ed..6d64ac613646c3e81c7dc33409181e8f0c57a3df 100644 (file)
@@ -127,6 +127,9 @@ static char *runas_group;
 static struct sudo_nss_list *snl;
 static const char *interfaces_string;
 static sigaction_t saved_sa_int, saved_sa_quit, saved_sa_tstp;
+#ifdef HAVE_LOGIN_CAP_H
+static login_cap_t *lc;
+#endif
 
 /* XXX - must be extern for audit bits of sudo_auth.c */
 int NewArgc;
@@ -592,8 +595,16 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
 #if defined(__linux__) || defined(_AIX)
        /* Insert system-wide environment variables. */
        read_env_file(_PATH_ENVIRONMENT, true);
+#elif defined(HAVE_LOGIN_CAP_H)
+       /* Insert login class-specific environment variables. */
+       if (lc != NULL)
+           sudo_login_setenv(lc, runas_pw);
 #endif
     }
+#ifdef HAVE_LOGIN_CAP_H
+    login_close(lc);
+    lc = NULL;
+#endif
 
     /* Insert system-wide environment variables. */
     if (def_env_file)
@@ -1004,7 +1015,6 @@ static void
 set_loginclass(struct passwd *pw)
 {
     int errflags;
-    login_cap_t *lc;
     debug_decl(set_loginclass, SUDO_DEBUG_PLUGIN)
 
     if (!def_use_loginclass)
@@ -1037,7 +1047,6 @@ set_loginclass(struct passwd *pw)
        log_error(errflags, _("unknown login class: %s"), login_class);
        def_use_loginclass = false;
     }
-    login_close(lc);
     debug_return;
 }
 #else
index 1d4f3e9d410a14c775263fc8d1446aafbd9194be..6c7878b28d5e308f5653d18b7fdc8f2e0948c9e4 100644 (file)
@@ -197,6 +197,7 @@ struct lbuf;
 struct passwd;
 struct stat;
 struct timeval;
+struct login_cap;
 
 /*
  * Function prototypes
@@ -305,6 +306,7 @@ void init_envtables(void);
 void insert_env_vars(char * const envp[]);
 void read_env_file(const char *, int);
 void rebuild_env(void);
+void sudo_setenv(const char *var, const char *val, int dupcheck);
 void validate_env_vars(char * const envp[]);
 
 /* fmt_string.c */
@@ -328,6 +330,9 @@ int group_plugin_query(const char *user, const char *group,
 /* setgroups.c */
 int sudo_setgroups(int ngids, const GETGROUPS_T *gids);
 
+/* login_cap.c */
+int sudo_login_setenv(struct login_cap *lc, const struct passwd *pwd);
+
 #ifndef _SUDO_MAIN
 extern struct sudo_user sudo_user;
 extern struct passwd *list_pw;
index f3b5f4200efa3cddf096bd9fbc7f1fea47d5888c..51b725b6504789278055ac1835342cc51f2f1291 100644 (file)
@@ -153,45 +153,49 @@ cleandir: realclean
 # Autogenerated dependencies, do not modify
 conversation.o: $(srcdir)/conversation.c $(top_builddir)/config.h \
                 $(srcdir)/sudo.h $(top_builddir)/pathnames.h \
-                $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
-                $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
-                $(incdir)/gettext.h $(incdir)/sudo_plugin.h \
-                $(srcdir)/sudo_plugin_int.h
+                $(top_srcdir)/compat/stdbool.h $(incdir)/missing.h \
+                $(incdir)/alloc.h $(incdir)/error.h $(incdir)/fileops.h \
+                $(incdir)/list.h $(incdir)/sudo_debug.h $(incdir)/gettext.h \
+                $(incdir)/sudo_plugin.h $(srcdir)/sudo_plugin_int.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/conversation.c
 error.o: $(srcdir)/error.c $(top_builddir)/config.h $(incdir)/missing.h \
          $(incdir)/error.h $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/error.c
 exec.o: $(srcdir)/exec.c $(top_builddir)/config.h $(srcdir)/sudo.h \
-        $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/alloc.h \
-        $(incdir)/error.h $(incdir)/fileops.h $(incdir)/list.h \
-        $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/sudo_exec.h \
-        $(incdir)/sudo_plugin.h $(srcdir)/sudo_plugin_int.h
+        $(top_builddir)/pathnames.h $(top_srcdir)/compat/stdbool.h \
+        $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
+        $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
+        $(incdir)/gettext.h $(srcdir)/sudo_exec.h $(incdir)/sudo_plugin.h \
+        $(srcdir)/sudo_plugin_int.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/exec.c
 exec_pty.o: $(srcdir)/exec_pty.c $(top_builddir)/config.h $(srcdir)/sudo.h \
-            $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/alloc.h \
-            $(incdir)/error.h $(incdir)/fileops.h $(incdir)/list.h \
-            $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/sudo_exec.h \
-            $(incdir)/sudo_plugin.h $(srcdir)/sudo_plugin_int.h
+            $(top_builddir)/pathnames.h $(top_srcdir)/compat/stdbool.h \
+            $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
+            $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
+            $(incdir)/gettext.h $(srcdir)/sudo_exec.h $(incdir)/sudo_plugin.h \
+            $(srcdir)/sudo_plugin_int.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/exec_pty.c
 get_pty.o: $(srcdir)/get_pty.c $(top_builddir)/config.h $(srcdir)/sudo.h \
-           $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/alloc.h \
-           $(incdir)/error.h $(incdir)/fileops.h $(incdir)/list.h \
-           $(incdir)/sudo_debug.h $(incdir)/gettext.h
+           $(top_builddir)/pathnames.h $(top_srcdir)/compat/stdbool.h \
+           $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
+           $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
+           $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/get_pty.c
 load_plugins.o: $(srcdir)/load_plugins.c $(top_builddir)/config.h \
                 $(top_srcdir)/compat/dlfcn.h $(srcdir)/sudo.h \
-                $(top_builddir)/pathnames.h $(incdir)/missing.h \
-                $(incdir)/alloc.h $(incdir)/error.h $(incdir)/fileops.h \
-                $(incdir)/list.h $(incdir)/sudo_debug.h $(incdir)/gettext.h \
-                $(incdir)/sudo_plugin.h $(srcdir)/sudo_plugin_int.h \
-                $(incdir)/sudo_debug.h
+                $(top_builddir)/pathnames.h $(top_srcdir)/compat/stdbool.h \
+                $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
+                $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
+                $(incdir)/gettext.h $(incdir)/sudo_plugin.h \
+                $(srcdir)/sudo_plugin_int.h $(incdir)/sudo_debug.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/load_plugins.c
 net_ifs.o: $(srcdir)/net_ifs.c $(top_builddir)/config.h $(incdir)/missing.h \
            $(incdir)/alloc.h $(incdir)/error.h $(incdir)/sudo_debug.h \
            $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/net_ifs.c
 parse_args.o: $(srcdir)/parse_args.c $(top_builddir)/config.h ./sudo_usage.h \
-              $(srcdir)/sudo.h $(top_builddir)/pathnames.h $(incdir)/missing.h \
+              $(srcdir)/sudo.h $(top_builddir)/pathnames.h \
+              $(top_srcdir)/compat/stdbool.h $(incdir)/missing.h \
               $(incdir)/alloc.h $(incdir)/error.h $(incdir)/fileops.h \
               $(incdir)/list.h $(incdir)/sudo_debug.h $(incdir)/gettext.h \
               $(incdir)/lbuf.h
@@ -199,37 +203,42 @@ parse_args.o: $(srcdir)/parse_args.c $(top_builddir)/config.h ./sudo_usage.h \
 preload.o: $(srcdir)/preload.c $(top_builddir)/config.h $(incdir)/sudo_plugin.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/preload.c
 selinux.o: $(srcdir)/selinux.c $(top_builddir)/config.h $(srcdir)/sudo.h \
-           $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/alloc.h \
-           $(incdir)/error.h $(incdir)/fileops.h $(incdir)/list.h \
-           $(incdir)/sudo_debug.h $(incdir)/gettext.h
+           $(top_builddir)/pathnames.h $(top_srcdir)/compat/stdbool.h \
+           $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
+           $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
+           $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/selinux.c
 sesh.o: $(srcdir)/sesh.c $(top_builddir)/config.h $(incdir)/missing.h \
         $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/sesh.c
 sudo.o: $(srcdir)/sudo.c $(top_builddir)/config.h $(srcdir)/sudo.h \
-        $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/alloc.h \
-        $(incdir)/error.h $(incdir)/fileops.h $(incdir)/list.h \
-        $(incdir)/sudo_debug.h $(incdir)/gettext.h $(incdir)/sudo_plugin.h \
+        $(top_builddir)/pathnames.h $(top_srcdir)/compat/stdbool.h \
+        $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
+        $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
+        $(incdir)/gettext.h $(incdir)/sudo_plugin.h \
         $(srcdir)/sudo_plugin_int.h ./sudo_usage.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/sudo.c
 sudo_edit.o: $(srcdir)/sudo_edit.c $(top_builddir)/config.h $(srcdir)/sudo.h \
-             $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/alloc.h \
-             $(incdir)/error.h $(incdir)/fileops.h $(incdir)/list.h \
-             $(incdir)/sudo_debug.h $(incdir)/gettext.h
+             $(top_builddir)/pathnames.h $(top_srcdir)/compat/stdbool.h \
+             $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
+             $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
+             $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/sudo_edit.c
 sudo_noexec.lo: $(srcdir)/sudo_noexec.c $(top_builddir)/config.h \
                 $(incdir)/missing.h
        $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/sudo_noexec.c
 tgetpass.o: $(srcdir)/tgetpass.c $(top_builddir)/config.h $(srcdir)/sudo.h \
-            $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/alloc.h \
-            $(incdir)/error.h $(incdir)/fileops.h $(incdir)/list.h \
-            $(incdir)/sudo_debug.h $(incdir)/gettext.h
+            $(top_builddir)/pathnames.h $(top_srcdir)/compat/stdbool.h \
+            $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
+            $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
+            $(incdir)/gettext.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/tgetpass.c
 ttysize.o: $(srcdir)/ttysize.c $(top_builddir)/config.h $(incdir)/missing.h \
            $(incdir)/sudo_debug.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/ttysize.c
 utmp.o: $(srcdir)/utmp.c $(top_builddir)/config.h $(srcdir)/sudo.h \
-        $(top_builddir)/pathnames.h $(incdir)/missing.h $(incdir)/alloc.h \
-        $(incdir)/error.h $(incdir)/fileops.h $(incdir)/list.h \
-        $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/sudo_exec.h
+        $(top_builddir)/pathnames.h $(top_srcdir)/compat/stdbool.h \
+        $(incdir)/missing.h $(incdir)/alloc.h $(incdir)/error.h \
+        $(incdir)/fileops.h $(incdir)/list.h $(incdir)/sudo_debug.h \
+        $(incdir)/gettext.h $(srcdir)/sudo_exec.h
        $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/utmp.c