Handle strfxrm returning -1 a little better. Problem pointed out by Takao
authorMatthias Clasen <matthiasc@src.gnome.org>
Wed, 11 Jun 2008 19:38:35 +0000 (19:38 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Wed, 11 Jun 2008 19:38:35 +0000 (19:38 +0000)
        * glib/gunicollate.c (g_utf8_collate_key): Handle strfxrm returning
        -1 a little better. Problem pointed out by Takao Fujiwara

svn path=/trunk/; revision=7015

ChangeLog
glib/gunicollate.c

index f382142..3a53dc7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-06-11  Matthias Clasen  <mclasen@redhat.com>
 
+       Bug 314453 – Nautilus crashes in Solaris when browsing the attached
+       file
+
+       * glib/gunicollate.c (g_utf8_collate_key): Handle strfxrm returning
+       -1 a little better. Problem pointed out by Takao Fujiwara
+
+2008-06-11  Matthias Clasen  <mclasen@redhat.com>
+
        Bug 529321 – make check fails in glib/pcre
 
        * glib/pcre/Makefile.am: include Makefile.decl to fix 'make check'.
index 32ff6dc..2bf579e 100644 (file)
@@ -414,11 +414,16 @@ g_utf8_collate_key (const gchar *str,
 
   str_norm = g_utf8_normalize (str, len, G_NORMALIZE_ALL_COMPOSE);
 
+  result = NULL;
+
   if (g_get_charset (&charset))
     {
       xfrm_len = strxfrm (NULL, str_norm, 0);
-      result = g_malloc (xfrm_len + 1);
-      strxfrm (result, str_norm, xfrm_len + 1);
+      if (xfrm_len >= 0 && xfrm_len < G_MAXINT - 2)
+        {
+          result = g_malloc (xfrm_len + 1);
+          strxfrm (result, str_norm, xfrm_len + 1);
+        }
     }
   else
     {
@@ -441,14 +446,15 @@ g_utf8_collate_key (const gchar *str,
          
          g_free (str_locale);
        }
-      else
-       {
-         xfrm_len = strlen (str_norm);
-         result = g_malloc (xfrm_len + 2);
-         result[0] = 'B';
-         memcpy (result + 1, str_norm, xfrm_len);
-         result[xfrm_len+1] = '\0';
-       }
+    }
+    
+  if (!result) 
+    {
+      xfrm_len = strlen (str_norm);
+      result = g_malloc (xfrm_len + 2);
+      result[0] = 'B';
+      memcpy (result + 1, str_norm, xfrm_len);
+      result[xfrm_len+1] = '\0';
     }
 
   g_free (str_norm);