/* We accept a little more than the desktop entry spec says,
* since gnome-vfs uses mime-types as keys in its cache.
*/
- while (*q && (g_unichar_isalnum (g_utf8_get_char (q)) ||
- *q == '-' || *q == '_' || *q == '/' || *q == '+' || *q == '.' || *q == '*'))
+ while (*q && *q != '=' && *q != '[' && *q != ']')
q = g_utf8_next_char (q);
+ /* No empty keys, please */
+ if (q == p)
+ return FALSE;
+
+ /* We accept spaces in the middle of keys to not break
+ * existing apps, but we don't tolerate initial of final
+ * spaces, which would lead to silent corruption when
+ * rereading the file.
+ */
+ if (*p == ' ' || q[-1] == ' ')
+ return FALSE;
+
if (*q == '[')
{
q++;
q++;
}
- if (*q != '\0' || q == p)
+ if (*q != '\0')
return FALSE;
return TRUE;
while (*p && *p != ']')
p = g_utf8_next_char (p);
- if (!*p)
+ if (*p != ']')
+ return FALSE;
+
+ /* silently accept whitespace after the ] */
+ p = g_utf8_next_char (p);
+ while (*p == ' ' || *p == '\t')
+ p = g_utf8_next_char (p);
+
+ if (*p)
return FALSE;
return TRUE;
G_KEY_FILE_ERROR,
G_KEY_FILE_ERROR_PARSE);
+ /* empty group name */
+ data = "[]\n"
+ "key1=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
/* Unicode in group name */
data = "[\xc2\xbd]\n"
"key1=123\n";
G_KEY_FILE_ERROR,
G_KEY_FILE_ERROR_PARSE);
- /* control char in key name */
+ /* empty key name */
data = "[a]\n"
- "key\tfoo=123\n";
+ " =123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* empty key name */
+ data = "[a]\n"
+ " [de] =123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* bad locale suffix */
+ data = "[a]\n"
+ "foo[@#!&%]=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_error (&error,
+ G_KEY_FILE_ERROR,
+ G_KEY_FILE_ERROR_PARSE);
+
+ /* initial space */
+ data = "[a]\n"
+ " foo=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ check_no_error (&error);
+ check_string_value (keyfile, "a", "foo", "123");
+ g_key_file_free (keyfile);
+
+ /* final space */
+ data = "[a]\n"
+ "foo =123\n";
keyfile = g_key_file_new ();
g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ check_no_error (&error);
+ check_string_value (keyfile, "a", "foo", "123");
+ g_key_file_free (keyfile);
+
+ /* inner space */
+ data = "[a]\n"
+ "foo bar=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ check_no_error (&error);
+ check_string_value (keyfile, "a", "foo bar", "123");
g_key_file_free (keyfile);
+
+ /* inner space */
+ data = "[a]\n"
+ "foo [de] =123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
check_error (&error,
G_KEY_FILE_ERROR,
G_KEY_FILE_ERROR_PARSE);
+ g_key_file_free (keyfile);
+
+ /* control char in key name */
+ data = "[a]\n"
+ "key\tfoo=123\n";
+ keyfile = g_key_file_new ();
+ g_key_file_load_from_data (keyfile, data, -1, 0, &error);
+ g_key_file_free (keyfile);
+ check_no_error (&error);
/* Unicode in key name */
data = "[a]\n"
g_key_file_set_string (keyfile, "a", "x", "123");
g_key_file_set_string (keyfile, "a", "key\tfoo", "123");
value = g_key_file_get_string (keyfile, "a", "key\tfoo", &error);
- check_error (&error,
- G_KEY_FILE_ERROR,
- G_KEY_FILE_ERROR_KEY_NOT_FOUND);
+ check_no_error (&error);
g_key_file_free (keyfile);
keyfile = g_key_file_new ();