Openembedded Core Discussions
 help / color / mirror / Atom feed
* [PATCH 1/3] dbus: backport fix for bus activation under systemd session
@ 2014-04-02  2:50 Jonathan Liu
  2014-04-02  2:50 ` [PATCH 2/3] dbus: backport memory leak patch for error when listing services Jonathan Liu
  2014-04-02  2:50 ` [PATCH 3/3] systemd: backport patch to avoid assertion failures Jonathan Liu
  0 siblings, 2 replies; 3+ messages in thread
From: Jonathan Liu @ 2014-04-02  2:50 UTC (permalink / raw)
  To: openembedded-core

Signed-off-by: Jonathan Liu <net147@gmail.com>
---
 meta/recipes-core/dbus/dbus.inc                    |   1 +
 ...orrect-address-when-using-address-systemd.patch | 193 +++++++++++++++++++++
 2 files changed, 194 insertions(+)
 create mode 100644 meta/recipes-core/dbus/dbus/Set-correct-address-when-using-address-systemd.patch

diff --git a/meta/recipes-core/dbus/dbus.inc b/meta/recipes-core/dbus/dbus.inc
index 677ff78..5d57ff4 100644
--- a/meta/recipes-core/dbus/dbus.inc
+++ b/meta/recipes-core/dbus/dbus.inc
@@ -15,6 +15,7 @@ SRC_URI = "http://dbus.freedesktop.org/releases/dbus/dbus-${PV}.tar.gz \
            file://dbus-1.init \
            file://os-test.patch \
            file://clear-guid_from_server-if-send_negotiate_unix_f.patch \
+           file://Set-correct-address-when-using-address-systemd.patch \
 "
 
 inherit useradd autotools pkgconfig gettext update-rc.d
