[Xfce4-commits] [xfce/xfconf] 03/05: Lot of Xfce's component used to set GPtrArray using g_value_set_boxed in their _get_property (of a GObject) followed by xfconf_array_free.

noreply at xfce.org noreply at xfce.org
Mon Jul 24 13:57:08 CEST 2017


This is an automated email from the git hooks/post-receive script.

a   l   i       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository xfce/xfconf.

commit 08efa5e3ca634b5da50591a629c33aeec99b1f72
Author: Ali Abdallah <ali at xfce.org>
Date:   Mon Jul 24 13:51:10 2017 +0200

    Lot of Xfce's component used to set GPtrArray using g_value_set_boxed
    in their _get_property (of a GObject) followed by xfconf_array_free.
    
    This has been working ok with dbus-glib binding for some reason, but
    with the new code it does not. It causes xfconf_gvalue_to_gvariant
    to get an array of len=0.
    
    A check has been added to warn on invalid arrays.
---
 common/xfconf-gvaluefuncs.c | 103 +++++++++++++++++++++++---------------------
 1 file changed, 53 insertions(+), 50 deletions(-)

diff --git a/common/xfconf-gvaluefuncs.c b/common/xfconf-gvaluefuncs.c
index dcd3163..f2bcae8 100644
--- a/common/xfconf-gvaluefuncs.c
+++ b/common/xfconf-gvaluefuncs.c
@@ -49,7 +49,7 @@
 
 #ifdef CHAR_MIN
 #define XFCONF_MINCHAR  CHAR_MIN
-#else 
+#else
 #define XFCONF_MINCHAR  (-128)
 #endif
 
