[glib] Fix bug in strinfo



commit a7689537605ade51b19be76baa3fba303527483d
Author: Ryan Lortie <desrt desrt ca>
Date:   Sat Jun 19 11:38:57 2010 -0400

    Fix bug in strinfo
    
    We can't search for a larger needle inside of a smaller haystack, and
    unsigned integer subtraction tends to result in very large numbers
    rather than small ones.
    
    Add a check for this case and abort out immediately.
    
    Also add a test case (lifted directly from the docs) that demonstrates
    the problem.
    
    Issue discovered and tracked down by Milan Bouchet-Valat

 gio/strinfo.c                                |    3 ++
 gio/tests/gschema-compile.c                  |    3 +-
 gio/tests/schema-tests/from-docs.gschema.xml |   34 ++++++++++++++++++++++++++
 3 files changed, 39 insertions(+), 1 deletions(-)
---
diff --git a/gio/strinfo.c b/gio/strinfo.c
index 9ba18aa..f762fc5 100644
--- a/gio/strinfo.c
+++ b/gio/strinfo.c
@@ -147,6 +147,9 @@ strinfo_scan (const guint32 *strinfo,
 {
   guint i = 0;
 
+  if (length < n_words)
+    return -1;
+
   while (i <= length - n_words)
     {
       guint j = 0;
diff --git a/gio/tests/gschema-compile.c b/gio/tests/gschema-compile.c
index 477bab9..48d0ffb 100644
--- a/gio/tests/gschema-compile.c
+++ b/gio/tests/gschema-compile.c
@@ -91,7 +91,8 @@ static const SchemaTest tests[] = {
   { "range-high-default",           NULL, "*<default> is not contained in the specified range*" },
   { "range-default-low",            NULL, "*<default> is not contained in the specified range*" },
   { "range-default-high",           NULL, "*<default> is not contained in the specified range*" },
-  { "range-parse-error",            NULL, "*invalid character in number*"                       }
+  { "range-parse-error",            NULL, "*invalid character in number*"                       },
+  { "from-docs",                    NULL, NULL                                                  }
 };
 
 int
diff --git a/gio/tests/schema-tests/from-docs.gschema.xml b/gio/tests/schema-tests/from-docs.gschema.xml
new file mode 100644
index 0000000..4fe45c7
--- /dev/null
+++ b/gio/tests/schema-tests/from-docs.gschema.xml
@@ -0,0 +1,34 @@
+<schemalist>
+  <!-- from the GSettings docs.  Should work, I guess :) -->
+
+  <enum id="myenum">
+    <value nick="first" value="1"/>
+    <value nick="second" value="2"/>
+  </enum>
+
+  <schema id="org.gtk.test">
+
+    <key name="key-with-range" type="i">
+      <range min="1" max="100"/>
+      <default>10</default>
+    </key>
+
+    <key name="key-with-choices" type="s">
+      <choices>
+        <choice value='Elisabeth'/>
+        <choice value='Annabeth'/>
+        <choice value='Joe'/>
+      </choices>
+      <aliases>
+        <alias value='Anna' target='Annabeth'/>
+        <alias value='Beth' target='Elisabeth'/>
+      </aliases>
+      <default>'Joe'</default>
+    </key>
+
+    <key name='enumerated-key' enum='myenum'>
+      <default>'first'</default>
+    </key>
+
+  </schema>
+</schemalist>



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