diff --git a/meta/recipes-core/dbus/dbus/Set-correct-address-when-using-address-systemd.patch b/meta/recipes-core/dbus/dbus/Set-correct-address-when-using-address-systemd.patch
new file mode 100644
index 0000000..1fca9bb
--- /dev/null
+++ b/meta/recipes-core/dbus/dbus/Set-correct-address-when-using-address-systemd.patch
@@ -0,0 +1,193 @@
+From d728fdc655f17031da3bb129ab2fd17dadf0fe3a Mon Sep 17 00:00:00 2001
+From: Simon Peeters <peeters.simon@gmail.com>
+Date: Sun, 7 Oct 2012 16:59:30 +0200
+Subject: [PATCH] Set correct address when using --address=systemd:
+
+When dbus gets launched through systemd, we need to create an address
+string based on the sockets passed.
+
+The _dbus_append_addres_from_socket() function is responsible for
+extracting the address information from the file-descriptor and
+formatting it in a dbus friendly way.
+
+This fixes bus activation when running dbus under a systemd session.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=50962
+
+Upstream-Status: Backport
+
+Signed-off-by: Simon Peeters <peeters.simon@gmail.com>
+Signed-off-by: Jonathan Liu <net147@gmail.com>
+---
+ dbus/dbus-server-unix.c  | 38 ++++++++++++++++++---------
+ dbus/dbus-sysdeps-unix.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++
+ dbus/dbus-sysdeps-unix.h |  4 +++
+ 3 files changed, 97 insertions(+), 13 deletions(-)
+
+diff --git a/dbus/dbus-server-unix.c b/dbus/dbus-server-unix.c
+index 130f66e..d995240 100644
+--- a/dbus/dbus-server-unix.c
++++ b/dbus/dbus-server-unix.c
+@@ -149,7 +149,7 @@ _dbus_server_listen_platform_specific (DBusAddressEntry *entry,
+     }
+   else if (strcmp (method, "systemd") == 0)
+     {
+-      int n, *fds;
++      int i, n, *fds;
+       DBusString address;
+ 
+       n = _dbus_listen_systemd_sockets (&fds, error);
+@@ -159,27 +159,39 @@ _dbus_server_listen_platform_specific (DBusAddressEntry *entry,
+           return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
+         }
+ 
+-      _dbus_string_init_const (&address, "systemd:");
++      if (!_dbus_string_init (&address))
++          goto systemd_oom;
+ 
+-      *server_p = _dbus_server_new_for_socket (fds, n, &address, NULL);
+-      if (*server_p == NULL)
++      for (i = 0; i < n; i++)
+         {
+-          int i;
+-
+-          for (i = 0; i < n; i++)
++          if (i > 0)
+             {
+-              _dbus_close_socket (fds[i], NULL);
++              if (!_dbus_string_append (&address, ";"))
++                goto systemd_oom;
+             }
+-          dbus_free (fds);
+-
+-          dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+-          return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
++          if (!_dbus_append_address_from_socket (fds[i], &address, error))
++            goto systemd_err;
+         }
+ 
++      *server_p = _dbus_server_new_for_socket (fds, n, &address, NULL);
++      if (*server_p == NULL)
++        goto systemd_oom;
++
+       dbus_free (fds);
+ 
+       return DBUS_SERVER_LISTEN_OK;
+-	}
++  systemd_oom:
++      _DBUS_SET_OOM (error);
++  systemd_err:
++      for (i = 0; i < n; i++)
++        {
++          _dbus_close_socket (fds[i], NULL);
++        }
++      dbus_free (fds);
++      _dbus_string_free (&address);
++
++      return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
++    }
+ #ifdef DBUS_ENABLE_LAUNCHD
+   else if (strcmp (method, "launchd") == 0)
+     {
+diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c
+index b4ecc96..55743b1 100644
+--- a/dbus/dbus-sysdeps-unix.c
++++ b/dbus/dbus-sysdeps-unix.c
+@@ -55,6 +55,7 @@
+ #include <netinet/in.h>
+ #include <netdb.h>
+ #include <grp.h>
++#include <arpa/inet.h>
+ 
+ #ifdef HAVE_ERRNO_H
+ #include <errno.h>
+@@ -4160,4 +4161,71 @@ _dbus_check_setuid (void)
+ #endif
+ }
+ 
++/**
++ * Read the address from the socket and append it to the string
++ *
++ * @param fd the socket
++ * @param address
++ * @param error return location for error code
++ */
++dbus_bool_t
++_dbus_append_address_from_socket (int         fd,
++                                  DBusString *address,
++                                  DBusError  *error)
++{
++  union {
++      struct sockaddr sa;
++      struct sockaddr_storage storage;
++      struct sockaddr_un un;
++      struct sockaddr_in ipv4;
++      struct sockaddr_in6 ipv6;
++  } socket;
++  char hostip[INET6_ADDRSTRLEN];
++  int size = sizeof (socket);
++
++  if (getsockname (fd, &socket.sa, &size))
++    goto err;
++
++  switch (socket.sa.sa_family)
++    {
++    case AF_UNIX:
++      if (socket.un.sun_path[0]=='\0')
++        {
++          if (_dbus_string_append_printf (address, "unix:abstract=%s", &(socket.un.sun_path[1])))
++            return TRUE;
++        }
++      else
++        {
++          if (_dbus_string_append_printf (address, "unix:path=%s", socket.un.sun_path))
++            return TRUE;
++        }
++      break;
++    case AF_INET:
++      if (inet_ntop (AF_INET, &socket.ipv4.sin_addr, hostip, sizeof (hostip)))
++        if (_dbus_string_append_printf (address, "tcp:family=ipv4,host=%s,port=%u",
++                   hostip, ntohs (socket.ipv4.sin_port)))
++          return TRUE;
++      break;
++#ifdef AF_INET6
++    case AF_INET6:
++      if (inet_ntop (AF_INET6, &socket.ipv6.sin6_addr, hostip, sizeof (hostip)))
++        if (_dbus_string_append_printf (address, "tcp:family=ipv6,host=%s,port=%u",
++                   hostip, ntohs (socket.ipv6.sin6_port)))
++          return TRUE;
++      break;
++#endif
++    default:
++      dbus_set_error (error,
++                      _dbus_error_from_errno (EINVAL),
++                      "Failed to read address from socket: Unknown socket type.");
++      return FALSE;
++    }
++ err:
++  dbus_set_error (error,
++                  _dbus_error_from_errno (errno),
++                  "Failed to open socket: %s",
++                  _dbus_strerror (errno));
++  return FALSE;
++}
++
+ /* tests in dbus-sysdeps-util.c */
+diff --git a/dbus/dbus-sysdeps-unix.h b/dbus/dbus-sysdeps-unix.h
+index 9b70896..a265b33 100644
+--- a/dbus/dbus-sysdeps-unix.h
++++ b/dbus/dbus-sysdeps-unix.h
+@@ -138,6 +138,10 @@ dbus_bool_t _dbus_parse_uid (const DBusString  *uid_str,
+ 
+ void _dbus_close_all (void);
+ 
++dbus_bool_t _dbus_append_address_from_socket (int         fd,
++                                              DBusString *address,
++                                              DBusError  *error);
++
+ /** @} */
+ 
+ DBUS_END_DECLS
+-- 
+1.9.0
+
-- 
1.9.0



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/3] dbus: backport memory leak patch for error when listing services
  2014-04-02  2:50 [PATCH 1/3] dbus: backport fix for bus activation under systemd session Jonathan Liu
