[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