@@ -150,7 +150,7 @@ _xfconf_gvalue_from_string(GValue *value,
 #define CHECK_CONVERT_VALUE(val, minval, maxval) \
     if((val) < (minval) || (val) > (maxval)) \
         return FALSE
-    
+
 #define REAL_HANDLE_INT(minval, maxval, convertfunc, setfunc) \
     G_STMT_START{ \
         errno = 0; \
@@ -165,17 +165,17 @@ _xfconf_gvalue_from_string(GValue *value,
 
 #define HANDLE_UINT(minval, maxval, setfunc)  REAL_HANDLE_INT(minval, maxval, strtoul, setfunc)
 #define HANDLE_INT(minval, maxval, setfunc)  REAL_HANDLE_INT(minval, maxval, strtol, setfunc)
-    
+
     guint64 uintval;
     gint64 intval;
     gdouble dval;
     gchar *endptr = NULL;
-    
+
     switch(G_VALUE_TYPE(value)) {
         case G_TYPE_STRING:
             g_value_set_string(value, str);
             return TRUE;
-        
+
         case G_TYPE_UCHAR:
             HANDLE_UINT(0, XFCONF_MAXUCHAR, g_value_set_uchar);
         case G_TYPE_CHAR:
@@ -188,7 +188,7 @@ _xfconf_gvalue_from_string(GValue *value,
             HANDLE_UINT(0, G_MAXUINT, g_value_set_uint);
         case G_TYPE_INT:
             HANDLE_INT(G_MININT, G_MAXINT, g_value_set_int);
-        
+
         case G_TYPE_UINT64:
             errno = 0;
             uintval = g_ascii_strtoull(str, &endptr, 0);
@@ -197,7 +197,7 @@ _xfconf_gvalue_from_string(GValue *value,
             CHECK_CONVERT_STATUS();
             g_value_set_uint64(value, uintval);
             return TRUE;
-        
+
         case G_TYPE_INT64:
             errno = 0;
             intval = g_ascii_strtoll(str, &endptr, 0);
@@ -206,7 +206,7 @@ _xfconf_gvalue_from_string(GValue *value,
             CHECK_CONVERT_STATUS();
             g_value_set_int64(value, intval);
             return TRUE;
-        
+
         case G_TYPE_FLOAT:
             errno = 0;
             dval = g_ascii_strtod(str, &endptr);
@@ -217,7 +217,7 @@ _xfconf_gvalue_from_string(GValue *value,
                 return FALSE;
             g_value_set_float(value, (gfloat)dval);
             return TRUE;
-        
+
         case G_TYPE_DOUBLE:
             errno = 0;
             dval = g_ascii_strtod(str, &endptr);
@@ -226,7 +226,7 @@ _xfconf_gvalue_from_string(GValue *value,
             CHECK_CONVERT_STATUS();
             g_value_set_double(value, dval);
             return TRUE;
-        
+
         case G_TYPE_BOOLEAN:
             if(!strcmp(str, "true")) {
                 g_value_set_boolean(value, TRUE);
@@ -236,7 +236,7 @@ _xfconf_gvalue_from_string(GValue *value,
                 return TRUE;
             } else
                 return FALSE;
-        
+
         default:
             if(XFCONF_TYPE_UINT16 == G_VALUE_TYPE(value)) {
                 HANDLE_INT(0, G_MAXUSHORT, xfconf_g_value_set_uint16);
@@ -368,9 +368,9 @@ _xfconf_gvalue_free(GValue *value)
 
 GVariant *
 xfconf_basic_gvalue_to_gvariant (const GValue *value) {
-   
+
     const GVariantType *type = NULL;
-    
+
     switch (G_VALUE_TYPE(value)){
     case G_TYPE_UINT:
         type = G_VARIANT_TYPE_UINT32;
@@ -403,15 +403,15 @@ xfconf_basic_gvalue_to_gvariant (const GValue *value) {
             type = G_VARIANT_TYPE_UINT16;
         break;
     }
-    
+
     if (type) {
         return g_dbus_gvalue_to_gvariant (value, type);
-    } 
+    }
     /* there is no g_variant_type_char! */
     else if (G_VALUE_TYPE(value) == G_TYPE_CHAR) {
         return g_variant_ref_sink(g_variant_new_int16(g_value_get_schar(value)));
     }
-        
+
     g_warning ("Unable to convert GType '%s' to GVariant", _xfconf_string_from_gtype(G_VALUE_TYPE(value)));
 
     return NULL;
@@ -475,33 +475,36 @@ xfconf_gvalue_to_gvariant (const GValue *value)
         GPtrArray *arr;
         GVariantBuilder builder;
         guint i = 0;
-        
+
         g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
-        
+
         arr = (GPtrArray*)g_value_get_boxed (value);
-        
+
+        /* Check for array and that the array has at least one element */
+        g_return_val_if_fail (arr && arr->len != 0, NULL);
+
         for (i=0; i < arr->len; ++i) {
             GValue *v = g_ptr_array_index (arr, i);
             GVariant *var = NULL;
-            
+
             var = xfconf_basic_gvalue_to_gvariant (v);
             if (var) {
                 g_variant_builder_add (&builder, "v", var, NULL);
                 g_variant_unref (var);
             }
         }
-        
+
         variant = g_variant_ref_sink(g_variant_builder_end (&builder));
     }
     else if (G_VALUE_TYPE(value) == G_TYPE_STRV) {
         gchar **strlist;
-        
+
         strlist = g_value_get_boxed(value);
         variant = g_variant_ref_sink(g_variant_new_strv ((const gchar**)strlist, g_strv_length(strlist)));
     }
     else
         variant = xfconf_basic_gvalue_to_gvariant(value);
-    
+
     return variant;
 }
 
@@ -512,26 +515,26 @@ GVariant *xfconf_hash_to_gvariant (GHashTable *hash)
     GVariant *variant;
     const gchar *key;
     const GValue *value;
-    
+
     g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
-    
+
     g_hash_table_iter_init (&iter, hash);
-        
+
     while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&value)) {
         GVariant *v;
-        
+
         if (G_VALUE_TYPE (value) == G_TYPE_PTR_ARRAY) {
             GPtrArray *arr;
             GVariantBuilder arr_builder;
             uint i;
-            
+
             arr = g_value_get_boxed(value);
-            
+
             g_variant_builder_init (&arr_builder, G_VARIANT_TYPE ("av"));
-            
+
             for (i = 0; i < arr->len; ++i) {
                 GValue *item_value = g_ptr_array_index(arr, i);
-                
+
                 if(item_value)
                 {
                     v = xfconf_basic_gvalue_to_gvariant(item_value);
@@ -541,19 +544,19 @@ GVariant *xfconf_hash_to_gvariant (GHashTable *hash)
                     }
                 }
             }
-            
+
             v = g_variant_builder_end (&arr_builder);
             g_variant_builder_add (&builder, "{sv}", key, v);
-        } 
+        }
         else if (G_VALUE_TYPE (value) == G_TYPE_STRV) {
             gchar **strlist;
-            
+
             strlist = g_value_get_boxed(value);
             variant = g_variant_new_strv ((const gchar**)strlist, g_strv_length(strlist));
             g_variant_builder_add (&builder, "{sv}", key, variant);
         }
         else {
-            
+
             v = xfconf_basic_gvalue_to_gvariant(value);
             if (v) {
                 g_variant_builder_add (&builder, "{sv}", key, v);
@@ -613,28 +616,28 @@ GValue * xfconf_gvariant_to_gvalue (GVariant *in_variant)
         GVariant *var;
         gsize nchild;
         gsize idx = 0;
-            
+
         nchild = g_variant_n_children (variant);
-            
+
         if (nchild > 0) {
             arr = g_ptr_array_new_full(nchild, (GDestroyNotify)xfonf_free_array_elem_val);
-            
+
             while (idx < nchild ) {
                 GVariant *v;
                 GValue *arr_val;
-                
+
                 arr_val = g_new0(GValue, 1);
-                
+
                 var = g_variant_get_child_value (variant, idx);
                 v = g_variant_get_variant (var);
                 xfconf_basic_gvariant_to_gvalue (v, arr_val);
-                    
+
                 g_variant_unref (v);
                 g_variant_unref (var);
                 g_ptr_array_add (arr, arr_val);
                 idx++;
             }
-            
+
             g_value_init(value, G_TYPE_PTR_ARRAY);
             g_value_take_boxed(value, arr);
         }
@@ -646,29 +649,29 @@ GValue * xfconf_gvariant_to_gvalue (GVariant *in_variant)
     else {/* Should be a basic type */
         xfconf_basic_gvariant_to_gvalue(variant, value);
     }
-    
+
     return value;
 }
-    
+
 GHashTable *xfconf_gvariant_to_hash (GVariant *variant)
 {
     GHashTable *properties;
     GVariantIter iter;
     GVariant *v;
     gchar *key;
-    
+
     g_return_val_if_fail (g_variant_is_of_type(variant, G_VARIANT_TYPE ("a{sv}")), NULL);
-    
+
     properties = g_hash_table_new_full(g_str_hash, g_str_equal,
                                        (GDestroyNotify)g_free,(GDestroyNotify)_xfconf_gvalue_free);
-    
+
     g_variant_iter_init (&iter, variant);
-        
+
     while (g_variant_iter_next (&iter, "{sv}", &key, &v)) {
         GValue *value;
-        
+
         value = xfconf_gvariant_to_gvalue (v);
-        g_hash_table_insert (properties, 
+        g_hash_table_insert (properties,
                              g_strdup(key),
                              value);
         g_variant_unref (v);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list