actually upload new source, delete unused patches;
This commit is contained in:
parent
ad3a4388b3
commit
3bc596950b
@ -1 +1 @@
|
|||||||
dbus-1.2.16.tar.gz
|
dbus-1.2.18.tar.gz
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
diff -urN dbus-1.2.1/bus/system.conf.in dbus-1.2.1.b/bus/system.conf.in
|
|
||||||
--- dbus-1.2.1/bus/system.conf.in 2008-04-04 11:24:08.000000000 -0400
|
|
||||||
+++ dbus-1.2.1.b/bus/system.conf.in 2008-07-17 13:56:26.000000000 -0400
|
|
||||||
@@ -17,6 +17,9 @@
|
|
||||||
<!-- Run as special user -->
|
|
||||||
<user>@DBUS_USER@</user>
|
|
||||||
|
|
||||||
+ <!-- Up the max timeout -->
|
|
||||||
+ <limit name="reply_timeout">21600000</limit>
|
|
||||||
+
|
|
||||||
<!-- Fork into daemon mode -->
|
|
||||||
<fork/>
|
|
||||||
|
|
@ -1,230 +0,0 @@
|
|||||||
diff -urp dbus-1.2.16.orig/bus/selinux.c dbus-1.2.16/bus/selinux.c
|
|
||||||
--- dbus-1.2.16.orig/bus/selinux.c 2009-10-03 08:46:51.000000000 -0400
|
|
||||||
+++ dbus-1.2.16/bus/selinux.c 2009-10-03 08:47:26.000000000 -0400
|
|
||||||
@@ -45,6 +45,7 @@
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#ifdef HAVE_LIBAUDIT
|
|
||||||
+#include <cap-ng.h>
|
|
||||||
#include <libaudit.h>
|
|
||||||
#endif /* HAVE_LIBAUDIT */
|
|
||||||
#endif /* HAVE_SELINUX */
|
|
||||||
@@ -143,13 +144,17 @@ log_callback (const char *fmt, ...)
|
|
||||||
#ifdef HAVE_LIBAUDIT
|
|
||||||
if (audit_fd >= 0)
|
|
||||||
{
|
|
||||||
- char buf[PATH_MAX*2];
|
|
||||||
+ capng_get_caps_process();
|
|
||||||
+ if (capng_have_capability(CAPNG_EFFECTIVE, CAP_AUDIT_WRITE))
|
|
||||||
+ {
|
|
||||||
+ char buf[PATH_MAX*2];
|
|
||||||
|
|
||||||
- /* FIXME: need to change this to show real user */
|
|
||||||
- vsnprintf(buf, sizeof(buf), fmt, ap);
|
|
||||||
- audit_log_user_avc_message(audit_fd, AUDIT_USER_AVC, buf, NULL, NULL,
|
|
||||||
+ /* FIXME: need to change this to show real user */
|
|
||||||
+ vsnprintf(buf, sizeof(buf), fmt, ap);
|
|
||||||
+ audit_log_user_avc_message(audit_fd, AUDIT_USER_AVC, buf, NULL, NULL,
|
|
||||||
NULL, getuid());
|
|
||||||
- return;
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
#endif /* HAVE_LIBAUDIT */
|
|
||||||
|
|
||||||
diff -urp dbus-1.2.16.orig/configure.in dbus-1.2.16/configure.in
|
|
||||||
--- dbus-1.2.16.orig/configure.in 2009-10-03 08:46:51.000000000 -0400
|
|
||||||
+++ dbus-1.2.16/configure.in 2009-10-03 08:47:26.000000000 -0400
|
|
||||||
@@ -844,7 +844,7 @@ else
|
|
||||||
AC_CHECK_LIB(audit, audit_log_user_avc_message,
|
|
||||||
have_libaudit=yes, have_libaudit=no)
|
|
||||||
if test x$have_libaudit = xyes ; then
|
|
||||||
- AC_CHECK_LIB(cap, cap_set_proc,
|
|
||||||
+ AC_CHECK_LIB(cap-ng, capng_clear,
|
|
||||||
have_libaudit=yes, have_libaudit=no)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
@@ -853,7 +853,7 @@ AM_CONDITIONAL(HAVE_LIBAUDIT, test x$hav
|
|
||||||
|
|
||||||
if test x$have_libaudit = xyes ; then
|
|
||||||
SELINUX_LIBS="$SELINUX_LIBS -laudit"
|
|
||||||
- LIBS="-lcap $LIBS"
|
|
||||||
+ LIBS="-lcap-ng $LIBS"
|
|
||||||
AC_DEFINE(HAVE_LIBAUDIT,1,[audit daemon SELinux support])
|
|
||||||
fi
|
|
||||||
|
|
||||||
diff -urp dbus-1.2.16.orig/dbus/dbus-sysdeps-util-unix.c dbus-1.2.16/dbus/dbus-sysdeps-util-unix.c
|
|
||||||
--- dbus-1.2.16.orig/dbus/dbus-sysdeps-util-unix.c 2009-10-03 08:46:51.000000000 -0400
|
|
||||||
+++ dbus-1.2.16/dbus/dbus-sysdeps-util-unix.c 2009-10-03 08:52:14.000000000 -0400
|
|
||||||
@@ -46,8 +46,7 @@
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
#ifdef HAVE_LIBAUDIT
|
|
||||||
-#include <sys/prctl.h>
|
|
||||||
-#include <sys/capability.h>
|
|
||||||
+#include <cap-ng.h>
|
|
||||||
#include <libaudit.h>
|
|
||||||
#endif /* HAVE_LIBAUDIT */
|
|
||||||
|
|
||||||
@@ -323,10 +322,6 @@ _dbus_change_to_daemon_user (const char
|
|
||||||
dbus_uid_t uid;
|
|
||||||
dbus_gid_t gid;
|
|
||||||
DBusString u;
|
|
||||||
-#ifdef HAVE_LIBAUDIT
|
|
||||||
- dbus_bool_t we_were_root;
|
|
||||||
- cap_t new_caps;
|
|
||||||
-#endif
|
|
||||||
|
|
||||||
_dbus_string_init_const (&u, user);
|
|
||||||
|
|
||||||
@@ -339,123 +334,49 @@ _dbus_change_to_daemon_user (const char
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBAUDIT
|
|
||||||
- we_were_root = _dbus_geteuid () == 0;
|
|
||||||
- new_caps = NULL;
|
|
||||||
- /* have a tmp set of caps that we use to transition to the usr/grp dbus should
|
|
||||||
- * run as ... doesn't really help. But keeps people happy.
|
|
||||||
- */
|
|
||||||
-
|
|
||||||
- if (we_were_root)
|
|
||||||
+ /* If we were root */
|
|
||||||
+ if (_dbus_geteuid () == 0)
|
|
||||||
{
|
|
||||||
- cap_value_t new_cap_list[] = { CAP_AUDIT_WRITE };
|
|
||||||
- cap_value_t tmp_cap_list[] = { CAP_AUDIT_WRITE, CAP_SETUID, CAP_SETGID };
|
|
||||||
- cap_t tmp_caps = cap_init();
|
|
||||||
-
|
|
||||||
- if (!tmp_caps || !(new_caps = cap_init ()))
|
|
||||||
- {
|
|
||||||
- dbus_set_error (error, DBUS_ERROR_FAILED,
|
|
||||||
- "Failed to initialize drop of capabilities: %s\n",
|
|
||||||
- _dbus_strerror (errno));
|
|
||||||
-
|
|
||||||
- if (tmp_caps)
|
|
||||||
- cap_free (tmp_caps);
|
|
||||||
+ int rc;
|
|
||||||
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- /* assume these work... */
|
|
||||||
- cap_set_flag (new_caps, CAP_PERMITTED, 1, new_cap_list, CAP_SET);
|
|
||||||
- cap_set_flag (new_caps, CAP_EFFECTIVE, 1, new_cap_list, CAP_SET);
|
|
||||||
- cap_set_flag (tmp_caps, CAP_PERMITTED, 3, tmp_cap_list, CAP_SET);
|
|
||||||
- cap_set_flag (tmp_caps, CAP_EFFECTIVE, 3, tmp_cap_list, CAP_SET);
|
|
||||||
-
|
|
||||||
- if (prctl (PR_SET_KEEPCAPS, 1, 0, 0, 0) == -1)
|
|
||||||
+ capng_clear(CAPNG_SELECT_BOTH);
|
|
||||||
+ capng_update(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
|
|
||||||
+ CAP_AUDIT_WRITE);
|
|
||||||
+ rc = capng_change_id(uid, gid, 0);
|
|
||||||
+ if (rc)
|
|
||||||
{
|
|
||||||
- dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
- "Failed to set keep-capabilities: %s\n",
|
|
||||||
- _dbus_strerror (errno));
|
|
||||||
- cap_free (tmp_caps);
|
|
||||||
- goto fail;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- if (cap_set_proc (tmp_caps) == -1)
|
|
||||||
- {
|
|
||||||
- dbus_set_error (error, DBUS_ERROR_FAILED,
|
|
||||||
+ switch (rc) {
|
|
||||||
+ default:
|
|
||||||
+ dbus_set_error (error, DBUS_ERROR_FAILED,
|
|
||||||
"Failed to drop capabilities: %s\n",
|
|
||||||
_dbus_strerror (errno));
|
|
||||||
- cap_free (tmp_caps);
|
|
||||||
- goto fail;
|
|
||||||
- }
|
|
||||||
- cap_free (tmp_caps);
|
|
||||||
- }
|
|
||||||
-#endif /* HAVE_LIBAUDIT */
|
|
||||||
-
|
|
||||||
- /* setgroups() only works if we are a privileged process,
|
|
||||||
- * so we don't return error on failure; the only possible
|
|
||||||
- * failure is that we don't have perms to do it.
|
|
||||||
- *
|
|
||||||
- * not sure this is right, maybe if setuid()
|
|
||||||
- * is going to work then setgroups() should also work.
|
|
||||||
- */
|
|
||||||
- if (setgroups (0, NULL) < 0)
|
|
||||||
- _dbus_warn ("Failed to drop supplementary groups: %s\n",
|
|
||||||
- _dbus_strerror (errno));
|
|
||||||
-
|
|
||||||
- /* Set GID first, or the setuid may remove our permission
|
|
||||||
- * to change the GID
|
|
||||||
- */
|
|
||||||
- if (setgid (gid) < 0)
|
|
||||||
- {
|
|
||||||
- dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
+ break;
|
|
||||||
+ case -4:
|
|
||||||
+ dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
"Failed to set GID to %lu: %s", gid,
|
|
||||||
_dbus_strerror (errno));
|
|
||||||
- goto fail;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- if (setuid (uid) < 0)
|
|
||||||
- {
|
|
||||||
- dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
+ break;
|
|
||||||
+ case -5:
|
|
||||||
+ _dbus_warn ("Failed to drop supplementary groups: %s\n",
|
|
||||||
+ _dbus_strerror (errno));
|
|
||||||
+ break;
|
|
||||||
+ case -6:
|
|
||||||
+ dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
"Failed to set UID to %lu: %s", uid,
|
|
||||||
_dbus_strerror (errno));
|
|
||||||
- goto fail;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
-#ifdef HAVE_LIBAUDIT
|
|
||||||
- if (we_were_root)
|
|
||||||
- {
|
|
||||||
- if (cap_set_proc (new_caps))
|
|
||||||
- {
|
|
||||||
- dbus_set_error (error, DBUS_ERROR_FAILED,
|
|
||||||
- "Failed to drop capabilities: %s\n",
|
|
||||||
- _dbus_strerror (errno));
|
|
||||||
- goto fail;
|
|
||||||
- }
|
|
||||||
- cap_free (new_caps);
|
|
||||||
-
|
|
||||||
- /* should always work, if it did above */
|
|
||||||
- if (prctl (PR_SET_KEEPCAPS, 0, 0, 0, 0) == -1)
|
|
||||||
- {
|
|
||||||
- dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
+ break;
|
|
||||||
+ case -7:
|
|
||||||
+ dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
"Failed to unset keep-capabilities: %s\n",
|
|
||||||
_dbus_strerror (errno));
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-#endif
|
|
||||||
+#endif /* HAVE_LIBAUDIT */
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
-
|
|
||||||
- fail:
|
|
||||||
-#ifdef HAVE_LIBAUDIT
|
|
||||||
- if (!we_were_root)
|
|
||||||
- {
|
|
||||||
- /* should always work, if it did above */
|
|
||||||
- prctl (PR_SET_KEEPCAPS, 0, 0, 0, 0);
|
|
||||||
- cap_free (new_caps);
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
- return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
@ -1,190 +0,0 @@
|
|||||||
From cde84d96106bd005a98d064fe392301ba1f87743 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Colin Walters <walters@verbum.org>
|
|
||||||
Date: Wed, 10 Dec 2008 14:17:02 -0500
|
|
||||||
Subject: [PATCH] Add syslog of security denials and configuration file reloads
|
|
||||||
|
|
||||||
We need to start logging denials so that they become more easily trackable
|
|
||||||
and debuggable.
|
|
||||||
---
|
|
||||||
bus/bus.c | 41 +++++++++++++++++++++++++++++++----------
|
|
||||||
bus/main.c | 1 +
|
|
||||||
dbus/dbus-sysdeps-unix.c | 1 -
|
|
||||||
dbus/dbus-sysdeps-util-unix.c | 38 ++++++++++++++++++++++++++++++++++++++
|
|
||||||
dbus/dbus-sysdeps.h | 3 +++
|
|
||||||
5 files changed, 73 insertions(+), 11 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/bus/bus.c b/bus/bus.c
|
|
||||||
index 42cc295..8d7879a 100644
|
|
||||||
--- a/bus/bus.c
|
|
||||||
+++ b/bus/bus.c
|
|
||||||
@@ -834,6 +834,7 @@ bus_context_reload_config (BusContext *context,
|
|
||||||
}
|
|
||||||
ret = TRUE;
|
|
||||||
|
|
||||||
+ _dbus_log_info ("Reloaded configuration\n");
|
|
||||||
failed:
|
|
||||||
if (parser != NULL)
|
|
||||||
bus_config_parser_unref (parser);
|
|
||||||
@@ -1315,13 +1316,13 @@ bus_context_check_security_policy (BusContext *context,
|
|
||||||
message))
|
|
||||||
{
|
|
||||||
const char *dest;
|
|
||||||
+ const char *msg = "A security policy in place prevents this sender "
|
|
||||||
+ "from sending this message to this recipient, "
|
|
||||||
+ "see message bus configuration file (rejected message "
|
|
||||||
+ "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\")";
|
|
||||||
|
|
||||||
dest = dbus_message_get_destination (message);
|
|
||||||
- dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
|
|
||||||
- "A security policy in place prevents this sender "
|
|
||||||
- "from sending this message to this recipient, "
|
|
||||||
- "see message bus configuration file (rejected message "
|
|
||||||
- "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\")",
|
|
||||||
+ dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, msg,
|
|
||||||
dbus_message_get_interface (message) ?
|
|
||||||
dbus_message_get_interface (message) : "(unset)",
|
|
||||||
dbus_message_get_member (message) ?
|
|
||||||
@@ -1329,6 +1330,15 @@ bus_context_check_security_policy (BusContext *context,
|
|
||||||
dbus_message_get_error_name (message) ?
|
|
||||||
dbus_message_get_error_name (message) : "(unset)",
|
|
||||||
dest ? dest : DBUS_SERVICE_DBUS);
|
|
||||||
+ /* Needs to be duplicated to avoid calling malloc and having to handle OOM */
|
|
||||||
+ _dbus_log_security (msg,
|
|
||||||
+ dbus_message_get_interface (message) ?
|
|
||||||
+ dbus_message_get_interface (message) : "(unset)",
|
|
||||||
+ dbus_message_get_member (message) ?
|
|
||||||
+ dbus_message_get_member (message) : "(unset)",
|
|
||||||
+ dbus_message_get_error_name (message) ?
|
|
||||||
+ dbus_message_get_error_name (message) : "(unset)",
|
|
||||||
+ dest ? dest : DBUS_SERVICE_DBUS);
|
|
||||||
_dbus_verbose ("security policy disallowing message due to sender policy\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
@@ -1341,14 +1351,14 @@ bus_context_check_security_policy (BusContext *context,
|
|
||||||
addressed_recipient, proposed_recipient,
|
|
||||||
message))
|
|
||||||
{
|
|
||||||
+ const char *msg = "A security policy in place prevents this recipient "
|
|
||||||
+ "from receiving this message from this sender, "
|
|
||||||
+ "see message bus configuration file (rejected message "
|
|
||||||
+ "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\" reply serial %u requested_reply=%d)";
|
|
||||||
const char *dest;
|
|
||||||
|
|
||||||
dest = dbus_message_get_destination (message);
|
|
||||||
- dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
|
|
||||||
- "A security policy in place prevents this recipient "
|
|
||||||
- "from receiving this message from this sender, "
|
|
||||||
- "see message bus configuration file (rejected message "
|
|
||||||
- "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\" reply serial %u requested_reply=%d)",
|
|
||||||
+ dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, msg,
|
|
||||||
dbus_message_get_interface (message) ?
|
|
||||||
dbus_message_get_interface (message) : "(unset)",
|
|
||||||
dbus_message_get_member (message) ?
|
|
||||||
@@ -1358,6 +1368,17 @@ bus_context_check_security_policy (BusContext *context,
|
|
||||||
dest ? dest : DBUS_SERVICE_DBUS,
|
|
||||||
dbus_message_get_reply_serial (message),
|
|
||||||
requested_reply);
|
|
||||||
+ /* Needs to be duplicated to avoid calling malloc and having to handle OOM */
|
|
||||||
+ _dbus_log_security (error, DBUS_ERROR_ACCESS_DENIED, msg,
|
|
||||||
+ dbus_message_get_interface (message) ?
|
|
||||||
+ dbus_message_get_interface (message) : "(unset)",
|
|
||||||
+ dbus_message_get_member (message) ?
|
|
||||||
+ dbus_message_get_member (message) : "(unset)",
|
|
||||||
+ dbus_message_get_error_name (message) ?
|
|
||||||
+ dbus_message_get_error_name (message) : "(unset)",
|
|
||||||
+ dest ? dest : DBUS_SERVICE_DBUS,
|
|
||||||
+ dbus_message_get_reply_serial (message),
|
|
||||||
+ requested_reply);
|
|
||||||
_dbus_verbose ("security policy disallowing message due to recipient policy\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
diff --git a/bus/main.c b/bus/main.c
|
|
||||||
index 51538fe..23ebb3e 100644
|
|
||||||
--- a/bus/main.c
|
|
||||||
+++ b/bus/main.c
|
|
||||||
@@ -178,6 +178,7 @@ handle_reload_watch (DBusWatch *watch,
|
|
||||||
dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY));
|
|
||||||
_dbus_warn ("Unable to reload configuration: %s\n",
|
|
||||||
error.message);
|
|
||||||
+ _dbus_log_info ("Unable to reload configuration: %s\n", error.message);
|
|
||||||
dbus_error_free (&error);
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c
|
|
||||||
index fb40d5a..01516a1 100644
|
|
||||||
--- a/dbus/dbus-sysdeps-unix.c
|
|
||||||
+++ b/dbus/dbus-sysdeps-unix.c
|
|
||||||
@@ -2786,7 +2786,6 @@ _dbus_full_duplex_pipe (int *fd1,
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
-
|
|
||||||
/**
|
|
||||||
* Measure the length of the given format string and arguments,
|
|
||||||
* not including the terminating nul.
|
|
||||||
diff --git a/dbus/dbus-sysdeps-util-unix.c b/dbus/dbus-sysdeps-util-unix.c
|
|
||||||
index d8718c2..0b0badd 100644
|
|
||||||
--- a/dbus/dbus-sysdeps-util-unix.c
|
|
||||||
+++ b/dbus/dbus-sysdeps-util-unix.c
|
|
||||||
@@ -456,6 +456,44 @@ _dbus_change_to_daemon_user (const char *user,
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * Log an informative message. Intended for use primarily by
|
|
||||||
+ * the system bus.
|
|
||||||
+ *
|
|
||||||
+ * @param msg a printf-style format string
|
|
||||||
+ * @param args arguments for the format string
|
|
||||||
+ */
|
|
||||||
+void
|
|
||||||
+_dbus_log_info (const char *msg, ...)
|
|
||||||
+{
|
|
||||||
+ va_list args;
|
|
||||||
+
|
|
||||||
+ va_start (args, msg);
|
|
||||||
+
|
|
||||||
+ vsyslog (LOG_DAEMON|LOG_NOTICE, msg, args);
|
|
||||||
+
|
|
||||||
+ va_end (args);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/**
|
|
||||||
+ * Log a security-related message. Intended for use primarily by
|
|
||||||
+ * the system bus.
|
|
||||||
+ *
|
|
||||||
+ * @param msg a printf-style format string
|
|
||||||
+ * @param args arguments for the format string
|
|
||||||
+ */
|
|
||||||
+void
|
|
||||||
+_dbus_log_security (const char *msg, ...)
|
|
||||||
+{
|
|
||||||
+ va_list args;
|
|
||||||
+
|
|
||||||
+ va_start (args, msg);
|
|
||||||
+
|
|
||||||
+ vsyslog (LOG_AUTH|LOG_NOTICE, msg, args);
|
|
||||||
+
|
|
||||||
+ va_end (args);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/** Installs a UNIX signal handler
|
|
||||||
*
|
|
||||||
* @param sig the signal to handle
|
|
||||||
diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h
|
|
||||||
index 469b5e5..1a67d0c 100644
|
|
||||||
--- a/dbus/dbus-sysdeps.h
|
|
||||||
+++ b/dbus/dbus-sysdeps.h
|
|
||||||
@@ -421,6 +421,9 @@ void _dbus_set_signal_handler (int sig,
|
|
||||||
dbus_bool_t _dbus_user_at_console (const char *username,
|
|
||||||
DBusError *error);
|
|
||||||
|
|
||||||
+void _dbus_log_info (const char *msg, ...);
|
|
||||||
+void _dbus_log_security (const char *msg, ...);
|
|
||||||
+
|
|
||||||
/* Define DBUS_VA_COPY() to do the right thing for copying va_list variables.
|
|
||||||
* config.h may have already defined DBUS_VA_COPY as va_copy or __va_copy.
|
|
||||||
*/
|
|
||||||
--
|
|
||||||
1.6.0.4
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
diff -u -r dbus-1.2.14/bus/dir-watch-inotify.c dbus-1.2.14.fd-leak/bus/dir-watch-inotify.c
|
|
||||||
--- dbus-1.2.14/bus/dir-watch-inotify.c 2009-04-17 15:45:29.000000000 -0400
|
|
||||||
+++ dbus-1.2.14.fd-leak/bus/dir-watch-inotify.c 2009-06-27 18:38:54.966881736 -0400
|
|
||||||
@@ -98,7 +98,11 @@
|
|
||||||
_dbus_assert (dir != NULL);
|
|
||||||
|
|
||||||
if (inotify_fd == -1) {
|
|
||||||
+#ifdef HAVE_INOTIFY_INIT1
|
|
||||||
+ inotify_fd = inotify_init1 (IN_CLOEXEC);
|
|
||||||
+#else
|
|
||||||
inotify_fd = inotify_init ();
|
|
||||||
+#endif
|
|
||||||
if (inotify_fd <= 0) {
|
|
||||||
_dbus_warn ("Cannot initialize inotify\n");
|
|
||||||
goto out;
|
|
||||||
diff -u -r dbus-1.2.14/configure.in dbus-1.2.14.fd-leak/configure.in
|
|
||||||
--- dbus-1.2.14/configure.in 2009-05-06 12:51:19.000000000 -0400
|
|
||||||
+++ dbus-1.2.14.fd-leak/configure.in 2009-06-27 18:37:10.787645299 -0400
|
|
||||||
@@ -983,7 +983,7 @@
|
|
||||||
dnl check if inotify backend is enabled
|
|
||||||
if test x$have_inotify = xyes; then
|
|
||||||
AC_DEFINE(DBUS_BUS_ENABLE_INOTIFY,1,[Use inotify])
|
|
||||||
-
|
|
||||||
+ AC_CHECK_FUNCS(inotify_init1)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL(DBUS_BUS_ENABLE_INOTIFY, test x$have_inotify = xyes)
|
|
@ -1,202 +0,0 @@
|
|||||||
--- dbus-1.2.16.orig/bus/selinux.c 2009-11-01 09:58:22.000000000 -0500
|
|
||||||
+++ dbus-1.2.16.orig/bus/selinux.c 2009-11-01 11:30:45.000000000 -0500
|
|
||||||
@@ -1015,3 +1015,74 @@ bus_selinux_shutdown (void)
|
|
||||||
#endif /* HAVE_SELINUX */
|
|
||||||
}
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * Changes the user and group the bus is running as.
|
|
||||||
+ *
|
|
||||||
+ * @param user the user to become
|
|
||||||
+ * @param error return location for errors
|
|
||||||
+ * @returns #FALSE on failure
|
|
||||||
+ */
|
|
||||||
+dbus_bool_t
|
|
||||||
+_dbus_change_to_daemon_user (const char *user,
|
|
||||||
+ DBusError *error)
|
|
||||||
+{
|
|
||||||
+ dbus_uid_t uid;
|
|
||||||
+ dbus_gid_t gid;
|
|
||||||
+ DBusString u;
|
|
||||||
+
|
|
||||||
+ _dbus_string_init_const (&u, user);
|
|
||||||
+
|
|
||||||
+ if (!_dbus_get_user_id_and_primary_group (&u, &uid, &gid))
|
|
||||||
+ {
|
|
||||||
+ dbus_set_error (error, DBUS_ERROR_FAILED,
|
|
||||||
+ "User '%s' does not appear to exist?",
|
|
||||||
+ user);
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+#ifdef HAVE_LIBAUDIT
|
|
||||||
+ /* If we were root */
|
|
||||||
+ if (_dbus_geteuid () == 0)
|
|
||||||
+ {
|
|
||||||
+ int rc;
|
|
||||||
+
|
|
||||||
+ capng_clear(CAPNG_SELECT_BOTH);
|
|
||||||
+ capng_update(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
|
|
||||||
+ CAP_AUDIT_WRITE);
|
|
||||||
+ rc = capng_change_id(uid, gid, 0);
|
|
||||||
+ if (rc)
|
|
||||||
+ {
|
|
||||||
+ switch (rc) {
|
|
||||||
+ default:
|
|
||||||
+ dbus_set_error (error, DBUS_ERROR_FAILED,
|
|
||||||
+ "Failed to drop capabilities: %s\n",
|
|
||||||
+ _dbus_strerror (errno));
|
|
||||||
+ break;
|
|
||||||
+ case -4:
|
|
||||||
+ dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
+ "Failed to set GID to %lu: %s", gid,
|
|
||||||
+ _dbus_strerror (errno));
|
|
||||||
+ break;
|
|
||||||
+ case -5:
|
|
||||||
+ _dbus_warn ("Failed to drop supplementary groups: %s\n",
|
|
||||||
+ _dbus_strerror (errno));
|
|
||||||
+ break;
|
|
||||||
+ case -6:
|
|
||||||
+ dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
+ "Failed to set UID to %lu: %s", uid,
|
|
||||||
+ _dbus_strerror (errno));
|
|
||||||
+ break;
|
|
||||||
+ case -7:
|
|
||||||
+ dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
+ "Failed to unset keep-capabilities: %s\n",
|
|
||||||
+ _dbus_strerror (errno));
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+#endif /* HAVE_LIBAUDIT */
|
|
||||||
+
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
--- dbus-1.2.16.orig/bus/selinux.h 2009-11-01 09:58:22.000000000 -0500
|
|
||||||
+++ dbus-1.2.16.orig/bus/selinux.h 2009-11-01 11:33:15.000000000 -0500
|
|
||||||
@@ -68,5 +68,7 @@ BusSELinuxID* bus_selinux_init_connectio
|
|
||||||
|
|
||||||
|
|
||||||
void bus_selinux_audit_init(void);
|
|
||||||
+dbus_bool_t _dbus_change_to_daemon_user (const char *user,
|
|
||||||
+ DBusError *error);
|
|
||||||
|
|
||||||
#endif /* BUS_SELINUX_H */
|
|
||||||
--- dbus-1.2.16.orig/configure.in 2009-11-01 09:58:22.000000000 -0500
|
|
||||||
+++ dbus-1.2.16.orig/configure.in 2009-11-01 11:30:45.000000000 -0500
|
|
||||||
@@ -852,8 +852,7 @@ fi
|
|
||||||
AM_CONDITIONAL(HAVE_LIBAUDIT, test x$have_libaudit = xyes)
|
|
||||||
|
|
||||||
if test x$have_libaudit = xyes ; then
|
|
||||||
- SELINUX_LIBS="$SELINUX_LIBS -laudit"
|
|
||||||
- LIBS="-lcap-ng $LIBS"
|
|
||||||
+ SELINUX_LIBS="$SELINUX_LIBS -laudit -lcap-ng"
|
|
||||||
AC_DEFINE(HAVE_LIBAUDIT,1,[audit daemon SELinux support])
|
|
||||||
fi
|
|
||||||
|
|
||||||
--- dbus-1.2.16.orig/dbus/dbus-sysdeps.h 2009-11-01 09:58:22.000000000 -0500
|
|
||||||
+++ dbus-1.2.16.orig/dbus/dbus-sysdeps.h 2009-11-01 11:33:08.000000000 -0500
|
|
||||||
@@ -418,8 +418,6 @@ dbus_bool_t _dbus_become_daemon (const
|
|
||||||
dbus_bool_t keep_umask);
|
|
||||||
|
|
||||||
dbus_bool_t _dbus_verify_daemon_user (const char *user);
|
|
||||||
-dbus_bool_t _dbus_change_to_daemon_user (const char *user,
|
|
||||||
- DBusError *error);
|
|
||||||
|
|
||||||
dbus_bool_t _dbus_write_pid_to_file_and_pipe (const DBusString *pidfile,
|
|
||||||
DBusPipe *print_pid_pipe,
|
|
||||||
--- dbus-1.2.16.orig/dbus/dbus-sysdeps-util-unix.c 2009-11-01 09:58:22.000000000 -0500
|
|
||||||
+++ dbus-1.2.16.orig/dbus/dbus-sysdeps-util-unix.c 2009-11-01 11:30:45.000000000 -0500
|
|
||||||
@@ -45,10 +45,6 @@
|
|
||||||
#include <sys/un.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
-#ifdef HAVE_LIBAUDIT
|
|
||||||
-#include <cap-ng.h>
|
|
||||||
-#include <libaudit.h>
|
|
||||||
-#endif /* HAVE_LIBAUDIT */
|
|
||||||
|
|
||||||
#ifdef HAVE_SYS_SYSLIMITS_H
|
|
||||||
#include <sys/syslimits.h>
|
|
||||||
@@ -308,77 +304,6 @@ _dbus_verify_daemon_user (const char *us
|
|
||||||
return _dbus_get_user_id_and_primary_group (&u, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
-/**
|
|
||||||
- * Changes the user and group the bus is running as.
|
|
||||||
- *
|
|
||||||
- * @param user the user to become
|
|
||||||
- * @param error return location for errors
|
|
||||||
- * @returns #FALSE on failure
|
|
||||||
- */
|
|
||||||
-dbus_bool_t
|
|
||||||
-_dbus_change_to_daemon_user (const char *user,
|
|
||||||
- DBusError *error)
|
|
||||||
-{
|
|
||||||
- dbus_uid_t uid;
|
|
||||||
- dbus_gid_t gid;
|
|
||||||
- DBusString u;
|
|
||||||
-
|
|
||||||
- _dbus_string_init_const (&u, user);
|
|
||||||
-
|
|
||||||
- if (!_dbus_get_user_id_and_primary_group (&u, &uid, &gid))
|
|
||||||
- {
|
|
||||||
- dbus_set_error (error, DBUS_ERROR_FAILED,
|
|
||||||
- "User '%s' does not appear to exist?",
|
|
||||||
- user);
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
-#ifdef HAVE_LIBAUDIT
|
|
||||||
- /* If we were root */
|
|
||||||
- if (_dbus_geteuid () == 0)
|
|
||||||
- {
|
|
||||||
- int rc;
|
|
||||||
-
|
|
||||||
- capng_clear(CAPNG_SELECT_BOTH);
|
|
||||||
- capng_update(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
|
|
||||||
- CAP_AUDIT_WRITE);
|
|
||||||
- rc = capng_change_id(uid, gid, 0);
|
|
||||||
- if (rc)
|
|
||||||
- {
|
|
||||||
- switch (rc) {
|
|
||||||
- default:
|
|
||||||
- dbus_set_error (error, DBUS_ERROR_FAILED,
|
|
||||||
- "Failed to drop capabilities: %s\n",
|
|
||||||
- _dbus_strerror (errno));
|
|
||||||
- break;
|
|
||||||
- case -4:
|
|
||||||
- dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
- "Failed to set GID to %lu: %s", gid,
|
|
||||||
- _dbus_strerror (errno));
|
|
||||||
- break;
|
|
||||||
- case -5:
|
|
||||||
- _dbus_warn ("Failed to drop supplementary groups: %s\n",
|
|
||||||
- _dbus_strerror (errno));
|
|
||||||
- break;
|
|
||||||
- case -6:
|
|
||||||
- dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
- "Failed to set UID to %lu: %s", uid,
|
|
||||||
- _dbus_strerror (errno));
|
|
||||||
- break;
|
|
||||||
- case -7:
|
|
||||||
- dbus_set_error (error, _dbus_error_from_errno (errno),
|
|
||||||
- "Failed to unset keep-capabilities: %s\n",
|
|
||||||
- _dbus_strerror (errno));
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
-#endif /* HAVE_LIBAUDIT */
|
|
||||||
-
|
|
||||||
- return TRUE;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
void
|
|
||||||
_dbus_init_system_log (void)
|
|
||||||
{
|
|
||||||
|
|
@ -1,310 +0,0 @@
|
|||||||
From 949a64b127a32a3e5a4ce4278773f18e290c44c2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Colin Walters <walters@verbum.org>
|
|
||||||
Date: Mon, 14 Dec 2009 23:12:24 +0000
|
|
||||||
Subject: Ignore exit code zero from activated services
|
|
||||||
|
|
||||||
A variety of system components have migrated from legacy init into DBus
|
|
||||||
service activation. Many of these system components "daemonize", which
|
|
||||||
involves forking. The DBus activation system treated an exit as an
|
|
||||||
activation failure, assuming that the child process which grabbed the
|
|
||||||
DBus name didn't run first.
|
|
||||||
|
|
||||||
While we're in here, also differentiate in this code path between the
|
|
||||||
servicehelper (system) versus direct activation (session) paths. In
|
|
||||||
the session activation path our error message mentioned a helper
|
|
||||||
process which was confusing, since none was involved.
|
|
||||||
|
|
||||||
Based on a patch and debugging research from Ray Strode <rstrode@redhat.com>
|
|
||||||
---
|
|
||||||
diff --git a/bus/activation.c b/bus/activation.c
|
|
||||||
index 782ffed..00caac2 100644
|
|
||||||
--- a/bus/activation.c
|
|
||||||
+++ b/bus/activation.c
|
|
||||||
@@ -1212,8 +1212,8 @@ pending_activation_failed (BusPendingActivation *pending_activation,
|
|
||||||
* Depending on the exit code of the helper, set the error accordingly
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
-handle_activation_exit_error (int exit_code,
|
|
||||||
- DBusError *error)
|
|
||||||
+handle_servicehelper_exit_error (int exit_code,
|
|
||||||
+ DBusError *error)
|
|
||||||
{
|
|
||||||
switch (exit_code)
|
|
||||||
{
|
|
||||||
@@ -1268,13 +1268,24 @@ babysitter_watch_callback (DBusWatch *watch,
|
|
||||||
BusPendingActivation *pending_activation = data;
|
|
||||||
dbus_bool_t retval;
|
|
||||||
DBusBabysitter *babysitter;
|
|
||||||
+ dbus_bool_t uses_servicehelper;
|
|
||||||
|
|
||||||
babysitter = pending_activation->babysitter;
|
|
||||||
-
|
|
||||||
+
|
|
||||||
_dbus_babysitter_ref (babysitter);
|
|
||||||
-
|
|
||||||
+
|
|
||||||
retval = dbus_watch_handle (watch, condition);
|
|
||||||
|
|
||||||
+ /* There are two major cases here; are we the system bus or the session? Here this
|
|
||||||
+ * is distinguished by whether or not we use a setuid helper launcher. With the launch helper,
|
|
||||||
+ * some process exit codes are meaningful, processed by handle_servicehelper_exit_error.
|
|
||||||
+ *
|
|
||||||
+ * In both cases though, just ignore when a process exits with status 0; it's possible for
|
|
||||||
+ * a program to (misguidedly) "daemonize", and that appears to us as an exit. This closes a race
|
|
||||||
+ * condition between this code and the child process claiming the bus name.
|
|
||||||
+ */
|
|
||||||
+ uses_servicehelper = bus_context_get_servicehelper (pending_activation->activation->context) != NULL;
|
|
||||||
+
|
|
||||||
/* FIXME this is broken in the same way that
|
|
||||||
* connection watches used to be; there should be
|
|
||||||
* a separate callback for status change, instead
|
|
||||||
@@ -1284,43 +1295,59 @@ babysitter_watch_callback (DBusWatch *watch,
|
|
||||||
* Fixing this lets us move dbus_watch_handle
|
|
||||||
* calls into dbus-mainloop.c
|
|
||||||
*/
|
|
||||||
-
|
|
||||||
if (_dbus_babysitter_get_child_exited (babysitter))
|
|
||||||
{
|
|
||||||
DBusError error;
|
|
||||||
DBusHashIter iter;
|
|
||||||
-
|
|
||||||
+ dbus_bool_t activation_failed;
|
|
||||||
+ int exit_code = 0;
|
|
||||||
+
|
|
||||||
dbus_error_init (&error);
|
|
||||||
+
|
|
||||||
_dbus_babysitter_set_child_exit_error (babysitter, &error);
|
|
||||||
|
|
||||||
- /* refine the error code if we got an exit code */
|
|
||||||
- if (dbus_error_has_name (&error, DBUS_ERROR_SPAWN_CHILD_EXITED))
|
|
||||||
- {
|
|
||||||
- int exit_code = 0;
|
|
||||||
- if (_dbus_babysitter_get_child_exit_status (babysitter, &exit_code))
|
|
||||||
+ /* Explicitly check for SPAWN_CHILD_EXITED to avoid overwriting an
|
|
||||||
+ * exec error */
|
|
||||||
+ if (dbus_error_has_name (&error, DBUS_ERROR_SPAWN_CHILD_EXITED)
|
|
||||||
+ && _dbus_babysitter_get_child_exit_status (babysitter, &exit_code))
|
|
||||||
+ {
|
|
||||||
+ activation_failed = exit_code != 0;
|
|
||||||
+
|
|
||||||
+ dbus_error_free(&error);
|
|
||||||
+
|
|
||||||
+ if (activation_failed)
|
|
||||||
{
|
|
||||||
- dbus_error_free (&error);
|
|
||||||
- handle_activation_exit_error (exit_code, &error);
|
|
||||||
+ if (uses_servicehelper)
|
|
||||||
+ handle_servicehelper_exit_error (exit_code, &error);
|
|
||||||
+ else
|
|
||||||
+ _dbus_babysitter_set_child_exit_error (babysitter, &error);
|
|
||||||
}
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- /* Destroy all pending activations with the same exec */
|
|
||||||
- _dbus_hash_iter_init (pending_activation->activation->pending_activations,
|
|
||||||
- &iter);
|
|
||||||
- while (_dbus_hash_iter_next (&iter))
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
{
|
|
||||||
- BusPendingActivation *p = _dbus_hash_iter_get_value (&iter);
|
|
||||||
-
|
|
||||||
- if (p != pending_activation && strcmp (p->exec, pending_activation->exec) == 0)
|
|
||||||
- pending_activation_failed (p, &error);
|
|
||||||
+ activation_failed = TRUE;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
- /* Destroys the pending activation */
|
|
||||||
- pending_activation_failed (pending_activation, &error);
|
|
||||||
|
|
||||||
- dbus_error_free (&error);
|
|
||||||
+ if (activation_failed)
|
|
||||||
+ {
|
|
||||||
+ /* Destroy all pending activations with the same exec */
|
|
||||||
+ _dbus_hash_iter_init (pending_activation->activation->pending_activations,
|
|
||||||
+ &iter);
|
|
||||||
+ while (_dbus_hash_iter_next (&iter))
|
|
||||||
+ {
|
|
||||||
+ BusPendingActivation *p = _dbus_hash_iter_get_value (&iter);
|
|
||||||
+
|
|
||||||
+ if (p != pending_activation && strcmp (p->exec, pending_activation->exec) == 0)
|
|
||||||
+ pending_activation_failed (p, &error);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Destroys the pending activation */
|
|
||||||
+ pending_activation_failed (pending_activation, &error);
|
|
||||||
+
|
|
||||||
+ dbus_error_free (&error);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
-
|
|
||||||
+
|
|
||||||
_dbus_babysitter_unref (babysitter);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
diff --git a/configure.in b/configure.in
|
|
||||||
index 7ef6632..1f2c896 100644
|
|
||||||
--- a/configure.in
|
|
||||||
+++ b/configure.in
|
|
||||||
@@ -1499,6 +1499,7 @@ test/data/valid-config-files-system/debug-allow-all-pass.conf
|
|
||||||
test/data/valid-config-files-system/debug-allow-all-fail.conf
|
|
||||||
test/data/valid-service-files/org.freedesktop.DBus.TestSuite.PrivServer.service
|
|
||||||
test/data/valid-service-files/org.freedesktop.DBus.TestSuiteEchoService.service
|
|
||||||
+test/data/valid-service-files/org.freedesktop.DBus.TestSuiteForkingEchoService.service
|
|
||||||
test/data/valid-service-files/org.freedesktop.DBus.TestSuiteSegfaultService.service
|
|
||||||
test/data/valid-service-files/org.freedesktop.DBus.TestSuiteShellEchoServiceSuccess.service
|
|
||||||
test/data/valid-service-files/org.freedesktop.DBus.TestSuiteShellEchoServiceFail.service
|
|
||||||
diff --git a/test/data/valid-service-files/org.freedesktop.DBus.TestSuiteForkingEchoService.service.in b/test/data/valid-service-files/org.freedesktop.DBus.TestSuiteForkingEchoService.service.in
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..49fcac3
|
|
||||||
--- a/dev/null
|
|
||||||
+++ b/test/data/valid-service-files/org.freedesktop.DBus.TestSuiteForkingEchoService.service.in
|
|
||||||
@@ -0,0 +1,3 @@
|
|
||||||
+[D-BUS Service]
|
|
||||||
+Name=org.freedesktop.DBus.TestSuiteForkingEchoService
|
|
||||||
+Exec=@TEST_SERVICE_BINARY@ org.freedesktop.DBus.TestSuiteForkingEchoService fork
|
|
||||||
diff --git a/test/name-test/Makefile.am b/test/name-test/Makefile.am
|
|
||||||
index 1c73b87..d8e72d1 100644
|
|
||||||
--- a/test/name-test/Makefile.am
|
|
||||||
+++ b/test/name-test/Makefile.am
|
|
||||||
@@ -10,7 +10,7 @@ else
|
|
||||||
TESTS=
|
|
||||||
endif
|
|
||||||
|
|
||||||
-EXTRA_DIST=run-test.sh run-test-systemserver.sh test-wait-for-echo.py
|
|
||||||
+EXTRA_DIST=run-test.sh run-test-systemserver.sh test-wait-for-echo.py test-activation-forking.py
|
|
||||||
|
|
||||||
if DBUS_BUILD_TESTS
|
|
||||||
|
|
||||||
diff --git a/test/name-test/run-test.sh b/test/name-test/run-test.sh
|
|
||||||
index fba4558..4eb2425 100755
|
|
||||||
--- a/test/name-test/run-test.sh
|
|
||||||
+++ b/test/name-test/run-test.sh
|
|
||||||
@@ -50,3 +50,9 @@ ${DBUS_TOP_BUILDDIR}/libtool --mode=execute $DEBUG $DBUS_TOP_BUILDDIR/test/name-
|
|
||||||
|
|
||||||
echo "running test-shutdown"
|
|
||||||
${DBUS_TOP_BUILDDIR}/libtool --mode=execute $DEBUG $DBUS_TOP_BUILDDIR/test/name-test/test-shutdown || die "test-shutdown failed"
|
|
||||||
+
|
|
||||||
+echo "running test activation forking"
|
|
||||||
+if ! python $DBUS_TOP_SRCDIR/test/name-test/test-activation-forking.py; then
|
|
||||||
+ echo "Failed test-activation-forking"
|
|
||||||
+ exit 1
|
|
||||||
+fi
|
|
||||||
diff --git a/test/name-test/test-activation-forking.py b/test/name-test/test-activation-forking.py
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..0d82075
|
|
||||||
--- a/dev/null
|
|
||||||
+++ b/test/name-test/test-activation-forking.py
|
|
||||||
@@ -0,0 +1,60 @@
|
|
||||||
+#!/usr/bin/env python
|
|
||||||
+
|
|
||||||
+import os,sys
|
|
||||||
+
|
|
||||||
+try:
|
|
||||||
+ import gobject
|
|
||||||
+ import dbus
|
|
||||||
+ import dbus.mainloop.glib
|
|
||||||
+except:
|
|
||||||
+ print "Failed import, aborting test"
|
|
||||||
+ sys.exit(0)
|
|
||||||
+
|
|
||||||
+dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
|
|
||||||
+loop = gobject.MainLoop()
|
|
||||||
+
|
|
||||||
+exitcode = 0
|
|
||||||
+
|
|
||||||
+bus = dbus.SessionBus()
|
|
||||||
+bus_iface = dbus.Interface(bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus'), 'org.freedesktop.DBus')
|
|
||||||
+
|
|
||||||
+o = bus.get_object('org.freedesktop.DBus.TestSuiteForkingEchoService', '/org/freedesktop/TestSuite')
|
|
||||||
+i = dbus.Interface(o, 'org.freedesktop.TestSuite')
|
|
||||||
+
|
|
||||||
+# Start it up
|
|
||||||
+reply = i.Echo("hello world")
|
|
||||||
+print "TestSuiteForkingEchoService initial reply OK"
|
|
||||||
+
|
|
||||||
+def ignore(*args, **kwargs):
|
|
||||||
+ pass
|
|
||||||
+
|
|
||||||
+# Now monitor for exits, when that happens, start it up again.
|
|
||||||
+# The goal here is to try to hit any race conditions in activation.
|
|
||||||
+counter = 0
|
|
||||||
+def on_forking_echo_owner_changed(name, old, new):
|
|
||||||
+ global counter
|
|
||||||
+ global o
|
|
||||||
+ global i
|
|
||||||
+ if counter > 10:
|
|
||||||
+ print "Activated 10 times OK, TestSuiteForkingEchoService pass"
|
|
||||||
+ loop.quit()
|
|
||||||
+ return
|
|
||||||
+ counter += 1
|
|
||||||
+ if new == '':
|
|
||||||
+ o = bus.get_object('org.freedesktop.DBus.TestSuiteForkingEchoService', '/org/freedesktop/TestSuite')
|
|
||||||
+ i = dbus.Interface(o, 'org.freedesktop.TestSuite')
|
|
||||||
+ i.Echo("counter %r" % counter)
|
|
||||||
+ i.Exit(reply_handler=ignore, error_handler=ignore)
|
|
||||||
+
|
|
||||||
+bus_iface.connect_to_signal('NameOwnerChanged', on_forking_echo_owner_changed, arg0='org.freedesktop.DBus.TestSuiteForkingEchoService')
|
|
||||||
+
|
|
||||||
+i.Exit(reply_handler=ignore, error_handler=ignore)
|
|
||||||
+
|
|
||||||
+def check_counter():
|
|
||||||
+ if counter == 0:
|
|
||||||
+ print "Failed to get NameOwnerChanged for TestSuiteForkingEchoService"
|
|
||||||
+ sys.exit(1)
|
|
||||||
+gobject.timeout_add(15000, check_counter)
|
|
||||||
+
|
|
||||||
+loop.run()
|
|
||||||
+sys.exit(0)
|
|
||||||
diff --git a/test/test-service.c b/test/test-service.c
|
|
||||||
index c9f5839..a57bf9c 100644
|
|
||||||
--- a/test/test-service.c
|
|
||||||
+++ b/test/test-service.c
|
|
||||||
@@ -398,7 +398,33 @@ main (int argc,
|
|
||||||
DBusError error;
|
|
||||||
int result;
|
|
||||||
DBusConnection *connection;
|
|
||||||
-
|
|
||||||
+ const char *name;
|
|
||||||
+ dbus_bool_t do_fork;
|
|
||||||
+
|
|
||||||
+ if (argc != 3)
|
|
||||||
+ {
|
|
||||||
+ name = "org.freedesktop.DBus.TestSuiteEchoService";
|
|
||||||
+ do_fork = FALSE;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ name = argv[1];
|
|
||||||
+ do_fork = strcmp (argv[2], "fork") == 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* The bare minimum for simulating a program "daemonizing"; the intent
|
|
||||||
+ * is to test services which move from being legacy init scripts to
|
|
||||||
+ * activated services.
|
|
||||||
+ * https://bugzilla.redhat.com/show_bug.cgi?id=545267
|
|
||||||
+ */
|
|
||||||
+ if (do_fork)
|
|
||||||
+ {
|
|
||||||
+ pid_t pid = fork ();
|
|
||||||
+ if (pid != 0)
|
|
||||||
+ exit (0);
|
|
||||||
+ sleep (1);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
dbus_error_init (&error);
|
|
||||||
connection = dbus_bus_get (DBUS_BUS_STARTER, &error);
|
|
||||||
if (connection == NULL)
|
|
||||||
@@ -433,8 +459,8 @@ main (int argc,
|
|
||||||
if (d != (void*) 0xdeadbeef)
|
|
||||||
die ("dbus_connection_get_object_path_data() doesn't seem to work right\n");
|
|
||||||
}
|
|
||||||
-
|
|
||||||
- result = dbus_bus_request_name (connection, "org.freedesktop.DBus.TestSuiteEchoService",
|
|
||||||
+
|
|
||||||
+ result = dbus_bus_request_name (connection, name,
|
|
||||||
0, &error);
|
|
||||||
if (dbus_error_is_set (&error))
|
|
||||||
{
|
|
||||||
--
|
|
||||||
cgit v0.8.3-6-g21f6
|
|
@ -1,12 +0,0 @@
|
|||||||
diff -up dbus-1.2.16/bus/bus.c.policy-leak dbus-1.2.16/bus/bus.c
|
|
||||||
--- dbus-1.2.16/bus/bus.c.policy-leak 2009-12-17 19:18:50.966795963 -0500
|
|
||||||
+++ dbus-1.2.16/bus/bus.c 2009-12-17 19:17:36.023796405 -0500
|
|
||||||
@@ -438,6 +438,8 @@ process_config_every_time (BusContext
|
|
||||||
/* get our limits and timeout lengths */
|
|
||||||
bus_config_parser_get_limits (parser, &context->limits);
|
|
||||||
|
|
||||||
+ if (context->policy)
|
|
||||||
+ bus_policy_unref (context->policy);
|
|
||||||
context->policy = bus_config_parser_steal_policy (parser);
|
|
||||||
_dbus_assert (context->policy != NULL);
|
|
||||||
|
|
@ -1,215 +0,0 @@
|
|||||||
--- dbus-1.2.16/bus/dir-watch-inotify.c 2009-07-14 13:06:31.000000000 -0400
|
|
||||||
+++ hacked/bus/dir-watch-inotify.c 2009-12-18 00:46:05.524818800 -0500
|
|
||||||
@@ -34,6 +34,7 @@
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include <dbus/dbus-internals.h>
|
|
||||||
+#include <dbus/dbus-list.h>
|
|
||||||
#include <dbus/dbus-watch.h>
|
|
||||||
#include "dir-watch.h"
|
|
||||||
|
|
||||||
@@ -43,6 +44,7 @@
|
|
||||||
|
|
||||||
/* use a static array to avoid handling OOM */
|
|
||||||
static int wds[MAX_DIRS_TO_WATCH];
|
|
||||||
+static char *dirs[MAX_DIRS_TO_WATCH];
|
|
||||||
static int num_wds = 0;
|
|
||||||
static int inotify_fd = -1;
|
|
||||||
static DBusWatch *watch = NULL;
|
|
||||||
@@ -90,12 +92,10 @@
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
-void
|
|
||||||
-bus_watch_directory (const char *dir, BusContext *context)
|
|
||||||
+static int
|
|
||||||
+_init_inotify (BusContext *context)
|
|
||||||
{
|
|
||||||
- int wd;
|
|
||||||
-
|
|
||||||
- _dbus_assert (dir != NULL);
|
|
||||||
+ int ret = 0;
|
|
||||||
|
|
||||||
if (inotify_fd == -1) {
|
|
||||||
#ifdef HAVE_INOTIFY_INIT1
|
|
||||||
@@ -112,22 +112,38 @@
|
|
||||||
watch = _dbus_watch_new (inotify_fd, DBUS_WATCH_READABLE, TRUE,
|
|
||||||
_handle_inotify_watch, NULL, NULL);
|
|
||||||
|
|
||||||
- if (watch == NULL)
|
|
||||||
- {
|
|
||||||
- _dbus_warn ("Unable to create inotify watch\n");
|
|
||||||
- goto out;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- if (!_dbus_loop_add_watch (loop, watch, _inotify_watch_callback,
|
|
||||||
- NULL, NULL))
|
|
||||||
- {
|
|
||||||
- _dbus_warn ("Unable to add reload watch to main loop");
|
|
||||||
- _dbus_watch_unref (watch);
|
|
||||||
- watch = NULL;
|
|
||||||
- goto out;
|
|
||||||
- }
|
|
||||||
+ if (watch == NULL)
|
|
||||||
+ {
|
|
||||||
+ _dbus_warn ("Unable to create inotify watch\n");
|
|
||||||
+ goto out;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!_dbus_loop_add_watch (loop, watch, _inotify_watch_callback,
|
|
||||||
+ NULL, NULL))
|
|
||||||
+ {
|
|
||||||
+ _dbus_warn ("Unable to add reload watch to main loop");
|
|
||||||
+ _dbus_watch_unref (watch);
|
|
||||||
+ watch = NULL;
|
|
||||||
+ goto out;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
+ ret = 1;
|
|
||||||
+
|
|
||||||
+out:
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
+bus_watch_directory (const char *dir, BusContext *context)
|
|
||||||
+{
|
|
||||||
+ int wd;
|
|
||||||
+
|
|
||||||
+ _dbus_assert (dir != NULL);
|
|
||||||
+
|
|
||||||
+ if (!_init_inotify (context))
|
|
||||||
+ goto out;
|
|
||||||
+
|
|
||||||
if (num_wds >= MAX_DIRS_TO_WATCH )
|
|
||||||
{
|
|
||||||
_dbus_warn ("Cannot watch config directory '%s'. Already watching %d directories\n", dir, MAX_DIRS_TO_WATCH);
|
|
||||||
@@ -141,6 +157,7 @@
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ dirs[num_wds] = strdup (dir);
|
|
||||||
wds[num_wds++] = wd;
|
|
||||||
_dbus_verbose ("Added watch on config directory '%s'\n", dir);
|
|
||||||
|
|
||||||
@@ -148,7 +165,84 @@
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
-void
|
|
||||||
+void
|
|
||||||
+bus_set_watched_dirs (BusContext *context, DBusList **directories)
|
|
||||||
+{
|
|
||||||
+ static int new_wds[MAX_DIRS_TO_WATCH];
|
|
||||||
+ static char *new_dirs[MAX_DIRS_TO_WATCH];
|
|
||||||
+ DBusList *link;
|
|
||||||
+ int i, j, wd;
|
|
||||||
+
|
|
||||||
+ if (!_init_inotify (context))
|
|
||||||
+ goto out;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < MAX_DIRS_TO_WATCH; i++)
|
|
||||||
+ {
|
|
||||||
+ new_wds[i] = -1;
|
|
||||||
+ new_dirs[i] = NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ i = 0;
|
|
||||||
+ link = _dbus_list_get_first_link (directories);
|
|
||||||
+ while (link != NULL)
|
|
||||||
+ {
|
|
||||||
+ new_dirs[i++] = (char *)link->data;
|
|
||||||
+ link = _dbus_list_get_next_link (directories, link);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ for (i = 0; new_dirs[i]; i++)
|
|
||||||
+ {
|
|
||||||
+ for (j = 0; j < num_wds; j++)
|
|
||||||
+ {
|
|
||||||
+ if (dirs[j] && strcmp (new_dirs[i], dirs[j]) == 0)
|
|
||||||
+ {
|
|
||||||
+ new_wds[i] = wds[j];
|
|
||||||
+ new_dirs[i] = dirs[j];
|
|
||||||
+ wds[j] = -1;
|
|
||||||
+ dirs[j] = NULL;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ for (j = 0; j < num_wds; j++)
|
|
||||||
+ {
|
|
||||||
+ if (wds[j] != -1)
|
|
||||||
+ {
|
|
||||||
+ inotify_rm_watch (inotify_fd, wds[j]);
|
|
||||||
+ dbus_free (dirs[j]);
|
|
||||||
+ wds[j] = -1;
|
|
||||||
+ dirs[j] = NULL;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ for (i = 0; new_dirs[i]; i++)
|
|
||||||
+ {
|
|
||||||
+ if (new_wds[i] == -1)
|
|
||||||
+ {
|
|
||||||
+ wd = inotify_add_watch (inotify_fd, new_dirs[i], IN_CLOSE_WRITE | IN_DELETE | IN_MOVED_TO | IN_MOVED_FROM);
|
|
||||||
+ if (wd < 0)
|
|
||||||
+ {
|
|
||||||
+ _dbus_warn ("Cannot setup inotify for '%s'; error '%s'\n", new_dirs[i], _dbus_strerror (errno));
|
|
||||||
+ goto out;
|
|
||||||
+ }
|
|
||||||
+ new_wds[i] = wd;
|
|
||||||
+ new_dirs[i] = strdup (new_dirs[i]);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ num_wds = i;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < MAX_DIRS_TO_WATCH; i++)
|
|
||||||
+ {
|
|
||||||
+ wds[i] = new_wds[i];
|
|
||||||
+ dirs[i] = new_dirs[i];
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ out:;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
bus_drop_all_directory_watches (void)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
--- dbus-1.2.16/bus/dir-watch.h 2009-07-14 13:06:31.000000000 -0400
|
|
||||||
+++ hacked/bus/dir-watch.h 2009-12-18 00:45:47.437818936 -0500
|
|
||||||
@@ -32,4 +32,6 @@
|
|
||||||
/* drop all the watches previously set up by bus_config_watch_directory (OS dependent, may be a NOP) */
|
|
||||||
void bus_drop_all_directory_watches (void);
|
|
||||||
|
|
||||||
+void bus_set_watched_dirs (BusContext *context, DBusList **dirs);
|
|
||||||
+
|
|
||||||
#endif /* DIR_WATCH_H */
|
|
||||||
--- dbus-1.2.16/bus/bus.c 2009-07-14 13:06:31.000000000 -0400
|
|
||||||
+++ hacked/bus/bus.c 2009-12-18 00:51:30.348481884 -0500
|
|
||||||
@@ -516,11 +516,6 @@
|
|
||||||
|
|
||||||
context->activation = new_activation;
|
|
||||||
|
|
||||||
- /* Drop existing conf-dir watches (if applicable) */
|
|
||||||
-
|
|
||||||
- if (is_reload)
|
|
||||||
- bus_drop_all_directory_watches ();
|
|
||||||
-
|
|
||||||
_DBUS_ASSERT_ERROR_IS_CLEAR (error);
|
|
||||||
retval = TRUE;
|
|
||||||
|
|
||||||
@@ -551,9 +546,7 @@
|
|
||||||
_dbus_hash_table_unref (service_context_table);
|
|
||||||
|
|
||||||
/* Watch all conf directories */
|
|
||||||
- _dbus_list_foreach (bus_config_parser_get_conf_dirs (parser),
|
|
||||||
- (DBusForeachFunction) bus_watch_directory,
|
|
||||||
- context);
|
|
||||||
+ bus_set_watched_dirs (context, bus_config_parser_get_conf_dirs (parser));
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
@ -1,59 +0,0 @@
|
|||||||
Index: dbus-1.2.16/dbus/dbus-connection.c
|
|
||||||
===================================================================
|
|
||||||
--- dbus-1.2.16.orig/dbus/dbus-connection.c 2009-10-01 14:10:21.000000000 +0100
|
|
||||||
+++ dbus-1.2.16/dbus/dbus-connection.c 2009-10-01 14:13:16.000000000 +0100
|
|
||||||
@@ -2386,7 +2386,7 @@
|
|
||||||
*/
|
|
||||||
_dbus_verbose ("dbus_connection_send_with_reply_and_block() waiting for more memory\n");
|
|
||||||
|
|
||||||
- _dbus_memory_pause_based_on_timeout (timeout_milliseconds);
|
|
||||||
+ _dbus_memory_pause_based_on_timeout (timeout_milliseconds - elapsed_milliseconds);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@@ -2394,7 +2394,7 @@
|
|
||||||
_dbus_connection_do_iteration_unlocked (connection,
|
|
||||||
DBUS_ITERATION_DO_READING |
|
|
||||||
DBUS_ITERATION_BLOCK,
|
|
||||||
- timeout_milliseconds);
|
|
||||||
+ timeout_milliseconds - elapsed_milliseconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
goto recheck_status;
|
|
||||||
@@ -2403,9 +2403,7 @@
|
|
||||||
_dbus_verbose ("dbus_connection_send_with_reply_and_block(): clock set backward\n");
|
|
||||||
else if (elapsed_milliseconds < timeout_milliseconds)
|
|
||||||
{
|
|
||||||
- timeout_milliseconds -= elapsed_milliseconds;
|
|
||||||
- _dbus_verbose ("dbus_connection_send_with_reply_and_block(): %d milliseconds remain\n", timeout_milliseconds);
|
|
||||||
- _dbus_assert (timeout_milliseconds >= 0);
|
|
||||||
+ _dbus_verbose ("dbus_connection_send_with_reply_and_block(): %d milliseconds remain\n", timeout_milliseconds - elapsed_milliseconds);
|
|
||||||
|
|
||||||
if (status == DBUS_DISPATCH_NEED_MEMORY)
|
|
||||||
{
|
|
||||||
@@ -2415,7 +2413,7 @@
|
|
||||||
*/
|
|
||||||
_dbus_verbose ("dbus_connection_send_with_reply_and_block() waiting for more memory\n");
|
|
||||||
|
|
||||||
- _dbus_memory_pause_based_on_timeout (timeout_milliseconds);
|
|
||||||
+ _dbus_memory_pause_based_on_timeout (timeout_milliseconds - elapsed_milliseconds);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@@ -2423,14 +2421,14 @@
|
|
||||||
_dbus_connection_do_iteration_unlocked (connection,
|
|
||||||
DBUS_ITERATION_DO_READING |
|
|
||||||
DBUS_ITERATION_BLOCK,
|
|
||||||
- timeout_milliseconds);
|
|
||||||
+ timeout_milliseconds - elapsed_milliseconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
goto recheck_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
_dbus_verbose ("dbus_connection_send_with_reply_and_block(): Waited %ld milliseconds and got no reply\n",
|
|
||||||
- (tv_sec - start_tv_sec) * 1000 + (tv_usec - start_tv_usec) / 1000);
|
|
||||||
+ elapsed_milliseconds);
|
|
||||||
|
|
||||||
_dbus_assert (!_dbus_pending_call_get_completed_unlocked (pending));
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
|||||||
diff -u -r dbus-1.2.16/bus/activation.c hacked/bus/activation.c
|
|
||||||
--- dbus-1.2.16/bus/activation.c 2009-07-14 13:06:31.000000000 -0400
|
|
||||||
+++ hacked/bus/activation.c 2009-12-17 21:36:56.447546354 -0500
|
|
||||||
@@ -736,6 +736,101 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
BusActivation*
|
|
||||||
+bus_activation_reload (BusActivation *activation,
|
|
||||||
+ const DBusString *address,
|
|
||||||
+ DBusList **directories,
|
|
||||||
+ DBusError *error)
|
|
||||||
+{
|
|
||||||
+ DBusList *link;
|
|
||||||
+ char *dir;
|
|
||||||
+
|
|
||||||
+ dbus_free (activation->server_address);
|
|
||||||
+ if (!_dbus_string_copy_data (address, &activation->server_address))
|
|
||||||
+ {
|
|
||||||
+ BUS_SET_OOM (error);
|
|
||||||
+ goto failed;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ _dbus_hash_table_unref (activation->entries);
|
|
||||||
+ activation->entries = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
|
|
||||||
+ (DBusFreeFunction)bus_activation_entry_unref);
|
|
||||||
+ if (activation->entries == NULL)
|
|
||||||
+ {
|
|
||||||
+ BUS_SET_OOM (error);
|
|
||||||
+ goto failed;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ _dbus_hash_table_unref (activation->directories);
|
|
||||||
+ activation->directories = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
|
|
||||||
+ (DBusFreeFunction)bus_service_directory_unref);
|
|
||||||
+
|
|
||||||
+ if (activation->directories == NULL)
|
|
||||||
+ {
|
|
||||||
+ BUS_SET_OOM (error);
|
|
||||||
+ goto failed;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ link = _dbus_list_get_first_link (directories);
|
|
||||||
+ while (link != NULL)
|
|
||||||
+ {
|
|
||||||
+ BusServiceDirectory *s_dir;
|
|
||||||
+
|
|
||||||
+ dir = _dbus_strdup ((const char *) link->data);
|
|
||||||
+ if (!dir)
|
|
||||||
+ {
|
|
||||||
+ BUS_SET_OOM (error);
|
|
||||||
+ goto failed;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ s_dir = dbus_new0 (BusServiceDirectory, 1);
|
|
||||||
+ if (!s_dir)
|
|
||||||
+ {
|
|
||||||
+ dbus_free (dir);
|
|
||||||
+ BUS_SET_OOM (error);
|
|
||||||
+ goto failed;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ s_dir->refcount = 1;
|
|
||||||
+ s_dir->dir_c = dir;
|
|
||||||
+
|
|
||||||
+ s_dir->entries = _dbus_hash_table_new (DBUS_HASH_STRING, NULL,
|
|
||||||
+ (DBusFreeFunction)bus_activation_entry_unref);
|
|
||||||
+
|
|
||||||
+ if (!s_dir->entries)
|
|
||||||
+ {
|
|
||||||
+ bus_service_directory_unref (s_dir);
|
|
||||||
+ BUS_SET_OOM (error);
|
|
||||||
+ goto failed;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!_dbus_hash_table_insert_string (activation->directories, s_dir->dir_c, s_dir))
|
|
||||||
+ {
|
|
||||||
+ bus_service_directory_unref (s_dir);
|
|
||||||
+ BUS_SET_OOM (error);
|
|
||||||
+ goto failed;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* only fail on OOM, it is ok if we can't read the directory */
|
|
||||||
+ if (!update_directory (activation, s_dir, error))
|
|
||||||
+ {
|
|
||||||
+ if (dbus_error_has_name (error, DBUS_ERROR_NO_MEMORY))
|
|
||||||
+ goto failed;
|
|
||||||
+ else
|
|
||||||
+ dbus_error_free (error);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ link = _dbus_list_get_next_link (directories, link);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return activation;
|
|
||||||
+
|
|
||||||
+ failed:
|
|
||||||
+ if (activation)
|
|
||||||
+ bus_activation_unref (activation);
|
|
||||||
+ return NULL;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+BusActivation*
|
|
||||||
bus_activation_new (BusContext *context,
|
|
||||||
const DBusString *address,
|
|
||||||
DBusList **directories,
|
|
||||||
diff -u -r dbus-1.2.16/bus/activation.h hacked/bus/activation.h
|
|
||||||
--- dbus-1.2.16/bus/activation.h 2009-07-14 13:06:31.000000000 -0400
|
|
||||||
+++ hacked/bus/activation.h 2009-12-17 20:02:53.347545761 -0500
|
|
||||||
@@ -32,6 +32,10 @@
|
|
||||||
const DBusString *address,
|
|
||||||
DBusList **directories,
|
|
||||||
DBusError *error);
|
|
||||||
+BusActivation* bus_activation_reload (BusActivation *activation,
|
|
||||||
+ const DBusString *address,
|
|
||||||
+ DBusList **directories,
|
|
||||||
+ DBusError *error);
|
|
||||||
BusActivation* bus_activation_ref (BusActivation *activation);
|
|
||||||
void bus_activation_unref (BusActivation *activation);
|
|
||||||
|
|
||||||
diff -u -r dbus-1.2.16/bus/bus.c hacked/bus/bus.c
|
|
||||||
--- dbus-1.2.16/bus/bus.c 2009-07-14 13:06:31.000000000 -0400
|
|
||||||
+++ hacked/bus/bus.c 2009-12-17 20:04:08.006546566 -0500
|
|
||||||
@@ -503,19 +503,17 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create activation subsystem */
|
|
||||||
- new_activation = bus_activation_new (context, &full_address,
|
|
||||||
- dirs, error);
|
|
||||||
- if (new_activation == NULL)
|
|
||||||
+ if (context->activation)
|
|
||||||
+ bus_activation_reload (context->activation, &full_address, dirs, error);
|
|
||||||
+ else
|
|
||||||
+ context->activation = bus_activation_new (context, &full_address, dirs, error);
|
|
||||||
+
|
|
||||||
+ if (context->activation == NULL)
|
|
||||||
{
|
|
||||||
_DBUS_ASSERT_ERROR_IS_SET (error);
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (is_reload)
|
|
||||||
- bus_activation_unref (context->activation);
|
|
||||||
-
|
|
||||||
- context->activation = new_activation;
|
|
||||||
-
|
|
||||||
/* Drop existing conf-dir watches (if applicable) */
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user