Don't assume filenames are UTF-8.
authorMatthias Clasen <matthiasc@src.gnome.org>
Fri, 9 Jan 2009 05:19:17 +0000 (05:19 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 9 Jan 2009 05:19:17 +0000 (05:19 +0000)
        * xdgmime/xdgmimecache.c:
        * xdgmime/xdgmimeglob.c: Don't assume filenames are UTF-8.

svn path=/trunk/; revision=7784

gio/ChangeLog
gio/xdgmime/xdgmimecache.c
gio/xdgmime/xdgmimeglob.c

index 3cf89c3..e2d5664 100644 (file)
@@ -1,5 +1,13 @@
 2009-01-08  Matthias Clasen  <mclasen@redhat.com>
 
+       Bug 565484 – g_content_type_guess passes non-UTF8 text to XDG 
+       functions in non-UTF8 locale
+
+       * xdgmime/xdgmimecache.c:
+       * xdgmime/xdgmimeglob.c: Don't assume filenames are UTF-8.
+
+2009-01-08  Matthias Clasen  <mclasen@redhat.com>
+
        * xdgmime/test-mime.c: Make tests work with current shared-mime-info.
 
 2009-01-07  Matthias Clasen  <mclasen@redhat.com>
index c93472e..5bdac5b 100644 (file)
@@ -31,6 +31,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <ctype.h>
 
 #include <fcntl.h>
 #include <unistd.h>
@@ -439,7 +440,7 @@ static int
 cache_glob_node_lookup_suffix (XdgMimeCache  *cache,
                               xdg_uint32_t   n_entries,
                               xdg_uint32_t   offset,
-                              xdg_unichar_t *file_name,
+                              const char    *file_name,
                               int            len,
                               int            ignore_case,
                               MimeWeight     mime_types[],
@@ -456,7 +457,7 @@ cache_glob_node_lookup_suffix (XdgMimeCache  *cache,
 
   character = file_name[len - 1];
   if (ignore_case)
-    character = _xdg_ucs4_to_lower (character);
+    character = tolower (character);
 
   assert (character != 0);
 
@@ -511,11 +512,11 @@ cache_glob_node_lookup_suffix (XdgMimeCache  *cache,
 }
 
 static int
-cache_glob_lookup_suffix (xdg_unichar_t *file_name,
-                         int            len,
-                         int            ignore_case,
-                         MimeWeight     mime_types[],
-                         int            n_mime_types)
+cache_glob_lookup_suffix (const char *file_name,
+                         int         len,
+                         int         ignore_case,
+                         MimeWeight  mime_types[],
+                         int         n_mime_types)
 {
   int i, n;
 
@@ -557,7 +558,6 @@ cache_glob_lookup_file_name (const char *file_name,
   MimeWeight mimes[10];
   int n_mimes = 10;
   int i;
-  xdg_unichar_t *ucs4;
   int len;
   
   assert (file_name != NULL && n_mime_types > 0);
@@ -567,12 +567,11 @@ cache_glob_lookup_file_name (const char *file_name,
   if (n > 0)
     return n;
 
-  ucs4 = _xdg_convert_to_ucs4 (file_name, &len);
-  n = cache_glob_lookup_suffix (ucs4, len, FALSE, mimes, n_mimes);
+  len = strlen (file_name);
+  n = cache_glob_lookup_suffix (file_name, len, FALSE, mimes, n_mimes);
 
   if (n == 0)
-    n = cache_glob_lookup_suffix (ucs4, len, TRUE, mimes, n_mimes);
-  free(ucs4);
+    n = cache_glob_lookup_suffix (file_name, len, TRUE, mimes, n_mimes);
   
   /* Last, try fnmatch */
   if (n == 0)
index 9aa9ad9..22acd3e 100644 (file)
@@ -36,6 +36,7 @@
 #include <assert.h>
 #include <string.h>
 #include <fnmatch.h>
+#include <ctype.h>
 
 #ifndef        FALSE
 #define        FALSE   (0)
@@ -297,7 +298,7 @@ typedef struct {
 
 static int
 _xdg_glob_hash_node_lookup_file_name (XdgGlobHashNode *glob_hash_node,
-                                     xdg_unichar_t   *file_name,
+                                     const char      *file_name,
                                      int              len,
                                      int              ignore_case,
                                      MimeWeight       mime_types[],
@@ -312,7 +313,7 @@ _xdg_glob_hash_node_lookup_file_name (XdgGlobHashNode *glob_hash_node,
 
   character = file_name[len - 1];
   if (ignore_case)
-    character = _xdg_ucs4_to_lower(character);
+    character = tolower(character);
 
   for (node = glob_hash_node; node && character >= node->character; node = node->next)
     {
@@ -392,15 +393,13 @@ _xdg_glob_hash_lookup_file_name (XdgGlobHash *glob_hash,
        }
     }
 
-  ucs4 = _xdg_convert_to_ucs4 (file_name, &len);
-  n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, ucs4, len, FALSE,
+  len = strlen (file_name);
+  n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, file_name, len, FALSE,
                                            mimes, n_mimes);
   if (n == 0)
-    n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, ucs4, len, TRUE,
+    n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, file_name, len, TRUE,
                                              mimes, n_mimes);
-  free(ucs4);
 
-  /* FIXME: Not UTF-8 safe */
   if (n == 0)
     {
       for (list = glob_hash->full_list; list && n < n_mime_types; list = list->next)