Set default maximum number of Unix fds according to OS

QNX has an arbitrary limit to the number of file descriptors
which may be passed in a message, which is smaller than the
current default.  This patch therefore changes the default from
a hardcoded constant to a macro, which is determined at configure
time by looking at the host operating system.

[This reduces the limit from 4096 (session)/1024 (system) to 128 fds
per message on QNX, and 1024 fds per message on other operating systems.
I think the reduced session bus limit on other OSs is a reasonable change
too, given that the default hard/soft ulimits in Linux are only 4096/1024
fds per process. -smcv]

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=61176
Reviewed-by: Simon McVittie <simon.mcvittie.collabora.co.uk>
This commit is contained in:
Matt Fischer 2013-02-20 15:23:42 -06:00 committed by Simon McVittie
parent 2ab900b678
commit 977293549d
5 changed files with 18 additions and 5 deletions

View file

@ -420,9 +420,9 @@ bus_config_parser_new (const DBusString *basedir,
maximum number of file descriptors we can receive. Picking a
high value here thus translates directly to more memory
allocation. */
parser->limits.max_incoming_unix_fds = 1024*4;
parser->limits.max_outgoing_unix_fds = 1024*4;
parser->limits.max_message_unix_fds = 1024;
parser->limits.max_incoming_unix_fds = DBUS_DEFAULT_MESSAGE_UNIX_FDS*4;
parser->limits.max_outgoing_unix_fds = DBUS_DEFAULT_MESSAGE_UNIX_FDS*4;
parser->limits.max_message_unix_fds = DBUS_DEFAULT_MESSAGE_UNIX_FDS;
/* Making this long means the user has to wait longer for an error
* message if something screws up, but making it too short means

View file

@ -49,7 +49,7 @@
<limit name="max_outgoing_bytes">1000000000</limit>
<limit name="max_outgoing_unix_fds">250000000</limit>
<limit name="max_message_size">1000000000</limit>
<limit name="max_message_unix_fds">4096</limit>
<limit name="max_message_unix_fds">@default_message_unix_fds@</limit>
<limit name="service_start_timeout">120000</limit>
<limit name="auth_timeout">240000</limit>
<limit name="max_completed_connections">100000</limit>

View file

@ -82,6 +82,8 @@
# define DBUS_ENABLE_X11_AUTOLAUNCH 1
#endif
#define DBUS_DEFAULT_MESSAGE_UNIX_FDS 1024
#define _DBUS_VA_COPY_ASSIGN(a1,a2) { a1 = a2; }
#cmakedefine DBUS_VA_COPY_FUNC

View file

@ -1296,6 +1296,17 @@ if test x$with_valgrind != xno; then
AC_DEFINE([WITH_VALGRIND], [1], [Define to add Valgrind instrumentation])
fi
# Determine maximum number of Unix fds which may be passed
AS_CASE([$host_os],
[*qnx*],
[default_message_unix_fds=256],
[*],
[default_message_unix_fds=1024])
AC_DEFINE_UNQUOTED([DBUS_DEFAULT_MESSAGE_UNIX_FDS],
[$default_message_unix_fds],
[Default for dbus_connection_get_max_message_unix_fds()])
AC_SUBST([default_message_unix_fds])
#### Set up final flags
LIBDBUS_LIBS="$THREAD_LIBS $NETWORK_libs"
AC_SUBST([LIBDBUS_LIBS])

View file

@ -3802,7 +3802,7 @@ _dbus_message_loader_new (void)
SCM_RIGHTS works we need to preallocate an fd array of the maximum
number of unix fds we want to receive in advance. A
try-and-reallocate loop is not possible. */
loader->max_message_unix_fds = 1024;
loader->max_message_unix_fds = DBUS_DEFAULT_MESSAGE_UNIX_FDS;
if (!_dbus_string_init (&loader->data))
{