Blame SOURCES/autofs-5.1.2-add-congigure-option-for-limiting-getgrgid_r-stack-usage.patch

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