]> granicus.if.org Git - sudo/commitdiff
Use setpassent() and setgroupent() on systems that support it to
authorTodd C. Miller <Todd.Miller@sudo.ws>
Tue, 20 Feb 2018 20:22:59 +0000 (13:22 -0700)
committerTodd C. Miller <Todd.Miller@sudo.ws>
Tue, 20 Feb 2018 20:22:59 +0000 (13:22 -0700)
keep the passwd and group database open.  Sudo does a lot of passwd
and group lookups so it can be beneficial to just leave the file
open.

config.h.in
configure
configure.ac
src/sudo.c

index 2e4b877f67da1da7004027d40fffe26f19846566..3bbd6ee2718ed58deb423798a6a3de861086f79f 100644 (file)
 /* Define to 1 if you have the `seteuid' function. */
 #undef HAVE_SETEUID
 
+/* Define to 1 if you have the `setgroupent' function. */
+#undef HAVE_SETGROUPENT
+
 /* Define to 1 if you have the `setkeycreatecon' function. */
 #undef HAVE_SETKEYCREATECON
 
+/* Define to 1 if you have the `setpassent' function. */
+#undef HAVE_SETPASSENT
+
 /* Define to 1 if you have the `setprogname' function. */
 #undef HAVE_SETPROGNAME
 
index 1fda42b115c4e6ab17d9c71c31e803f8a8bb14ba..2a5a54b8816905d4a2b58f577e118e3513c8f8c2 100755 (executable)
--- a/configure
+++ b/configure
@@ -20915,6 +20915,18 @@ esac
 fi
 done
 
+for ac_func in setpassent setgroupent
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
 if test X"$with_noexec" != X"no"; then
     # Check for non-standard exec functions
     for ac_func in exect execvP execvpe
index 52a5963eae48cf21d88fdce83296e978beb8c0ed..96191841e9cc896c76029e393e848d1c5d5a5159 100644 (file)
@@ -2776,6 +2776,10 @@ AC_CHECK_FUNCS([vsyslog], [], [
     COMPAT_TEST_PROGS="${COMPAT_TEST_PROGS}${COMPAT_TEST_PROGS+ }vsyslog_test"
 ])
 dnl
+dnl 4.4BSD-based systems can force the password or group file to be held open
+dnl
+AC_CHECK_FUNCS([setpassent setgroupent])
+dnl
 dnl Function checks for sudo_noexec
 dnl
 if test X"$with_noexec" != X"no"; then
index b205b8a52ee3a5546551f149e64c84917083205b..ead8382159012bcd8d4c0fcc5ba23c69d8c31c5f 100644 (file)
@@ -508,6 +508,19 @@ get_user_info(struct user_details *ud)
     int fd;
     debug_decl(get_user_info, SUDO_DEBUG_UTIL)
 
+    /*
+     * On BSD systems you can set a hint to keep the password and
+     * group databases open instead of having to open and close
+     * them all the time.  Since sudo does a lot of password and
+     * group lookups, keeping the file open can speed things up.
+     */
+#ifdef HAVE_SETPASSENT
+    setpassent(1);
+#endif /* HAVE_SETPASSENT */
+#ifdef HAVE_SETGROUPENT
+    setgroupent(1);
+#endif /* HAVE_SETGROUPENT */
+
     memset(ud, 0, sizeof(*ud));
 
     /* XXX - bound check number of entries */