[glib] gkeyfile: Handle whitespace after boolean values
- From: Robert Ancell <rancell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] gkeyfile: Handle whitespace after boolean values
- Date: Wed, 21 Oct 2015 02:32:15 +0000 (UTC)
commit 31c45cb6aeb06d59b731fb725beeee17ed851475
Author: Robert Ancell <robert ancell canonical com>
Date: Tue Oct 20 15:44:32 2015 +1300
gkeyfile: Handle whitespace after boolean values
Ignore trailing whitespace when reading boolean values. Currently it is
very easy to manually edit a keyfile to be:
[section]
key=true_
Where '_' is a space character. g_key_file_get_boolean will read this value as
false and this is hard for a user to detect (it will be reported in GError
as an invalid value).
Trailing whitespace is ignored for numbers for the same reason. This was
fixed in 7a45dde4fe64b4f6c6d3ebc54dfb54d106290e9d.
https://bugzilla.gnome.org/show_bug.cgi?id=664740
glib/gkeyfile.c | 17 +++++++++++++++--
glib/tests/keyfile.c | 4 ++++
2 files changed, 19 insertions(+), 2 deletions(-)
---
diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c
index 2756d67..a33e686 100644
--- a/glib/gkeyfile.c
+++ b/glib/gkeyfile.c
@@ -4319,16 +4319,29 @@ g_key_file_parse_value_as_double (GKeyFile *key_file,
return double_value;
}
+static gint
+strcmp_sized (const gchar *s1, size_t len1, const gchar *s2)
+{
+ size_t len2 = strlen (s2);
+ return strncmp (s1, s2, MAX (len1, len2));
+}
+
static gboolean
g_key_file_parse_value_as_boolean (GKeyFile *key_file,
const gchar *value,
GError **error)
{
gchar *value_utf8;
+ gint i, length = 0;
+
+ /* Count the number of non-whitespace characters */
+ for (i = 0; value[i]; i++)
+ if (!g_ascii_isspace (value[i]))
+ length = i + 1;
- if (strcmp (value, "true") == 0 || strcmp (value, "1") == 0)
+ if (strcmp_sized (value, length, "true") == 0 || strcmp_sized (value, length, "1") == 0)
return TRUE;
- else if (strcmp (value, "false") == 0 || strcmp (value, "0") == 0)
+ else if (strcmp_sized (value, length, "false") == 0 || strcmp_sized (value, length, "0") == 0)
return FALSE;
value_utf8 = _g_utf8_make_valid (value);
diff --git a/glib/tests/keyfile.c b/glib/tests/keyfile.c
index 4643084..a5cc646 100644
--- a/glib/tests/keyfile.c
+++ b/glib/tests/keyfile.c
@@ -574,6 +574,8 @@ test_boolean (void)
"key2=false\n"
"key3=1\n"
"key4=0\n"
+ "key5= true\n"
+ "key6=true \n"
"[invalid]\n"
"key1=t\n"
"key2=f\n"
@@ -586,6 +588,8 @@ test_boolean (void)
check_boolean_value (keyfile, "valid", "key2", FALSE);
check_boolean_value (keyfile, "valid", "key3", TRUE);
check_boolean_value (keyfile, "valid", "key4", FALSE);
+ check_boolean_value (keyfile, "valid", "key5", TRUE);
+ check_boolean_value (keyfile, "valid", "key6", TRUE);
g_key_file_get_boolean (keyfile, "invalid", "key1", &error);
check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]