[telepathy-mission-control/master] McdAccount: don't truncate to the range of gint when deserializing int64, uint32, uint64
Simon McVittie
simon.mcvittie at collabora.co.uk
Wed Jun 10 03:42:43 PDT 2009
---
src/mcd-account.c | 54 +++++++++++++++++++++++++++++++++++++---------------
1 files changed, 38 insertions(+), 16 deletions(-)
diff --git a/src/mcd-account.c b/src/mcd-account.c
index fc99c85..b04a269 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -367,8 +367,9 @@ get_parameter (McdAccount *account, const gchar *name, GValue *value)
if (value)
{
- gchar *v_string = NULL, **v_strings;
- gint v_int = 0;
+ gchar *v_string = NULL;
+ gint64 v_int = 0;
+ guint64 v_uint = 0;
gboolean v_bool = FALSE;
switch (G_VALUE_TYPE (value))
@@ -378,31 +379,49 @@ get_parameter (McdAccount *account, const gchar *name, GValue *value)
key, NULL);
g_value_take_string (value, v_string);
break;
+
case G_TYPE_INT:
v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
key, NULL);
g_value_set_int (value, v_int);
break;
+
case G_TYPE_INT64:
- v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
- key, NULL);
+ v_int = tp_g_key_file_get_int64 (priv->keyfile, priv->unique_name,
+ key, NULL);
g_value_set_int64 (value, v_int);
break;
+
case G_TYPE_UCHAR:
v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
key, NULL);
+
+ if (v_int < 0 || v_int > 0xFF)
+ {
+ return FALSE;
+ }
+
g_value_set_uchar (value, v_int);
break;
+
case G_TYPE_UINT:
- v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
- key, NULL);
- g_value_set_uint (value, v_int);
+ v_uint = tp_g_key_file_get_uint64 (priv->keyfile,
+ priv->unique_name, key, NULL);
+
+ if (v_uint > 0xFFFFFFFFU)
+ {
+ return FALSE;
+ }
+
+ g_value_set_uint (value, v_uint);
break;
+
case G_TYPE_UINT64:
- v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
- key, NULL);
- g_value_set_uint64 (value, v_int);
+ v_uint = tp_g_key_file_get_uint64 (priv->keyfile,
+ priv->unique_name, key, NULL);
+ g_value_set_uint64 (value, v_uint);
break;
+
case G_TYPE_BOOLEAN:
v_bool = g_key_file_get_boolean (priv->keyfile, priv->unique_name,
key, NULL);
@@ -411,15 +430,18 @@ get_parameter (McdAccount *account, const gchar *name, GValue *value)
default:
if (G_VALUE_HOLDS (value, G_TYPE_STRV))
{
- v_strings = g_key_file_get_string_list (priv->keyfile,
+ gchar **v = g_key_file_get_string_list (priv->keyfile,
priv->unique_name, key,
NULL, NULL);
- g_value_take_boxed (value, v_strings);
- break;
+
+ g_value_take_boxed (value, v);
+ }
+ else
+ {
+ g_warning ("%s: skipping parameter %s, unknown type %s",
+ G_STRFUNC, name, G_VALUE_TYPE_NAME (value));
+ return FALSE;
}
- g_warning ("%s: skipping parameter %s, unknown type %s", G_STRFUNC,
- name, G_VALUE_TYPE_NAME (value));
- return FALSE;
}
}
--
1.5.6.5
More information about the telepathy-commits
mailing list