Blob Blame History Raw
autofs-5.1.2 - add congigure option for limiting getgrgid_r() stack usage

From: Ian Kent <raven@themaw.net>

Almost all the time it isn't a problem for glibc to use stack allocation
to store group information during calls to getgrgid_r().

But if it is a problem the --enable-limit-getgrgid-size configure option
can be used to limit the buffer size passed to getgrgid_r() (which is used
to decide whether to alloca() local storage for the call).

The check allows the call to go ahead if the increased buffer size is less
than 0.9 of the thread stack size.

This isn't ideal because the current stack usage isn't known but should
be ok much of the time.

Signed-off-by: Ian Kent <raven@themaw.net>
---
 CHANGELOG           |    1 +
 configure           |   32 +++++++++++++++++++++++++-------
 configure.in        |   24 +++++++++++++++++-------
 include/config.h.in |    3 +++
 lib/mounts.c        |    6 ++++--
 5 files changed, 50 insertions(+), 16 deletions(-)

--- autofs-5.0.7.orig/CHANGELOG
+++ autofs-5.0.7/CHANGELOG
@@ -249,6 +249,7 @@
 - fix invalid reference in remount_active_mount().
 - increase worker thread per-thread stack size.
 - limit getgrgid_r() buffer size.
+- add congigure option for limiting getgrgid_r() stack usage.
 
 25/07/2012 autofs-5.0.7
 =======================
--- autofs-5.0.7.orig/configure
+++ autofs-5.0.7/configure
@@ -743,6 +743,7 @@ enable_ext_env
 enable_mount_locking
 enable_forced_shutdown
 enable_ignore_busy
+enable_limit_getgrgid_size
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1360,13 +1361,14 @@ Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-sloppy-mount   enable the use of the -s option to mount
-  --disable-ext-env	  disable search in environment for substitution variable
-  --disable-mount-locking disable use of locking when spawning mount command
-  --enable-force-shutdown enable USR1 signal to force unlink umount of any
-			  busy mounts during shutdown
-  --enable-ignore-busy	  enable exit without umounting busy mounts during
-			  shutdown
+  --enable-sloppy-mount         enable the use of the -s option to mount
+  --disable-ext-env	        disable search in environment for substitution variable
+  --disable-mount-locking       disable use of locking when spawning mount command
+  --enable-force-shutdown       enable USR1 signal to force unlink umount of any
+			        busy mounts during shutdown
+  --enable-ignore-busy	        enable exit without umounting busy mounts during
+			        shutdown
+  --enable-limit-getgrgid-size	enable limit stack use of getgrgid_r()
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -5662,6 +5664,22 @@ $as_echo "#define ENABLE_IGNORE_BUSY_MOU
 
 fi
 
+#
+# Enable exit, ignoring busy mounts.
+#
+# Check whether --enable-limit-getgrgid-size was given.
+if test "${enable_limit_getgrgid_size+set}" = set; then :
+  enableval=$enable_limit_getgrgid_size;
+else
+  enableval=no
+fi
+
+if test x$enable_limit_getgrgid_size = xyes -o x$enableval = xyes; then
+
+$as_echo "#define ENABLE_LIMIT_GETGRGID_SIZE 1" >>confdefs.h
+
+fi
+
 #
 # Write Makefile.conf and include/config.h
 #
--- autofs-5.0.7.orig/configure.in
+++ autofs-5.0.7/configure.in
@@ -158,7 +158,7 @@ AC_SUBST(sssldir)
 # good for portability
 #
 AC_ARG_ENABLE(sloppy-mount,
-[  --enable-sloppy-mount   enable the use of the -s option to mount],,
+[  --enable-sloppy-mount         enable the use of the -s option to mount],,
 	enable_sloppy_mount=auto)
 if test x$enable_sloppy_mount = xauto; then
 	AF_SLOPPY_MOUNT()
@@ -344,7 +344,7 @@ AC_SUBST(DAEMON_LDFLAGS)
 # Enable ability to access value in external env variable
 #
 AC_ARG_ENABLE(ext-env,
-[  --disable-ext-env	  disable search in environment for substitution variable],,
+[  --disable-ext-env	        disable search in environment for substitution variable],,
 	enableval=yes)
 if test x$enable_ext_env = xyes -o x$enableval = xyes; then
         AC_DEFINE(ENABLE_EXT_ENV, 1, [leave this alone])
