summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2012-08-06 11:57:35 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2012-08-06 19:50:06 +0100
commit923ba61a282bc1b452334b2b1f3ab800d3abe443 (patch)
treea28a560a68036537a53a1a5b50f20118176e4a3c
parent062603aade207d943b9a1c9f84be65919475656f (diff)
*/status.c: don't crash if form fields have unexpected types
FORM_TYPE should be hidden, type should be text-single, and name and caps should be text-multi. This is significant because if the types of name and caps are not explicitly specified in the message, Wocky will guess. If there is only one value, it will guess text-single, and the GValue will contain G_TYPE_STRING, not G_TYPE_STRV, causing a crash when we call g_value_get_boxed. Reviewed-by: Olli Salli <olli.salli@collabora.co.uk> Bug: https://bugs.freedesktop.org/show_bug.cgi?id=45236
-rw-r--r--gabble/status.c20
-rw-r--r--salut/status.c22
2 files changed, 25 insertions, 17 deletions
diff --git a/gabble/status.c b/gabble/status.c
index 8b254f6..9dcd7e6 100644
--- a/gabble/status.c
+++ b/gabble/status.c
@@ -341,25 +341,28 @@ contact_capabilities_changed (YtstStatus *self,
gchar **yts_caps;
type = g_hash_table_lookup (form->fields, "FORM_TYPE");
- form_type = g_value_get_string (type->default_value);
if (type == NULL
- || !g_str_has_prefix (form_type, SERVICE_PREFIX))
- {
- continue;
- }
+ || type->type != WOCKY_DATA_FORM_FIELD_TYPE_HIDDEN)
+ continue;
+
+ form_type = g_value_get_string (type->default_value);
+
+ if (!g_str_has_prefix (form_type, SERVICE_PREFIX))
+ continue;
service = form_type + strlen (SERVICE_PREFIX);
/* service type */
tmp = g_hash_table_lookup (form->fields, "type");
- if (tmp == NULL)
+ if (tmp == NULL || tmp->type != WOCKY_DATA_FORM_FIELD_TYPE_TEXT_SINGLE)
continue;
yts_service_name = g_value_dup_string (tmp->default_value);
/* name map */
tmp = g_hash_table_lookup (form->fields, "name");
- if (tmp != NULL && tmp->default_value != NULL)
+ if (tmp != NULL && tmp->default_value != NULL &&
+ tmp->type == WOCKY_DATA_FORM_FIELD_TYPE_TEXT_MULTI)
{
yts_name_map = get_name_map_from_strv (
g_value_get_boxed (tmp->default_value));
@@ -371,7 +374,8 @@ contact_capabilities_changed (YtstStatus *self,
/* caps */
tmp = g_hash_table_lookup (form->fields, "capabilities");
- if (tmp != NULL && tmp->default_value != NULL)
+ if (tmp != NULL && tmp->default_value != NULL &&
+ tmp->type == WOCKY_DATA_FORM_FIELD_TYPE_TEXT_MULTI)
{
yts_caps = g_strdupv (tmp->raw_value_contents);
}
diff --git a/salut/status.c b/salut/status.c
index d628308..b65d577 100644
--- a/salut/status.c
+++ b/salut/status.c
@@ -344,25 +344,28 @@ contact_capabilities_changed (YtstStatus *self,
gchar **yts_caps;
type = g_hash_table_lookup (form->fields, "FORM_TYPE");
- form_type = g_value_get_string (type->default_value);
if (type == NULL
- || !g_str_has_prefix (form_type, SERVICE_PREFIX))
- {
- continue;
- }
+ || type->type != WOCKY_DATA_FORM_FIELD_TYPE_HIDDEN)
+ continue;
+
+ form_type = g_value_get_string (type->default_value);
+
+ if (!g_str_has_prefix (form_type, SERVICE_PREFIX))
+ continue;
service = form_type + strlen (SERVICE_PREFIX);
/* service type */
tmp = g_hash_table_lookup (form->fields, "type");
- if (tmp == NULL)
+ if (tmp == NULL || tmp->type != WOCKY_DATA_FORM_FIELD_TYPE_TEXT_SINGLE)
continue;
yts_service_name = g_value_dup_string (tmp->default_value);
- /* name map */
tmp = g_hash_table_lookup (form->fields, "name");
- if (tmp != NULL && tmp->default_value != NULL)
+
+ if (tmp != NULL && tmp->default_value != NULL &&
+ tmp->type == WOCKY_DATA_FORM_FIELD_TYPE_TEXT_MULTI)
{
yts_name_map = get_name_map_from_strv (
g_value_get_boxed (tmp->default_value));
@@ -374,7 +377,8 @@ contact_capabilities_changed (YtstStatus *self,
/* caps */
tmp = g_hash_table_lookup (form->fields, "capabilities");
- if (tmp != NULL && tmp->default_value != NULL)
+ if (tmp != NULL && tmp->default_value != NULL &&
+ tmp->type == WOCKY_DATA_FORM_FIELD_TYPE_TEXT_MULTI)
{
yts_caps = g_strdupv (tmp->raw_value_contents);
}