*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
+
+#include <config.h>
#include "config-parser-common.h"
#include "config-parser.h"
#include "test.h"
#include "selinux.h"
#include <dbus/dbus-list.h>
#include <dbus/dbus-internals.h>
+#include <dbus/dbus-sysdeps.h>
#include <string.h>
typedef enum
parser->limits.max_incoming_bytes = _DBUS_ONE_MEGABYTE * 127;
parser->limits.max_outgoing_bytes = _DBUS_ONE_MEGABYTE * 127;
parser->limits.max_message_size = _DBUS_ONE_MEGABYTE * 32;
+
+ /* We set relatively conservative values here since due to the
+ way SCM_RIGHTS works we need to preallocate an array for the
+ 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;
/* Making this long means the user has to wait longer for an error
* message if something screws up, but making it too short means
return TRUE;
}
- else if (element_type == ELEMENT_TYPE)
+ else if (element_type == ELEMENT_CONFIGTYPE)
{
if (!check_no_attributes (parser, "type", attribute_names, attribute_values, error))
return FALSE;
- if (push_element (parser, ELEMENT_TYPE) == NULL)
+ if (push_element (parser, ELEMENT_CONFIGTYPE) == NULL)
{
BUS_SET_OOM (error);
return FALSE;
* Pretty sure the below stuff is broken, FIXME think about it more.
*/
- if (((send_interface && send_error) ||
- (send_interface && receive_interface) ||
- (send_interface && receive_member) ||
- (send_interface && receive_error) ||
- (send_interface && receive_sender) ||
- (send_interface && receive_requested_reply) ||
- (send_interface && own) ||
- (send_interface && user) ||
- (send_interface && group)) ||
-
- ((send_member && send_error) ||
- (send_member && receive_interface) ||
- (send_member && receive_member) ||
- (send_member && receive_error) ||
- (send_member && receive_sender) ||
- (send_member && receive_requested_reply) ||
- (send_member && own) ||
- (send_member && user) ||
- (send_member && group)) ||
-
- ((send_error && receive_interface) ||
- (send_error && receive_member) ||
- (send_error && receive_error) ||
- (send_error && receive_sender) ||
- (send_error && receive_requested_reply) ||
- (send_error && own) ||
- (send_error && user) ||
- (send_error && group)) ||
-
- ((send_destination && receive_interface) ||
- (send_destination && receive_member) ||
- (send_destination && receive_error) ||
- (send_destination && receive_sender) ||
- (send_destination && receive_requested_reply) ||
- (send_destination && own) ||
- (send_destination && user) ||
- (send_destination && group)) ||
-
- ((send_type && receive_interface) ||
- (send_type && receive_member) ||
- (send_type && receive_error) ||
- (send_type && receive_sender) ||
- (send_type && receive_requested_reply) ||
- (send_type && own) ||
- (send_type && user) ||
- (send_type && group)) ||
-
- ((send_path && receive_interface) ||
- (send_path && receive_member) ||
- (send_path && receive_error) ||
- (send_path && receive_sender) ||
- (send_path && receive_requested_reply) ||
- (send_path && own) ||
- (send_path && user) ||
- (send_path && group)) ||
-
- ((send_requested_reply && receive_interface) ||
- (send_requested_reply && receive_member) ||
- (send_requested_reply && receive_error) ||
- (send_requested_reply && receive_sender) ||
- (send_requested_reply && receive_requested_reply) ||
- (send_requested_reply && own) ||
- (send_requested_reply && user) ||
- (send_requested_reply && group)) ||
-
- ((receive_interface && receive_error) ||
- (receive_interface && own) ||
- (receive_interface && user) ||
- (receive_interface && group)) ||
-
- ((receive_member && receive_error) ||
- (receive_member && own) ||
- (receive_member && user) ||
- (receive_member && group)) ||
-
- ((receive_error && own) ||
- (receive_error && user) ||
- (receive_error && group)) ||
-
- ((eavesdrop && own) ||
- (eavesdrop && user) ||
- (eavesdrop && group)) ||
-
- ((receive_requested_reply && own) ||
- (receive_requested_reply && user) ||
- (receive_requested_reply && group)) ||
-
- ((own && user) ||
- (own && group)) ||
-
- ((user && group)))
+ if ((send_interface && (send_error ||
+ receive_interface ||
+ receive_member ||
+ receive_error ||
+ receive_sender ||
+ receive_requested_reply ||
+ own ||
+ user ||
+ group)) ||
+
+ (send_member && (send_error ||
+ receive_interface ||
+ receive_member ||
+ receive_error ||
+ receive_sender ||
+ receive_requested_reply ||
+ own ||
+ user ||
+ group)) ||
+
+ (send_error && (receive_interface ||
+ receive_member ||
+ receive_error ||
+ receive_sender ||
+ receive_requested_reply ||
+ own ||
+ user ||
+ group)) ||
+
+ (send_destination && (receive_interface ||
+ receive_member ||
+ receive_error ||
+ receive_sender ||
+ receive_requested_reply ||
+ own ||
+ user ||
+ group)) ||
+
+ (send_type && (receive_interface ||
+ receive_member ||
+ receive_error ||
+ receive_sender ||
+ receive_requested_reply ||
+ own ||
+ user ||
+ group)) ||
+
+ (send_path && (receive_interface ||
+ receive_member ||
+ receive_error ||
+ receive_sender ||
+ receive_requested_reply ||
+ own ||
+ user ||
+ group)) ||
+
+ (send_requested_reply && (receive_interface ||
+ receive_member ||
+ receive_error ||
+ receive_sender ||
+ receive_requested_reply ||
+ own ||
+ user ||
+ group)) ||
+
+ (receive_interface && (receive_error ||
+ own ||
+ user ||
+ group)) ||
+
+ (receive_member && (receive_error ||
+ own ||
+ user ||
+ group)) ||
+
+ (receive_error && (own ||
+ user ||
+ group)) ||
+
+ (eavesdrop && (own ||
+ user ||
+ group)) ||
+
+ (receive_requested_reply && (own ||
+ user ||
+ group)) ||
+
+ (own && (user || group)) ||
+
+ (user && group))
{
dbus_set_error (error, DBUS_ERROR_FAILED,
"Invalid combination of attributes on element <%s>",
must_be_positive = TRUE;
parser->limits.max_incoming_bytes = value;
}
+ else if (strcmp (name, "max_incoming_unix_fds") == 0)
+ {
+ must_be_positive = TRUE;
+ parser->limits.max_incoming_unix_fds = value;
+ }
else if (strcmp (name, "max_outgoing_bytes") == 0)
{
must_be_positive = TRUE;
parser->limits.max_outgoing_bytes = value;
}
+ else if (strcmp (name, "max_outgoing_unix_fds") == 0)
+ {
+ must_be_positive = TRUE;
+ parser->limits.max_outgoing_unix_fds = value;
+ }
else if (strcmp (name, "max_message_size") == 0)
{
must_be_positive = TRUE;
parser->limits.max_message_size = value;
}
+ else if (strcmp (name, "max_message_unix_fds") == 0)
+ {
+ must_be_positive = TRUE;
+ parser->limits.max_message_unix_fds = value;
+ }
else if (strcmp (name, "service_start_timeout") == 0)
{
must_be_positive = TRUE;
case ELEMENT_INCLUDE:
case ELEMENT_USER:
- case ELEMENT_TYPE:
+ case ELEMENT_CONFIGTYPE:
case ELEMENT_LISTEN:
case ELEMENT_PIDFILE:
case ELEMENT_AUTH:
{
if (!include_file (parser, &full_path, TRUE, error))
{
- _dbus_string_free (&full_path);
- goto failed;
+ if (dbus_error_is_set (error))
+ {
+ /* We log to syslog unconditionally here, because this is
+ * the configuration parser, so we don't yet know whether
+ * this bus is going to want to write to syslog! (There's
+ * also some layer inversion going on, if we want to use
+ * the bus context.) */
+ _dbus_system_log (DBUS_SYSTEM_LOG_INFO,
+ "Encountered error '%s' while parsing '%s'\n",
+ error->message,
+ _dbus_string_get_const_data (&full_path));
+ dbus_error_free (error);
+ }
}
}
}
break;
- case ELEMENT_TYPE:
+ case ELEMENT_CONFIGTYPE:
{
char *s;
{
return
(a->max_incoming_bytes == b->max_incoming_bytes
+ || a->max_incoming_unix_fds == b->max_incoming_unix_fds
|| a->max_outgoing_bytes == b->max_outgoing_bytes
+ || a->max_outgoing_unix_fds == b->max_outgoing_unix_fds
|| a->max_message_size == b->max_message_size
+ || a->max_message_unix_fds == b->max_message_unix_fds
|| a->activation_timeout == b->activation_timeout
|| a->auth_timeout == b->auth_timeout
|| a->max_completed_connections == b->max_completed_connections
static const char *test_session_service_dir_matches[] =
{
#ifdef DBUS_UNIX
+ "/testhome/foo/.testlocal/testshare/dbus-1/services",
"/testusr/testlocal/testshare/dbus-1/services",
"/testusr/testshare/dbus-1/services",
-#endif
DBUS_DATADIR"/dbus-1/services",
-#ifdef DBUS_UNIX
- "/testhome/foo/.testlocal/testshare/dbus-1/services",
+#endif
+/* will be filled in test_default_session_servicedirs() */
+#ifdef DBUS_WIN
+ NULL,
+ NULL,
#endif
NULL
};
DBusList *dirs;
DBusList *link;
DBusString progs;
- const char *common_progs;
int i;
+#ifdef DBUS_WIN
+ const char *common_progs;
+ char buffer[1024];
+
+ if (_dbus_get_install_root(buffer, sizeof(buffer)))
+ {
+ strcat(buffer,DBUS_DATADIR);
+ strcat(buffer,"/dbus-1/services");
+ test_session_service_dir_matches[0] = buffer;
+ }
+#endif
+
/* On Unix we don't actually use this variable, but it's easier to handle the
* deallocation if we always allocate it, whether needed or not */
if (!_dbus_string_init (&progs))
_dbus_assert_not_reached ("OOM allocating progs");
- common_progs = _dbus_getenv ("CommonProgramFiles");
#ifndef DBUS_UNIX
+ common_progs = _dbus_getenv ("CommonProgramFiles");
+
if (common_progs)
{
if (!_dbus_string_append (&progs, common_progs))
static const char *test_system_service_dir_matches[] =
{
#ifdef DBUS_UNIX
- "/testusr/testlocal/testshare/dbus-1/system-services",
- "/testusr/testshare/dbus-1/system-services",
+ "/usr/local/share/dbus-1/system-services",
+ "/usr/share/dbus-1/system-services",
#endif
DBUS_DATADIR"/dbus-1/system-services",
+#ifdef DBUS_UNIX
+ "/lib/dbus-1/system-services",
+#endif
+
+#ifdef DBUS_WIN
+ NULL,
+#endif
NULL
};
DBusList *dirs;
DBusList *link;
DBusString progs;
+#ifndef DBUS_UNIX
const char *common_progs;
+#endif
int i;
/* On Unix we don't actually use this variable, but it's easier to handle the
if (!_dbus_string_init (&progs))
_dbus_assert_not_reached ("OOM allocating progs");
- common_progs = _dbus_getenv ("CommonProgramFiles");
#ifndef DBUS_UNIX
+ common_progs = _dbus_getenv ("CommonProgramFiles");
+
if (common_progs)
{
if (!_dbus_string_append (&progs, common_progs))
if (!test_default_session_servicedirs())
return FALSE;
+#ifdef DBUS_WIN
+ printf("default system service dir skipped\n");
+#else
if (!test_default_system_servicedirs())
return FALSE;
+#endif
if (!process_test_valid_subdir (test_data_dir, "valid-config-files", VALID))
return FALSE;