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 f382142f294bd6937349333af4362f978c2dc655..3a53dc7974b427dff70497a383eefd4377685623 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+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
index 32ff6dc57ea8a13f60e8c9c4a6fcda29709cc45b..2bf579ecaebfcf49736d58a8f865f40ac67cc73b 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);