summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2014-01-14 11:22:34 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2014-01-14 11:24:22 +0000
commitee0f90d5d619ef53f30edbbeb19c7b6a5055a84b (patch)
tree38fc3efc70f716d45be739e89bcd4d22d7a82c6f
parentf1311ce39c6bcab1e25de20eb684bb78cce56e59 (diff)
downloaddbus-glib-ee0f90d5d619ef53f30edbbeb19c7b6a5055a84b.tar.gz
dbus-binding-tool: check for valid interface, member and property names
Properties are currently allowed to be arbitrary UTF-8 since this matches dbus-glib's runtime behaviour, although ideally new interfaces should use the more restrictive member naming rules (leading to names like MyProperty) for interop with QtDBus. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=7909 Reviewed-by: Cosimo Alfarano <cosimo.alfarano@collabora.co.uk>
-rw-r--r--dbus/dbus-gidl.c11
-rw-r--r--dbus/dbus-gparser.c36
2 files changed, 46 insertions, 1 deletions
diff --git a/dbus/dbus-gidl.c b/dbus/dbus-gidl.c
index b5293bd..cde4d79 100644
--- a/dbus/dbus-gidl.c
+++ b/dbus/dbus-gidl.c
@@ -26,6 +26,8 @@
#include "dbus-gidl.h"
+#include <gio/gio.h>
+
struct BaseInfo
{
unsigned int refcount : 28;
@@ -342,6 +344,8 @@ interface_info_new (const char *name)
{
InterfaceInfo *info;
+ g_return_val_if_fail (g_dbus_is_interface_name (name), NULL);
+
info = g_new0 (InterfaceInfo, 1);
info->base.refcount = 1;
info->base.name = g_strdup (name);
@@ -467,6 +471,8 @@ method_info_new (const char *name)
{
MethodInfo *info;
+ g_return_val_if_fail (g_dbus_is_member_name (name), NULL);
+
info = g_new0 (MethodInfo, 1);
info->base.refcount = 1;
info->base.name = g_strdup (name);
@@ -573,6 +579,8 @@ signal_info_new (const char *name)
{
SignalInfo *info;
+ g_return_val_if_fail (g_dbus_is_member_name (name), NULL);
+
info = g_new0 (SignalInfo, 1);
info->base.refcount = 1;
info->base.name = g_strdup (name);
@@ -637,6 +645,9 @@ property_info_new (const char *name,
{
PropertyInfo *info;
+ g_return_val_if_fail (g_utf8_validate (name, -1, NULL), NULL);
+ g_return_val_if_fail (g_variant_is_signature (type), NULL);
+
info = g_new0 (PropertyInfo, 1);
info->base.refcount = 1;
info->base.name = g_strdup (name);
diff --git a/dbus/dbus-gparser.c b/dbus/dbus-gparser.c
index 2e0668e..af74e30 100644
--- a/dbus/dbus-gparser.c
+++ b/dbus/dbus-gparser.c
@@ -30,6 +30,8 @@
#include "dbus/dbus-signature.h"
#include <string.h>
+#include <gio/gio.h>
+
#define ELEMENT_IS(name) (strcmp (element_name, (name)) == 0)
typedef struct
@@ -352,6 +354,14 @@ parse_interface (Parser *parser,
return FALSE;
}
+ if (!g_dbus_is_interface_name (name))
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_PARSE,
+ "\"%s\" is not a valid D-Bus interface name", name);
+ return FALSE;
+ }
+
top = parser->node_stack->data;
iface = interface_info_new (name);
@@ -404,6 +414,14 @@ parse_method (Parser *parser,
return FALSE;
}
+ if (!g_dbus_is_member_name (name))
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_PARSE,
+ "\"%s\" is not a valid D-Bus member name", name);
+ return FALSE;
+ }
+
method = method_info_new (name);
interface_info_add_method (parser->interface, method);
method_info_unref (method);
@@ -454,6 +472,14 @@ parse_signal (Parser *parser,
return FALSE;
}
+ if (!g_dbus_is_member_name (name))
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_PARSE,
+ "\"%s\" is not a valid D-Bus member name", name);
+ return FALSE;
+ }
+
signal = signal_info_new (name);
interface_info_add_signal (parser->interface, signal);
signal_info_unref (signal);
@@ -562,7 +588,15 @@ parse_property (Parser *parser,
access, element_name);
return FALSE;
}
-
+
+ if (!g_utf8_validate (name, -1, NULL))
+ {
+ g_set_error (error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_PARSE,
+ "\"%s\" is not UTF-8", name);
+ return FALSE;
+ }
+
property = property_info_new (name, type, access_flags);
interface_info_add_property (parser->interface, property);
property_info_unref (property);