You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
7.0 KiB
196 lines
7.0 KiB
7 years ago
|
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 */
|