[PATCH 1/2] systemd-logind: filter out non-signal messages from message filter
Hans de Goede
hdegoede at redhat.com
Fri Apr 17 00:43:17 PDT 2015
Hi,
On 16-04-15 17:28, Ray Strode wrote:
> It's possible to receive a message reply in the message filter if a
> previous message call timed out locally before the reply arrived.
>
> The message_filter function only handles signals, at the moment, and
> does not properly handle message replies.
>
> This commit changes the message_filter function to filter out all
> non-signal messages, including spurious message replies.
>
> Downstream-bug: https://bugzilla.redhat.com/show_bug.cgi?id=1209347
> Signed-off-by: Ray Strode <rstrode at redhat.com>
Thanks both patches look good and are:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Keith, can you pick these 2 up directly please?
Regards,
Hans
p.s.
Ray, you may want to reduce the number of context lines a bit next time
you post patches.
> ---
> hw/xfree86/os-support/linux/systemd-logind.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/hw/xfree86/os-support/linux/systemd-logind.c b/hw/xfree86/os-support/linux/systemd-logind.c
> index 49758f4..57c87c0 100644
> --- a/hw/xfree86/os-support/linux/systemd-logind.c
> +++ b/hw/xfree86/os-support/linux/systemd-logind.c
> @@ -286,60 +286,63 @@ systemd_logind_ack_pause(struct systemd_logind_info *info,
> DBUS_TYPE_INVALID)) {
> LogMessage(X_ERROR, "systemd-logind: out of memory\n");
> goto cleanup;
> }
>
> reply = dbus_connection_send_with_reply_and_block(info->conn, msg,
> DBUS_TIMEOUT, &error);
> if (!reply)
> LogMessage(X_ERROR, "systemd-logind: failed to ack pause: %s\n",
> error.message);
>
> cleanup:
> if (msg)
> dbus_message_unref(msg);
> if (reply)
> dbus_message_unref(reply);
> dbus_error_free(&error);
> }
>
> static DBusHandlerResult
> message_filter(DBusConnection * connection, DBusMessage * message, void *data)
> {
> struct systemd_logind_info *info = data;
> struct xf86_platform_device *pdev = NULL;
> InputInfoPtr pInfo = NULL;
> int ack = 0, pause = 0, fd = -1;
> DBusError error;
> dbus_int32_t major, minor;
> char *pause_str;
>
> + if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL)
> + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
> +
> dbus_error_init(&error);
>
> if (dbus_message_is_signal(message,
> "org.freedesktop.DBus", "NameOwnerChanged")) {
> char *name, *old_owner, *new_owner;
>
> dbus_message_get_args(message, &error,
> DBUS_TYPE_STRING, &name,
> DBUS_TYPE_STRING, &old_owner,
> DBUS_TYPE_STRING, &new_owner, DBUS_TYPE_INVALID);
> if (dbus_error_is_set(&error)) {
> LogMessage(X_ERROR, "systemd-logind: NameOwnerChanged: %s\n",
> error.message);
> dbus_error_free(&error);
> return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
> }
>
> if (name && strcmp(name, "org.freedesktop.login1") == 0)
> FatalError("systemd-logind disappeared (stopped/restarted?)\n");
>
> return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
> }
>
> if (strcmp(dbus_message_get_path(message), info->session) != 0)
> return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
>
> if (dbus_message_is_signal(message, "org.freedesktop.login1.Session",
> "PauseDevice")) {
> if (!dbus_message_get_args(message, &error,
> DBUS_TYPE_UINT32, &major,
>
More information about the xorg-devel
mailing list