@@ -354,7 +354,7 @@ fi
 # Disable use of locking when spawning mount command
 #
 AC_ARG_ENABLE(mount-locking,
-[  --disable-mount-locking disable use of locking when spawning mount command],,
+[  --disable-mount-locking       disable use of locking when spawning mount command],,
 	enableval=yes)
 if test x$enable_mount_locking = xyes -o x$enableval = xyes; then
 	AC_DEFINE(ENABLE_MOUNT_LOCKING, 1, [Disable use of locking when spawning mount command])
@@ -364,8 +364,8 @@ fi
 # Enable forced shutdown on USR1 signal (unlink umounts all mounts).
 #
 AC_ARG_ENABLE(forced-shutdown,
-[  --enable-force-shutdown enable USR1 signal to force unlink umount of any
-			  busy mounts during shutdown],,
+[  --enable-force-shutdown       enable USR1 signal to force unlink umount of any
+			        busy mounts during shutdown],,
 	enableval=no)
 if test x$enable_forced_shutdown = xyes -o x$enableval = xyes; then
 	AC_DEFINE(ENABLE_FORCED_SHUTDOWN, 1, [Enable forced shutdown on USR1 signal])
@@ -375,14 +375,24 @@ fi
 # Enable exit, ignoring busy mounts.
 #
 AC_ARG_ENABLE(ignore-busy,
-[  --enable-ignore-busy	  enable exit without umounting busy mounts during
-			  shutdown],,
+[  --enable-ignore-busy	        enable exit without umounting busy mounts during
+			        shutdown],,
 	enableval=no)
 if test x$enable_ignore_busy_mounts = xyes -o x$enableval = xyes; then
 	AC_DEFINE(ENABLE_IGNORE_BUSY_MOUNTS, 1, [Enable exit, ignoring busy mounts])
 fi
 
 #
+# Enable exit, ignoring busy mounts.
+#
+AC_ARG_ENABLE(limit-getgrgid-size,
+[  --enable-limit-getgrgid-size	enable limit stack use of getgrgid_r()],,
+	enableval=no)
+if test x$enable_limit_getgrgid_size = xyes -o x$enableval = xyes; then
+	AC_DEFINE(ENABLE_LIMIT_GETGRGID_SIZE, 1, [Enable limit stack use of getgrgid_r()])
+fi
+
+#
 # Write Makefile.conf and include/config.h
 #
 AC_CONFIG_HEADER(include/config.h)
--- autofs-5.0.7.orig/include/config.h.in
+++ autofs-5.0.7/include/config.h.in
@@ -9,6 +9,9 @@
 /* Enable exit, ignoring busy mounts */
 #undef ENABLE_IGNORE_BUSY_MOUNTS
 
+/* Enable limit stack use of getgrgid_r() */
+#undef ENABLE_LIMIT_GETGRGID_SIZE
+
 /* Disable use of locking when spawning mount command */
 #undef ENABLE_MOUNT_LOCKING
 
--- autofs-5.0.7.orig/lib/mounts.c
+++ autofs-5.0.7/lib/mounts.c
@@ -1507,8 +1507,10 @@ void set_tsd_user_vars(unsigned int logo
 
 	gr_tmp = NULL;
 	status = ERANGE;
+#ifdef ENABLE_LIMIT_GETGRGID_SIZE
 	if (!maxgrpbuf)
 		maxgrpbuf = detached_thread_stack_size * 0.9;
+#endif
 
 	/* If getting the group name fails go on without it. It's
 	 * used to set an environment variable for program maps
@@ -1532,9 +1534,9 @@ void set_tsd_user_vars(unsigned int logo
 		tmplen += grplen;
 
 		/* Don't tempt glibc to alloca() larger than is (likely)
-		 * available on the stack.
+		 * available on the stack if limit-getgrgid-size is enabled.
 		 */
-		if (tmplen < maxgrpbuf)
+		if (!maxgrpbuf || (tmplen < maxgrpbuf))
 			continue;
 
 		/* Add a message so we know this happened */