[gnome-control-center/gnome-3-12] sharing: Avoid truncated folders list in media sharing



commit 3843a2e30e7d39441e5036d72da8bc8fb5052b8a
Author: Bastien Nocera <hadess hadess net>
Date:   Mon Jul 21 19:12:05 2014 +0200

    sharing: Avoid truncated folders list in media sharing
    
    When XDG user dirs are badly setup, and the folders list contains items
    such as @VIDEOS@ or @MUSIC@, g_get_user_special_dir() returns NULL and
    we would insert NULL into the string array. That would cause the code
    reading it to assume the end of the array was reached.
    
    Go through a temporary array instead to build it.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=733489

 panels/sharing/cc-media-sharing.c |   41 +++++++++++++++++++-----------------
 1 files changed, 22 insertions(+), 19 deletions(-)
---
diff --git a/panels/sharing/cc-media-sharing.c b/panels/sharing/cc-media-sharing.c
index 4588e1a..95cbdd6 100644
--- a/panels/sharing/cc-media-sharing.c
+++ b/panels/sharing/cc-media-sharing.c
@@ -127,34 +127,37 @@ cc_media_sharing_get_preferences (gboolean   *enabled,
   if (folders)
     {
       gsize length;
-      gchar **str_list;
+      GPtrArray *array;
+      char **str_list, **orig_list;
 
       str_list = g_key_file_get_string_list (file, "MediaExport", "uris",
                                              &length, NULL);
-
-      *folders = str_list;
+      orig_list = str_list;
+      array = g_ptr_array_new ();
 
       while (str_list && *str_list)
         {
+          const char *dir;
+
           if (g_str_equal (*str_list, "@MUSIC@"))
-            {
-              g_free (*str_list);
-              *str_list = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_MUSIC));
-            }
-
-          if (g_str_equal (*str_list, "@VIDEOS@"))
-            {
-              g_free (*str_list);
-              *str_list = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS));
-            }
-
-          if (g_str_equal (*str_list, "@PICTURES@"))
-            {
-              g_free (*str_list);
-              *str_list = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_PICTURES));
-            }
+            dir = g_get_user_special_dir (G_USER_DIRECTORY_MUSIC);
+         else if (g_str_equal (*str_list, "@VIDEOS@"))
+            dir = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS);
+         else if (g_str_equal (*str_list, "@PICTURES@"))
+            dir = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
+         else
+           dir = g_strdup (*str_list);
+
+          if (dir != NULL)
+            g_ptr_array_add (array, g_strdup (dir));
+
           str_list++;
         }
+
+      g_ptr_array_add (array, NULL);
+
+      *folders = (char **) g_ptr_array_free (array, FALSE);
+      g_strfreev (orig_list);
     }
 
   g_key_file_free (file);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]