@ 2014-04-02  2:50 ` Jonathan Liu
  2014-04-02  2:50 ` [PATCH 3/3] systemd: backport patch to avoid assertion failures Jonathan Liu
  1 sibling, 0 replies; 3+ messages in thread
From: Jonathan Liu @ 2014-04-02  2:50 UTC (permalink / raw)
  To: openembedded-core

Signed-off-by: Jonathan Liu <net147@gmail.com>
---
 meta/recipes-core/dbus/dbus.inc                    |  1 +
 ...y-freeing-if-error-during-listing-service.patch | 45 ++++++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 meta/recipes-core/dbus/dbus/fixed-memory-freeing-if-error-during-listing-service.patch

diff --git a/meta/recipes-core/dbus/dbus.inc b/meta/recipes-core/dbus/dbus.inc
index 5d57ff4..5727ae7 100644
--- a/meta/recipes-core/dbus/dbus.inc
+++ b/meta/recipes-core/dbus/dbus.inc
@@ -16,6 +16,7 @@ SRC_URI = "http://dbus.freedesktop.org/releases/dbus/dbus-${PV}.tar.gz \
            file://os-test.patch \
            file://clear-guid_from_server-if-send_negotiate_unix_f.patch \
            file://Set-correct-address-when-using-address-systemd.patch \
+           file://fixed-memory-freeing-if-error-during-listing-service.patch \
 "
 
 inherit useradd autotools pkgconfig gettext update-rc.d
