[glib/glib-2-32] GVariant: fix string validation
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/glib-2-32] GVariant: fix string validation
- Date: Sat, 14 Jul 2012 23:23:46 +0000 (UTC)
commit 3f0ed5c26b6adbda0d5384c897a3b3d6e9858536
Author: Ryan Lortie <desrt desrt ca>
Date: Mon Jul 9 12:43:50 2012 -0400
GVariant: fix string validation
String validation was done by checking if the string was valid utf8 and
ensuring that the first non-utf8 character was the last character (ie:
the nul terminator).
No check was actually done to make sure that this byte actually
contained a nul, however, so it was possible that you could have a
string like "hello\xff" with length 6 that would correctly validate.
Fix that, and test it.
glib/gvariant-serialiser.c | 11 ++++++++++-
glib/tests/gvariant.c | 1 +
2 files changed, 11 insertions(+), 1 deletions(-)
---
diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c
index d4b668b..4ee6c72 100644
--- a/glib/gvariant-serialiser.c
+++ b/glib/gvariant-serialiser.c
@@ -1593,11 +1593,20 @@ gboolean
g_variant_serialiser_is_string (gconstpointer data,
gsize size)
{
+ const gchar *expected_end;
const gchar *end;
+ if (size == 0)
+ return FALSE;
+
+ expected_end = ((gchar *) data) + size - 1;
+
+ if (*expected_end != '\0')
+ return FALSE;
+
g_utf8_validate (data, size, &end);
- return data == end - (size - 1);
+ return end == expected_end;
}
/* < private >
diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c
index d3d8aa2..a6bef23 100644
--- a/glib/tests/gvariant.c
+++ b/glib/tests/gvariant.c
@@ -1821,6 +1821,7 @@ test_strings (void)
{ is_nval, 13, "hello world\0" },
{ is_nval, 13, "hello\0world!" },
{ is_nval, 12, "hello world!" },
+ { is_nval, 13, "hello world!\xff" },
{ is_objpath, 2, "/" },
{ is_objpath, 3, "/a" },
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]