diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2012-08-06 11:57:35 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2012-08-06 19:50:06 +0100 |
commit | 923ba61a282bc1b452334b2b1f3ab800d3abe443 (patch) | |
tree | a28a560a68036537a53a1a5b50f20118176e4a3c | |
parent | 062603aade207d943b9a1c9f84be65919475656f (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.c | 20 | ||||
-rw-r--r-- | salut/status.c | 22 |
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); } |