diff --git a/meta/recipes-core/dbus/dbus/fixed-memory-freeing-if-error-during-listing-service.patch b/meta/recipes-core/dbus/dbus/fixed-memory-freeing-if-error-during-listing-service.patch
new file mode 100644
index 0000000..96290f4
--- /dev/null
+++ b/meta/recipes-core/dbus/dbus/fixed-memory-freeing-if-error-during-listing-service.patch
@@ -0,0 +1,45 @@
+From 03aeaccbffa97c9237b57ca067e3da7388862129 Mon Sep 17 00:00:00 2001
+From: Radoslaw Pajak <r.pajak@samsung.com>
+Date: Fri, 8 Nov 2013 13:51:32 +0100
+Subject: [PATCH] fixed memory freeing if error during listing services
+
+Upstream-Status: Backport
+
+Signed-off-by: Radoslaw Pajak <r.pajak@samsung.com>
+Reviewed-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
+Bug: https://bugs.freedesktop.org/show_bug.cgi?id=71526
+Signed-off-by: Jonathan Liu <net147@gmail.com>
+---
+ bus/activation.c | 2 +-
+ bus/services.c   | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/bus/activation.c b/bus/activation.c
+index fcb7133..ea48a26 100644
+--- a/bus/activation.c
++++ b/bus/activation.c
+@@ -2179,7 +2179,7 @@ bus_activation_list_services (BusActivation *activation,
+ 
+  error:
+   for (j = 0; j < i; j++)
+-    dbus_free (retval[i]);
++    dbus_free (retval[j]);
+   dbus_free (retval);
+ 
+   return FALSE;
+diff --git a/bus/services.c b/bus/services.c
+index 6f380fa..01a720e 100644
+--- a/bus/services.c
++++ b/bus/services.c
+@@ -368,7 +368,7 @@ bus_registry_list_services (BusRegistry *registry,
+   
+  error:
+   for (j = 0; j < i; j++)
+-    dbus_free (retval[i]);
++    dbus_free (retval[j]);
+   dbus_free (retval);
+ 
+   return FALSE;
+-- 
+1.9.0
+
-- 
1.9.0



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 3/3] systemd: backport patch to avoid assertion failures
  2014-04-02  2:50 [PATCH 1/3] dbus: backport fix for bus activation under systemd session Jonathan Liu
  2014-04-02  2:50 ` [PATCH 2/3] dbus: backport memory leak patch for error when listing services Jonathan Liu
@ 2014-04-02  2:50 ` Jonathan Liu
  1 sibling, 0 replies; 3+ messages in thread
From: Jonathan Liu @ 2014-04-02  2:50 UTC (permalink / raw)
  To: openembedded-core

Signed-off-by: Jonathan Liu <net147@gmail.com>
---
 ...t-use-assert_return-to-check-for-disconne.patch | 513 +++++++++++++++++++++
 meta/recipes-core/systemd/systemd_211.bb           |   1 +
 2 files changed, 514 insertions(+)
 create mode 100644 meta/recipes-core/systemd/systemd/sd-bus-don-t-use-assert_return-to-check-for-disconne.patch

diff --git a/meta/recipes-core/systemd/systemd/sd-bus-don-t-use-assert_return-to-check-for-disconne.patch b/meta/recipes-core/systemd/systemd/sd-bus-don-t-use-assert_return-to-check-for-disconne.patch
new file mode 100644
index 0000000..c5bee97
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/sd-bus-don-t-use-assert_return-to-check-for-disconne.patch
@@ -0,0 +1,513 @@
+From a3d59cd1b0a2738d06893948492113f2c35be0af Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart@poettering.net>
+Date: Wed, 19 Mar 2014 21:41:21 +0100
+Subject: [PATCH] sd-bus: don't use assert_return() to check for disconnected
+ bus connections
+
+A terminated connection is a runtime error and not a developer mistake,
+hence don't use assert_return() to check for it.
+
+Upstream-Status: Backport
+
+Signed-off-by: Jonathan Liu <net147@gmail.com>
+---
+ src/libsystemd/sd-bus/bus-control.c     | 20 +++++++++---
+ src/libsystemd/sd-bus/bus-convenience.c | 58 +++++++++++++++++++++++++--------
+ src/libsystemd/sd-bus/bus-objects.c     | 23 +++++++++----
+ src/libsystemd/sd-bus/sd-bus.c          | 49 ++++++++++++++++++++--------
+ 4 files changed, 113 insertions(+), 37 deletions(-)
+
+diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c
+index bb6683e..bd392a2 100644
+--- a/src/libsystemd/sd-bus/bus-control.c
++++ b/src/libsystemd/sd-bus/bus-control.c
+@@ -128,12 +128,14 @@ _public_ int sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags)
+         assert_return(bus, -EINVAL);
+         assert_return(name, -EINVAL);
+         assert_return(bus->bus_client, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+         assert_return(!(flags & ~(SD_BUS_NAME_ALLOW_REPLACEMENT|SD_BUS_NAME_REPLACE_EXISTING|SD_BUS_NAME_QUEUE)), -EINVAL);
+         assert_return(service_name_is_valid(name), -EINVAL);
+         assert_return(name[0] != ':', -EINVAL);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (bus->is_kernel)
+                 return bus_request_name_kernel(bus, name, flags);
+         else
+@@ -201,11 +203,13 @@ _public_ int sd_bus_release_name(sd_bus *bus, const char *name) {
+         assert_return(bus, -EINVAL);
+         assert_return(name, -EINVAL);
+         assert_return(bus->bus_client, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+         assert_return(service_name_is_valid(name), -EINVAL);
+         assert_return(name[0] != ':', -EINVAL);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (bus->is_kernel)
+                 return bus_release_name_kernel(bus, name);
+         else
+@@ -342,9 +346,11 @@ static int bus_list_names_dbus1(sd_bus *bus, char ***acquired, char ***activatab
+ _public_ int sd_bus_list_names(sd_bus *bus, char ***acquired, char ***activatable) {
+         assert_return(bus, -EINVAL);
+         assert_return(acquired || activatable, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (bus->is_kernel)
+                 return bus_list_names_kernel(bus, acquired, activatable);
+         else
+@@ -735,11 +741,13 @@ _public_ int sd_bus_get_owner(
+         assert_return(name, -EINVAL);
+         assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
+         assert_return(mask == 0 || creds, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+         assert_return(service_name_is_valid(name), -EINVAL);
+         assert_return(bus->bus_client, -ENODATA);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (bus->is_kernel)
+                 return bus_get_owner_kdbus(bus, name, mask, creds);
+         else
+@@ -1196,10 +1204,12 @@ _public_ int sd_bus_get_owner_machine_id(sd_bus *bus, const char *name, sd_id128
+         assert_return(bus, -EINVAL);
+         assert_return(name, -EINVAL);
+         assert_return(machine, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+         assert_return(service_name_is_valid(name), -EINVAL);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (streq_ptr(name, bus->unique_name))
+                 return sd_id128_get_machine(machine);
+ 
+diff --git a/src/libsystemd/sd-bus/bus-convenience.c b/src/libsystemd/sd-bus/bus-convenience.c
+index 6e02ad3..c5b9cd4 100644
+--- a/src/libsystemd/sd-bus/bus-convenience.c
++++ b/src/libsystemd/sd-bus/bus-convenience.c
+@@ -36,9 +36,11 @@ _public_ int sd_bus_emit_signal(
+         int r;
+ 
+         assert_return(bus, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         r = sd_bus_message_new_signal(bus, &m, path, interface, member);
+         if (r < 0)
+                 return r;
+@@ -70,9 +72,11 @@ _public_ int sd_bus_call_method(
+         int r;
+ 
+         assert_return(bus, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         r = sd_bus_message_new_method_call(bus, &m, destination, path, interface, member);
+         if (r < 0)
+                 return r;
+@@ -100,9 +104,12 @@ _public_ int sd_bus_reply_method_return(
+         assert_return(call, -EINVAL);
+         assert_return(call->sealed, -EPERM);
+         assert_return(call->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
+-        assert_return(call->bus && BUS_IS_OPEN(call->bus->state), -ENOTCONN);
++        assert_return(call->bus, -EINVAL);
+         assert_return(!bus_pid_changed(call->bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(call->bus->state))
++                return -ENOTCONN;
++
+         if (call->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
+                 return 0;
+ 
+@@ -134,9 +141,12 @@ _public_ int sd_bus_reply_method_error(
+         assert_return(call->sealed, -EPERM);
+         assert_return(call->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
+         assert_return(sd_bus_error_is_set(e), -EINVAL);
+-        assert_return(call->bus && BUS_IS_OPEN(call->bus->state), -ENOTCONN);
++        assert_return(call->bus, -EINVAL);
+         assert_return(!bus_pid_changed(call->bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(call->bus->state))
++                return -ENOTCONN;
++
+         if (call->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
+                 return 0;
+ 
+@@ -159,9 +169,12 @@ _public_ int sd_bus_reply_method_errorf(
+         assert_return(call, -EINVAL);
+         assert_return(call->sealed, -EPERM);
+         assert_return(call->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
+-        assert_return(call->bus && BUS_IS_OPEN(call->bus->state), -ENOTCONN);
++        assert_return(call->bus, -EINVAL);
+         assert_return(!bus_pid_changed(call->bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(call->bus->state))
++                return -ENOTCONN;
++
+         if (call->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
+                 return 0;
+ 
+@@ -182,9 +195,12 @@ _public_ int sd_bus_reply_method_errno(
+         assert_return(call, -EINVAL);
+         assert_return(call->sealed, -EPERM);
+         assert_return(call->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
+-        assert_return(call->bus && BUS_IS_OPEN(call->bus->state), -ENOTCONN);
++        assert_return(call->bus, -EINVAL);
+         assert_return(!bus_pid_changed(call->bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(call->bus->state))
++                return -ENOTCONN;
++
+         if (call->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
+                 return 0;
+ 
+@@ -208,9 +224,12 @@ _public_ int sd_bus_reply_method_errnof(
+         assert_return(call, -EINVAL);
+         assert_return(call->sealed, -EPERM);
+         assert_return(call->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
+-        assert_return(call->bus && BUS_IS_OPEN(call->bus->state), -ENOTCONN);
++        assert_return(call->bus, -EINVAL);
+         assert_return(!bus_pid_changed(call->bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(call->bus->state))
++                return -ENOTCONN;
++
+         if (call->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
+                 return 0;
+ 
+@@ -239,9 +258,11 @@ _public_ int sd_bus_get_property(
+         assert_return(member_name_is_valid(member), -EINVAL);
+         assert_return(reply, -EINVAL);
+         assert_return(signature_is_single(type, false), -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &rep, "ss", strempty(interface), member);
+         if (r < 0)
+                 return r;
+@@ -273,9 +294,11 @@ _public_ int sd_bus_get_property_trivial(
+         assert_return(member_name_is_valid(member), -EINVAL);
+         assert_return(bus_type_is_trivial(type), -EINVAL);
+         assert_return(ptr, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &reply, "ss", strempty(interface), member);
+         if (r < 0)
+                 return r;
+@@ -309,9 +332,11 @@ _public_ int sd_bus_get_property_string(
+         assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL);
+         assert_return(member_name_is_valid(member), -EINVAL);
+         assert_return(ret, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &reply, "ss", strempty(interface), member);
+         if (r < 0)
+                 return r;
+@@ -348,9 +373,11 @@ _public_ int sd_bus_get_property_strv(
+         assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL);
+         assert_return(member_name_is_valid(member), -EINVAL);
+         assert_return(ret, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         r = sd_bus_call_method(bus, destination, path, "org.freedesktop.DBus.Properties", "Get", error, &reply, "ss", strempty(interface), member);
+         if (r < 0)
+                 return r;
+@@ -383,9 +410,11 @@ _public_ int sd_bus_set_property(
+         assert_return(isempty(interface) || interface_name_is_valid(interface), -EINVAL);
+         assert_return(member_name_is_valid(member), -EINVAL);
+         assert_return(signature_is_single(type, false), -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         r = sd_bus_message_new_method_call(bus, &m, destination, path, "org.freedesktop.DBus.Properties", "Set");
+         if (r < 0)
+                 return r;
+@@ -416,9 +445,12 @@ _public_ int sd_bus_query_sender_creds(sd_bus_message *call, uint64_t mask, sd_b
+ 
+         assert_return(call, -EINVAL);
+         assert_return(call->sealed, -EPERM);
+-        assert_return(call->bus && BUS_IS_OPEN(call->bus->state), -ENOTCONN);
++        assert_return(call->bus, -EINVAL);
+         assert_return(!bus_pid_changed(call->bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(call->bus->state))
++                return -ENOTCONN;
++
+         c = sd_bus_message_get_creds(call);
+ 
+         /* All data we need? */
+diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c
+index 08792fe..539cf2a 100644
+--- a/src/libsystemd/sd-bus/bus-objects.c
++++ b/src/libsystemd/sd-bus/bus-objects.c
+@@ -2196,9 +2196,10 @@ _public_ int sd_bus_emit_properties_changed_strv(
+         assert_return(bus, -EINVAL);
+         assert_return(object_path_is_valid(path), -EINVAL);
+         assert_return(interface_name_is_valid(interface), -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
+ 
+         /* A non-NULL but empty names list means nothing needs to be
+            generated. A NULL list OTOH indicates that all properties
+@@ -2241,9 +2242,11 @@ _public_ int sd_bus_emit_properties_changed(
+         assert_return(bus, -EINVAL);
+         assert_return(object_path_is_valid(path), -EINVAL);
+         assert_return(interface_name_is_valid(interface), -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (!name)
+                 return 0;
+ 
+@@ -2361,9 +2364,11 @@ _public_ int sd_bus_emit_interfaces_added_strv(sd_bus *bus, const char *path, ch
+ 
+         assert_return(bus, -EINVAL);
+         assert_return(object_path_is_valid(path), -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (strv_isempty(interfaces))
+                 return 0;
+ 
+@@ -2421,9 +2426,11 @@ _public_ int sd_bus_emit_interfaces_added(sd_bus *bus, const char *path, const c
+ 
+         assert_return(bus, -EINVAL);
+         assert_return(object_path_is_valid(path), -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         interfaces = strv_from_stdarg_alloca(interface);
+ 
+         return sd_bus_emit_interfaces_added_strv(bus, path, interfaces);
+@@ -2435,9 +2442,11 @@ _public_ int sd_bus_emit_interfaces_removed_strv(sd_bus *bus, const char *path,
+ 
+         assert_return(bus, -EINVAL);
+         assert_return(object_path_is_valid(path), -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (strv_isempty(interfaces))
+                 return 0;
+ 
+@@ -2461,9 +2470,11 @@ _public_ int sd_bus_emit_interfaces_removed(sd_bus *bus, const char *path, const
+ 
+         assert_return(bus, -EINVAL);
+         assert_return(object_path_is_valid(path), -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         interfaces = strv_from_stdarg_alloca(interface);
+ 
+         return sd_bus_emit_interfaces_removed_strv(bus, path, interfaces);
+diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
+index fa6d43a..15c7677 100644
+--- a/src/libsystemd/sd-bus/sd-bus.c
++++ b/src/libsystemd/sd-bus/sd-bus.c
+@@ -1594,10 +1594,12 @@ static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie,
+         int r;
+ 
+         assert_return(bus, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(m, -EINVAL);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (m->n_fds > 0) {
+                 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
+                 if (r < 0)
+@@ -1673,10 +1675,12 @@ _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destinat
+         int r;
+ 
+         assert_return(bus, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(m, -EINVAL);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         if (!streq_ptr(m->destination, destination)) {
+ 
+                 if (!destination)
+@@ -1728,13 +1732,15 @@ _public_ int sd_bus_call_async(
+         int r;
+ 
+         assert_return(bus, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(m, -EINVAL);
+         assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
+         assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
+         assert_return(callback, -EINVAL);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func);
+         if (r < 0)
+                 return r;
+@@ -1841,13 +1847,15 @@ _public_ int sd_bus_call(
+         int r;
+ 
+         assert_return(bus, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(m, -EINVAL);
+         assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
+         assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
+         assert_return(!bus_error_is_dirty(error), -EINVAL);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
++
+         r = bus_ensure_running(bus);
+         if (r < 0)
+                 return r;
+@@ -1973,9 +1981,11 @@ _public_ int sd_bus_get_events(sd_bus *bus) {
+         int flags = 0;
+ 
+         assert_return(bus, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
++                return -ENOTCONN;
++
+         if (bus->state == BUS_OPENING)
+                 flags |= POLLOUT;
+         else if (bus->state == BUS_AUTHENTICATING) {
+@@ -2000,9 +2010,11 @@ _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
+ 
+         assert_return(bus, -EINVAL);
+         assert_return(timeout_usec, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state) || bus->state == BUS_CLOSING, -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+ 
++        if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
++                return -ENOTCONN;
++
+         if (bus->track_queue) {
+                 *timeout_usec = 0;
+                 return 1;
+@@ -2531,7 +2543,8 @@ static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
+         if (bus->state == BUS_CLOSING)
+                 return 1;
+ 
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
+ 
+         e = sd_bus_get_events(bus);
+         if (e < 0)
+@@ -2586,7 +2599,8 @@ _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
+         if (bus->state == BUS_CLOSING)
+                 return 0;
+ 
+-        assert_return(BUS_IS_OPEN(bus->state) , -ENOTCONN);
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
+ 
+         if (bus->rqueue_size > 0)
+                 return 0;
+@@ -2603,7 +2617,8 @@ _public_ int sd_bus_flush(sd_bus *bus) {
+         if (bus->state == BUS_CLOSING)
+                 return 0;
+ 
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
+ 
+         r = bus_ensure_running(bus);
+         if (r < 0)
+@@ -3113,9 +3128,13 @@ _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **re
+         assert_return(bus, -EINVAL);
+         assert_return(mask <= _SD_BUS_CREDS_ALL, -ENOTSUP);
+         assert_return(ret, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+-        assert_return(!bus->is_kernel, -ENOTSUP);
++
++        if (!bus->is_kernel)
++                return -ENOTSUP;
++
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
+ 
+         if (!bus->ucred_valid && !isempty(bus->label))
+                 return -ENODATA;
+@@ -3154,9 +3173,13 @@ _public_ int sd_bus_try_close(sd_bus *bus) {
+         int r;
+ 
+         assert_return(bus, -EINVAL);
+-        assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
+         assert_return(!bus_pid_changed(bus), -ECHILD);
+-        assert_return(bus->is_kernel, -ENOTSUP);
++
++        if (!bus->is_kernel)
++                return -ENOTSUP;
++
++        if (!BUS_IS_OPEN(bus->state))
++                return -ENOTCONN;
+ 
+         if (bus->rqueue_size > 0)
+                 return -EBUSY;
+-- 
+1.9.1
+
diff --git a/meta/recipes-core/systemd/systemd_211.bb b/meta/recipes-core/systemd/systemd_211.bb
index 044aab5..44b1965 100644
--- a/meta/recipes-core/systemd/systemd_211.bb
+++ b/meta/recipes-core/systemd/systemd_211.bb
@@ -31,6 +31,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master;protocol=
            file://0001-uClibc-doesn-t-implement-pwritev-preadv.patch \
            file://uclibc-sysinfo_h.patch \
            file://uclibc-get-physmem.patch \
+           file://sd-bus-don-t-use-assert_return-to-check-for-disconne.patch \
            \
            file://touchscreen.rules \
            file://00-create-volatile.conf \
-- 
1.9.0



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-04-02  2:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-04-02  2:50 [PATCH 1/3] dbus: backport fix for bus activation under systemd session Jonathan Liu
2014-04-02  2:50 ` [PATCH 2/3] dbus: backport memory leak patch for error when listing services Jonathan Liu
2014-04-02  2:50 ` [PATCH 3/3] systemd: backport patch to avoid assertion failures Jonathan Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox