From fa734ee402ee1f41281ac89c3a376b24ae7e9112 Mon Sep 17 00:00:00 2001
From: David Kupka <dkupka@redhat.com>
Date: Wed, 7 Jan 2015 21:34:15 -0500
Subject: [PATCH] Retrieve string value from DBus property interface reply
correctly.
org.freedesktop.DBus.Properties.Get method always returns variant data type.
The basic type inside it can't be accessed directly.
---
src/getcert.c | 2 +-
src/tdbusm.c | 38 ++++++++++++++++++++++++++++++++++++++
src/tdbusm.h | 1 +
3 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/src/getcert.c b/src/getcert.c
index 5ea5e538e5f3beb840f88e6dbe21957b155b873b..8b2cb8a937947ca3d932cc9405a82c90acefabb3 100644
--- a/src/getcert.c
+++ b/src/getcert.c
@@ -474,7 +474,7 @@ query_prop_s(enum cm_tdbus_type which,
DBusMessage *rep;
char *s;
rep = query_prop(which, path, interface, prop, verbose);
- if (cm_tdbusm_get_s(rep, parent, &s) != 0) {
+ if (cm_tdbusm_get_vs(rep, parent, &s) != 0) {
s = "";
}
dbus_message_unref(rep);
diff --git a/src/tdbusm.c b/src/tdbusm.c
index dd3e800d1a5f2fe9c2d7feff3e3938a6adb4c1ab..f7aaea82e20994a7382518153980e14fb0405453 100644
--- a/src/tdbusm.c
+++ b/src/tdbusm.c
@@ -175,6 +175,44 @@ cm_tdbusm_get_p(DBusMessage *msg, void *parent, char **p)
}
int
+cm_tdbusm_get_vs(DBusMessage *msg, void *parent, char **s)
+{
+ DBusError err;
+ DBusMessageIter iter, sub_iter;
+
+ *s = NULL;
+ dbus_error_init(&err);
+
+ if (dbus_message_iter_init(msg, &iter) == FALSE) {
+ if (dbus_error_is_set(&err)) {
+ cm_log(3, "DBus error: %s", err.message);
+ dbus_error_free(&err);
+ } else {
+ cm_log(3, "Unknown DBus error.");
+ }
+ return -1;
+ }
+
+ if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_VARIANT) {
+ dbus_message_iter_recurse(&iter, &sub_iter);
+ if (dbus_message_iter_get_arg_type(&sub_iter) == DBUS_TYPE_STRING) {
+ dbus_message_iter_get_basic(&sub_iter, s);
+ *s = *s ? talloc_strdup(parent, *s) : NULL;
+ return 0;
+ }
+ }
+
+ if (dbus_error_is_set(&err)) {
+ cm_log(3, "Failed to extract data from DBus message: %s", err.message);
+ dbus_error_free(&err);
+ } else {
+ cm_log(3, "Failed to extract data from DBus message.");
+ }
+ *s = NULL;
+ return -1;
+}
+
+int
cm_tdbusm_get_s(DBusMessage *msg, void *parent, char **s)
{
DBusError err;
diff --git a/src/tdbusm.h b/src/tdbusm.h
index b926b4941985509696b965fc955b2f204ce856df..813fae2f4a4a72da512e7559b5ed437cab4766e1 100644
--- a/src/tdbusm.h
+++ b/src/tdbusm.h
@@ -22,6 +22,7 @@ int cm_tdbusm_get_b(DBusMessage *msg, void *parent, dbus_bool_t *b);
int cm_tdbusm_get_n(DBusMessage *msg, void *parent, long *n);
int cm_tdbusm_get_p(DBusMessage *msg, void *parent, char **p);
int cm_tdbusm_get_s(DBusMessage *msg, void *parent, char **s);
+int cm_tdbusm_get_vs(DBusMessage *msg, void *parent, char **s);
int cm_tdbusm_get_bp(DBusMessage *msg, void *parent, dbus_bool_t *b, char **p);
int cm_tdbusm_get_bs(DBusMessage *msg, void *parent, dbus_bool_t *b, char **s);
int cm_tdbusm_get_sb(DBusMessage *msg, void *parent, char **s, dbus_bool_t *b);
--
2.1.0