From a961d93768f18c28979ca2841832cd7278bf95b8 Mon Sep 17 00:00:00 2001 From: Pavel Hrdina Date: Mon, 21 Sep 2020 15:42:00 +0200 Subject: [PATCH] virgdbus: add DBus reply format check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We used to check the format of reply data with libdbus so we should do the same with GLib DBus as well. Signed-off-by: Pavel Hrdina Reviewed-by: Ján Tomko --- src/rpc/virnetdaemon.c | 1 + src/util/virfirewalld.c | 5 +++++ src/util/virgdbus.c | 8 ++++++-- src/util/virgdbus.h | 2 ++ src/util/virpolkit.c | 1 + src/util/virsystemd.c | 7 +++++++ 6 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/rpc/virnetdaemon.c b/src/rpc/virnetdaemon.c index 12d4d9bf87..f3a5e9f75c 100644 --- a/src/rpc/virnetdaemon.c +++ b/src/rpc/virnetdaemon.c @@ -487,6 +487,7 @@ virNetDaemonCallInhibit(virNetDaemonPtr dmn, rc = virGDBusCallMethodWithFD(systemBus, &reply, + G_VARIANT_TYPE("(h)"), &replyFD, NULL, "org.freedesktop.login1", diff --git a/src/util/virfirewalld.c b/src/util/virfirewalld.c index 12448f0681..a94ac7c183 100644 --- a/src/util/virfirewalld.c +++ b/src/util/virfirewalld.c @@ -95,6 +95,7 @@ virFirewallDGetVersion(unsigned long *version) if (virGDBusCallMethod(sysbus, &reply, + G_VARIANT_TYPE("(v)"), NULL, VIR_FIREWALL_FIREWALLD_SERVICE, "/org/fedoraproject/FirewallD1", @@ -147,6 +148,7 @@ virFirewallDGetBackend(void) if (virGDBusCallMethod(sysbus, &reply, + G_VARIANT_TYPE("(v)"), error, VIR_FIREWALL_FIREWALLD_SERVICE, "/org/fedoraproject/FirewallD1/config", @@ -207,6 +209,7 @@ virFirewallDGetZones(char ***zones, size_t *nzones) if (virGDBusCallMethod(sysbus, &reply, + G_VARIANT_TYPE("(as)"), NULL, VIR_FIREWALL_FIREWALLD_SERVICE, "/org/fedoraproject/FirewallD1", @@ -295,6 +298,7 @@ virFirewallDApplyRule(virFirewallLayer layer, if (virGDBusCallMethod(sysbus, &reply, + G_VARIANT_TYPE("(s)"), error, VIR_FIREWALL_FIREWALLD_SERVICE, "/org/fedoraproject/FirewallD1", @@ -357,6 +361,7 @@ virFirewallDInterfaceSetZone(const char *iface, message = g_variant_new("(ss)", zone, iface); return virGDBusCallMethod(sysbus, + NULL, NULL, NULL, VIR_FIREWALL_FIREWALLD_SERVICE, diff --git a/src/util/virgdbus.c b/src/util/virgdbus.c index 535b19f0a4..837c8faf1f 100644 --- a/src/util/virgdbus.c +++ b/src/util/virgdbus.c @@ -181,6 +181,7 @@ virGDBusCloseSystemBus(void) * virGDBusCallMethod: * @conn: a DBus connection * @reply: pointer to receive reply message, or NULL + * @replyType: pointer to GVariantType to validate reply data, or NULL * @error: libvirt error pointer or NULL * @busName: bus identifier of the target service * @objectPath: object path of the target service @@ -198,6 +199,7 @@ virGDBusCloseSystemBus(void) int virGDBusCallMethod(GDBusConnection *conn, GVariant **reply, + const GVariantType *replyType, virErrorPtr error, const char *busName, const char *objectPath, @@ -220,7 +222,7 @@ virGDBusCallMethod(GDBusConnection *conn, ifaceName, method, data, - NULL, + replyType, G_DBUS_CALL_FLAGS_NONE, VIR_DBUS_METHOD_CALL_TIMEOUT_MILIS, NULL, @@ -250,6 +252,7 @@ virGDBusCallMethod(GDBusConnection *conn, int virGDBusCallMethodWithFD(GDBusConnection *conn, GVariant **reply, + const GVariantType *replyType, GUnixFDList **replyFD, virErrorPtr error, const char *busName, @@ -274,7 +277,7 @@ virGDBusCallMethodWithFD(GDBusConnection *conn, ifaceName, method, data, - NULL, + replyType, G_DBUS_CALL_FLAGS_NONE, VIR_DBUS_METHOD_CALL_TIMEOUT_MILIS, dataFD, @@ -342,6 +345,7 @@ virGDBusIsServiceInList(const char *listMethod, rc = virGDBusCallMethod(conn, &reply, + G_VARIANT_TYPE("(as)"), NULL, "org.freedesktop.DBus", "/org/freedesktop/DBus", diff --git a/src/util/virgdbus.h b/src/util/virgdbus.h index 6ea717eea2..ca7073e27c 100644 --- a/src/util/virgdbus.h +++ b/src/util/virgdbus.h @@ -45,6 +45,7 @@ virGDBusCloseSystemBus(void); int virGDBusCallMethod(GDBusConnection *conn, GVariant **reply, + const GVariantType *replyType, virErrorPtr error, const char *busName, const char *objectPath, @@ -55,6 +56,7 @@ virGDBusCallMethod(GDBusConnection *conn, int virGDBusCallMethodWithFD(GDBusConnection *conn, GVariant **reply, + const GVariantType *replyType, GUnixFDList **replyFD, virErrorPtr error, const char *busName, diff --git a/src/util/virpolkit.c b/src/util/virpolkit.c index 2ad00fd206..aad924a065 100644 --- a/src/util/virpolkit.c +++ b/src/util/virpolkit.c @@ -104,6 +104,7 @@ int virPolkitCheckAuth(const char *actionid, if (virGDBusCallMethod(sysbus, &reply, + G_VARIANT_TYPE("((bba{ss}))"), NULL, "org.freedesktop.PolicyKit1", "/org/freedesktop/PolicyKit1/Authority", diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c index 32c830c002..8456085476 100644 --- a/src/util/virsystemd.c +++ b/src/util/virsystemd.c @@ -214,6 +214,7 @@ virSystemdGetMachineNameByPID(pid_t pid) if (virGDBusCallMethod(conn, &reply, + G_VARIANT_TYPE("(o)"), NULL, "org.freedesktop.machine1", "/org/freedesktop/machine1", @@ -236,6 +237,7 @@ virSystemdGetMachineNameByPID(pid_t pid) if (virGDBusCallMethod(conn, &reply, + G_VARIANT_TYPE("(v)"), NULL, "org.freedesktop.machine1", object, @@ -384,6 +386,7 @@ int virSystemdCreateMachine(const char *name, gprops); rc = virGDBusCallMethod(conn, + NULL, NULL, error, "org.freedesktop.machine1", @@ -430,6 +433,7 @@ int virSystemdCreateMachine(const char *name, gprops); rc = virGDBusCallMethod(conn, + NULL, NULL, NULL, "org.freedesktop.machine1", @@ -457,6 +461,7 @@ int virSystemdCreateMachine(const char *name, gprops); rc = virGDBusCallMethod(conn, + NULL, NULL, NULL, "org.freedesktop.systemd1", @@ -507,6 +512,7 @@ int virSystemdTerminateMachine(const char *name) VIR_DEBUG("Attempting to terminate machine via systemd"); if (virGDBusCallMethod(conn, + NULL, NULL, error, "org.freedesktop.machine1", @@ -592,6 +598,7 @@ virSystemdPMSupportTarget(const char *methodName, bool *result) if (virGDBusCallMethod(conn, &reply, + G_VARIANT_TYPE("(s)"), NULL, "org.freedesktop.login1", "/org/freedesktop/login1",