- Add patchset to fix gvariant parsing issues. (bsc#1111499). 0001-gvariant-Fix-checking-arithmetic-for-tuple-element-e.patch 0002-gvarianttype-Impose-a-recursion-limit-of-64-on-varia.patch 0003-gvariant-Check-array-offsets-against-serialised-data.patch 0004-gvariant-Check-tuple-offsets-against-serialised-data.patch 0005-gvariant-Limit-GVariant-strings-to-G_MAXSSIZE.patch 0006-gdbusmessage-Validate-type-of-message-header-signatu.patch 0007-gdbusmessage-Improve-documentation-for-g_dbus_messag.patch 0008-gdbusmessage-Clarify-error-returns-for-g_dbus_messag.patch 0009-gdbusmessage-Fix-a-typo-in-a-documentation-comment.patch 0010-gdbusmessage-Check-for-valid-GVariantType-when-parsi.patch 0011-gvariant-Clarify-internal-documentation-about-GVaria.patch 0012-tests-Tidy-up-GError-handling-in-gdbus-serialization.patch 0013-tests-Use-g_assert_null-in-gdbus-serialization-test.patch 0014-gutf8-Add-a-g_utf8_validate_len-function.patch 0015-glib-Port-various-callers-to-use-g_utf8_validate_len.patch OBS-URL: https://build.opensuse.org/request/show/644162 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/glib2?expand=0&rev=370
137 lines
3.9 KiB
Diff
137 lines
3.9 KiB
Diff
From e10e7d012e0c80b1c8e97a92b9153fb8c1341d47 Mon Sep 17 00:00:00 2001
|
|
From: Philip Withnall <withnall@endlessm.com>
|
|
Date: Mon, 1 Oct 2018 19:52:14 +0100
|
|
Subject: [PATCH 14/15] gutf8: Add a g_utf8_validate_len() function
|
|
|
|
This is a variant of g_utf8_validate() which requires the length to be
|
|
specified, thereby allowing string lengths up to G_MAXSIZE rather than
|
|
just G_MAXSSIZE.
|
|
|
|
Signed-off-by: Philip Withnall <withnall@endlessm.com>
|
|
---
|
|
docs/reference/glib/glib-sections.txt | 1 +
|
|
glib/gunicode.h | 4 ++++
|
|
glib/gutf8.c | 42 ++++++++++++++++++++++++++++++-----
|
|
glib/tests/utf8-validate.c | 15 +++++++++----
|
|
4 files changed, 53 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
|
|
index f88d6b53b..d875f9a3a 100644
|
|
--- a/docs/reference/glib/glib-sections.txt
|
|
+++ b/docs/reference/glib/glib-sections.txt
|
|
@@ -2964,6 +2964,7 @@ g_utf8_strrchr
|
|
g_utf8_strreverse
|
|
g_utf8_substring
|
|
g_utf8_validate
|
|
+g_utf8_validate_len
|
|
g_utf8_make_valid
|
|
|
|
<SUBSECTION>
|
|
diff --git a/glib/gunicode.h b/glib/gunicode.h
|
|
index 481bc5212..36f841b9d 100644
|
|
--- a/glib/gunicode.h
|
|
+++ b/glib/gunicode.h
|
|
@@ -847,6 +847,10 @@ GLIB_AVAILABLE_IN_ALL
|
|
gboolean g_utf8_validate (const gchar *str,
|
|
gssize max_len,
|
|
const gchar **end);
|
|
+GLIB_AVAILABLE_IN_2_58
|
|
+gboolean g_utf8_validate_len (const gchar *str,
|
|
+ gsize max_len,
|
|
+ const gchar **end);
|
|
|
|
GLIB_AVAILABLE_IN_ALL
|
|
gchar *g_utf8_strup (const gchar *str,
|
|
diff --git a/glib/gutf8.c b/glib/gutf8.c
|
|
index a0fb16370..291534fc8 100644
|
|
--- a/glib/gutf8.c
|
|
+++ b/glib/gutf8.c
|
|
@@ -1669,16 +1669,48 @@ g_utf8_validate (const char *str,
|
|
{
|
|
const gchar *p;
|
|
|
|
- if (max_len < 0)
|
|
- p = fast_validate (str);
|
|
+ if (max_len >= 0)
|
|
+ return g_utf8_validate_len (str, max_len, end);
|
|
+
|
|
+ p = fast_validate (str);
|
|
+
|
|
+ if (end)
|
|
+ *end = p;
|
|
+
|
|
+ if (*p != '\0')
|
|
+ return FALSE;
|
|
else
|
|
- p = fast_validate_len (str, max_len);
|
|
+ return TRUE;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * g_utf8_validate_len:
|
|
+ * @str: (array length=max_len) (element-type guint8): a pointer to character data
|
|
+ * @max_len: max bytes to validate
|
|
+ * @end: (out) (optional) (transfer none): return location for end of valid data
|
|
+ *
|
|
+ * Validates UTF-8 encoded text.
|
|
+ *
|
|
+ * As with g_utf8_validate(), but @max_len must be set, and hence this function
|
|
+ * will always return %FALSE if any of the bytes of @str are nul.
|
|
+ *
|
|
+ * Returns: %TRUE if the text was valid UTF-8
|
|
+ * Since: 2.60
|
|
+ */
|
|
+gboolean
|
|
+g_utf8_validate_len (const char *str,
|
|
+ gsize max_len,
|
|
+ const gchar **end)
|
|
+
|
|
+{
|
|
+ const gchar *p;
|
|
+
|
|
+ p = fast_validate_len (str, max_len);
|
|
|
|
if (end)
|
|
*end = p;
|
|
|
|
- if ((max_len >= 0 && p != str + max_len) ||
|
|
- (max_len < 0 && *p != '\0'))
|
|
+ if (p != str + max_len)
|
|
return FALSE;
|
|
else
|
|
return TRUE;
|
|
diff --git a/glib/tests/utf8-validate.c b/glib/tests/utf8-validate.c
|
|
index 1609bde34..5806b29a0 100644
|
|
--- a/glib/tests/utf8-validate.c
|
|
+++ b/glib/tests/utf8-validate.c
|
|
@@ -280,15 +280,22 @@ do_test (gconstpointer d)
|
|
|
|
result = g_utf8_validate (test->text, test->max_len, &end);
|
|
|
|
- g_assert (result == test->valid);
|
|
- g_assert (end - test->text == test->offset);
|
|
+ g_assert_true (result == test->valid);
|
|
+ g_assert_cmpint (end - test->text, ==, test->offset);
|
|
|
|
if (test->max_len < 0)
|
|
{
|
|
result = g_utf8_validate (test->text, strlen (test->text), &end);
|
|
|
|
- g_assert (result == test->valid);
|
|
- g_assert (end - test->text == test->offset);
|
|
+ g_assert_true (result == test->valid);
|
|
+ g_assert_cmpint (end - test->text, ==, test->offset);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ result = g_utf8_validate_len (test->text, test->max_len, &end);
|
|
+
|
|
+ g_assert_true (result == test->valid);
|
|
+ g_assert_cmpint (end - test->text, ==, test->offset);
|
|
}
|
|
}
|
|
|
|
--
|
|
2.14.4
|
|
|