Don't read past the end of the string. (#334471, Morten Welinder)
authorMatthias Clasen <mclasen@redhat.com>
Tue, 14 Mar 2006 17:56:27 +0000 (17:56 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Tue, 14 Mar 2006 17:56:27 +0000 (17:56 +0000)
2006-03-14  Matthias Clasen  <mclasen@redhat.com>

* glib/gutils.c (g_parse_debug_string): Don't read past the
end of the string.  (#334471, Morten Welinder)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
glib/gutils.c
tests/testglib.c

index c97d3d5..48a7e3d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2006-03-14  Matthias Clasen  <mclasen@redhat.com>
 
+       * glib/gutils.c (g_parse_debug_string): Don't read past the
+       end of the string.  (#334471, Morten Welinder)
+
+       * tests/testglib.c (test_g_parse_debug_string): Add testss
+       for g_parse_debug_string.
+
        * glib/goption.c (parse_short_option): Don't create the
        option_name twice.  (#334519, Chris Wilson)
 
index c97d3d5..48a7e3d 100644 (file)
@@ -1,5 +1,11 @@
 2006-03-14  Matthias Clasen  <mclasen@redhat.com>
 
+       * glib/gutils.c (g_parse_debug_string): Don't read past the
+       end of the string.  (#334471, Morten Welinder)
+
+       * tests/testglib.c (test_g_parse_debug_string): Add testss
+       for g_parse_debug_string.
+
        * glib/goption.c (parse_short_option): Don't create the
        option_name twice.  (#334519, Chris Wilson)
 
index c97d3d5..48a7e3d 100644 (file)
@@ -1,5 +1,11 @@
 2006-03-14  Matthias Clasen  <mclasen@redhat.com>
 
+       * glib/gutils.c (g_parse_debug_string): Don't read past the
+       end of the string.  (#334471, Morten Welinder)
+
+       * tests/testglib.c (test_g_parse_debug_string): Add testss
+       for g_parse_debug_string.
+
        * glib/goption.c (parse_short_option): Don't create the
        option_name twice.  (#334519, Chris Wilson)
 
index 83ab9b1..eba093e 100644 (file)
@@ -591,23 +591,21 @@ g_parse_debug_string  (const gchar     *string,
     {
       const gchar *p = string;
       const gchar *q;
-      gboolean done = FALSE;
       
-      while (*p && !done)
+      while (*p)
        {
          q = strchr (p, ':');
          if (!q)
-           {
-             q = p + strlen(p);
-             done = TRUE;
-           }
+           q = p + strlen(p);
          
-         for (i=0; i<nkeys; i++)
+         for (i = 0; i < nkeys; i++)
            if (g_ascii_strncasecmp (keys[i].key, p, q - p) == 0 &&
                keys[i].key[q - p] == '\0')
              result |= keys[i].value;
          
-         p = q + 1;
+         p = q;
+         if (*p == ':')
+           p++;
        }
     }
   
index c9f3115..42f4fce 100644 (file)
@@ -432,6 +432,31 @@ test_g_mkdir_with_parents (void)
   return TRUE;
 }
 
+static void
+test_g_parse_debug_string (void)
+{
+  GDebugKey keys[3] = { 
+    { "foo", 1 },
+    { "bar", 2 },
+    { "baz", 4 }
+  };
+  guint n_keys = 3;
+  guint result;
+  
+  result = g_parse_debug_string ("bar:foo:blubb", keys, n_keys);
+  g_assert (result == 3);
+
+  result = g_parse_debug_string (":baz::_E@~!_::", keys, n_keys);
+  g_assert (result == 4);
+
+  result = g_parse_debug_string ("", keys, n_keys);
+  g_assert (result == 0);
+
+  result = g_parse_debug_string (" : ", keys, n_keys);
+  g_assert (result == 0);
+}
+
+
 int
 main (int   argc,
       char *argv[])
@@ -1488,7 +1513,9 @@ main (int   argc,
   close (fd);
   g_clear_error (&error);
   remove (name_used);
-  
+
+  test_g_parse_debug_string ();
+
   return 0;
 }