summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2001-10-12 23:52:15 +0000
committerHavoc Pennington <hp@src.gnome.org>2001-10-12 23:52:15 +0000
commit15faad1f03d742ac36259fbfe5ddc7b94c3bf1c5 (patch)
treea7b9d18c4d206c668f58a7289bb72548a8bf5172
parent977fcec3c7b11fb2e358fff71107c8afd692631a (diff)
downloadgconf-15faad1f03d742ac36259fbfe5ddc7b94c3bf1c5.tar.gz
add some UTF-8
2001-10-12 Havoc Pennington <hp@redhat.com> * tests/testschemas.c (check_schema_storage): add some UTF-8 * tests/testpersistence.c: UTF-8 test * tests/testgconf.c: add a UTF-8 test * gconf/gconf.c: UTF-8 checks, and some indentation * gconf/gconf-schema.c: UTF-8 checks * gconf/gconf-internals.c (g_utf8_validate): cut-and-paste this in here * gconf/gconf-value.c: add some UTF-8 robustness
-rw-r--r--ChangeLog17
-rw-r--r--gconf/gconf-changeset.c7
-rw-r--r--gconf/gconf-internals.c232
-rw-r--r--gconf/gconf-internals.h14
-rw-r--r--gconf/gconf-schema.c49
-rw-r--r--gconf/gconf-value.c32
-rw-r--r--gconf/gconf.c64
-rw-r--r--tests/testgconf.c1
-rw-r--r--tests/testpersistence.c1
-rw-r--r--tests/testschemas.c3
10 files changed, 378 insertions, 42 deletions
diff --git a/ChangeLog b/ChangeLog
index becf5da0..39689188 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
2001-10-12 Havoc Pennington <hp@redhat.com>
+ * tests/testschemas.c (check_schema_storage): add some UTF-8
+
+ * tests/testpersistence.c: UTF-8 test
+
+ * tests/testgconf.c: add a UTF-8 test
+
+ * gconf/gconf.c: UTF-8 checks, and some indentation
+
+ * gconf/gconf-schema.c: UTF-8 checks
+
+ * gconf/gconf-internals.c (g_utf8_validate): cut-and-paste this in
+ here
+
+ * gconf/gconf-value.c: add some UTF-8 robustness
+
+2001-10-12 Havoc Pennington <hp@redhat.com>
+
* backends/xml-entry.c (entry_unset_value): don't translate "%s"
* backends/xml-cache.c (cache_sync_foreach): printf string screwup
diff --git a/gconf/gconf-changeset.c b/gconf/gconf-changeset.c
index 4fa86ca0..b6146116 100644
--- a/gconf/gconf-changeset.c
+++ b/gconf/gconf-changeset.c
@@ -359,7 +359,7 @@ gconf_change_set_set_list (GConfChangeSet* cs, const gchar* key,
g_return_if_fail(list_type != GCONF_VALUE_LIST);
g_return_if_fail(list_type != GCONF_VALUE_PAIR);
- value_list = gconf_value_list_from_primitive_list(list_type, list);
+ value_list = gconf_value_list_from_primitive_list (list_type, list, NULL);
gconf_change_set_set_nocopy(cs, key, value_list);
}
@@ -384,8 +384,9 @@ gconf_change_set_set_pair (GConfChangeSet* cs, const gchar* key,
g_return_if_fail(address_of_car != NULL);
g_return_if_fail(address_of_cdr != NULL);
- pair = gconf_value_pair_from_primitive_pair(car_type, cdr_type,
- address_of_car, address_of_cdr);
+ pair = gconf_value_pair_from_primitive_pair (car_type, cdr_type,
+ address_of_car, address_of_cdr,
+ NULL);
gconf_change_set_set_nocopy(cs, key, pair);
}
diff --git a/gconf/gconf-internals.c b/gconf/gconf-internals.c
index c48f1187..f2c50651 100644
--- a/gconf/gconf-internals.c
+++ b/gconf/gconf-internals.c
@@ -220,7 +220,15 @@ gconf_value_from_corba_value(const ConfigValue* value)
gconf_value_set_int(gval, value->_u.int_value);
break;
case GCONF_VALUE_STRING:
- gconf_value_set_string(gval, value->_u.string_value);
+ if (!g_utf8_validate (value->_u.string_value, -1, NULL))
+ {
+ gconf_log (GCL_ERR, _("Invalid UTF-8 in string value in '%s'"),
+ value->_u.string_value);
+ }
+ else
+ {
+ gconf_value_set_string(gval, value->_u.string_value);
+ }
break;
case GCONF_VALUE_FLOAT:
gconf_value_set_float(gval, value->_u.float_value);
@@ -604,17 +612,37 @@ gconf_schema_from_corba_schema(const ConfigSchema* cs)
gconf_schema_set_cdr_type(sc, cdr_type);
if (*cs->locale != '\0')
- gconf_schema_set_locale(sc, cs->locale);
+ {
+ if (!g_utf8_validate (cs->locale, -1, NULL))
+ gconf_log (GCL_ERR, _("Invalid UTF-8 in locale for schema"));
+ else
+ gconf_schema_set_locale(sc, cs->locale);
+ }
if (*cs->short_desc != '\0')
- gconf_schema_set_short_desc(sc, cs->short_desc);
+ {
+ if (!g_utf8_validate (cs->short_desc, -1, NULL))
+ gconf_log (GCL_ERR, _("Invalid UTF-8 in short description for schema"));
+ else
+ gconf_schema_set_short_desc(sc, cs->short_desc);
+ }
if (*cs->long_desc != '\0')
- gconf_schema_set_long_desc(sc, cs->long_desc);
+ {
+ if (!g_utf8_validate (cs->long_desc, -1, NULL))
+ gconf_log (GCL_ERR, _("Invalid UTF-8 in long description for schema"));
+ else
+ gconf_schema_set_long_desc(sc, cs->long_desc);
+ }
if (*cs->owner != '\0')
- gconf_schema_set_owner(sc, cs->owner);
-
+ {
+ if (!g_utf8_validate (cs->owner, -1, NULL))
+ gconf_log (GCL_ERR, _("Invalid UTF-8 in owner for schema"));
+ else
+ gconf_schema_set_owner(sc, cs->owner);
+ }
+
{
GConfValue* val;
@@ -1199,7 +1227,8 @@ gconf_log(GConfLogPriority pri, const gchar* fmt, ...)
*/
GConfValue*
-gconf_value_list_from_primitive_list(GConfValueType list_type, GSList* list)
+gconf_value_list_from_primitive_list(GConfValueType list_type, GSList* list,
+ GError **err)
{
GSList* value_list;
GSList* tmp;
@@ -1233,10 +1262,20 @@ gconf_value_list_from_primitive_list(GConfValueType list_type, GSList* list)
break;
case GCONF_VALUE_STRING:
+ if (!g_utf8_validate (tmp->data, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_FAILED,
+ _("Text contains invalid UTF-8"));
+ goto error;
+ }
+
gconf_value_set_string(val, tmp->data);
break;
case GCONF_VALUE_SCHEMA:
+ if (!gconf_schema_validate (tmp->data, err))
+ goto error;
gconf_value_set_schema(val, tmp->data);
break;
@@ -1262,11 +1301,17 @@ gconf_value_list_from_primitive_list(GConfValueType list_type, GSList* list)
return value_with_list;
}
+
+ error:
+ g_slist_foreach (value_list, (GFunc)gconf_value_free, NULL);
+ g_slist_free (value_list);
+ return NULL;
}
static GConfValue*
-from_primitive(GConfValueType type, gconstpointer address)
+from_primitive(GConfValueType type, gconstpointer address,
+ GError **err)
{
GConfValue* val;
@@ -1283,6 +1328,15 @@ from_primitive(GConfValueType type, gconstpointer address)
break;
case GCONF_VALUE_STRING:
+ if (!g_utf8_validate (*((const gchar**)address), -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_FAILED,
+ _("Text contains invalid UTF-8"));
+ gconf_value_free (val);
+ return NULL;
+ }
+
gconf_value_set_string(val, *((const gchar**)address));
break;
@@ -1291,6 +1345,12 @@ from_primitive(GConfValueType type, gconstpointer address)
break;
case GCONF_VALUE_SCHEMA:
+ if (!gconf_schema_validate (*((GConfSchema**)address), err))
+ {
+ gconf_value_free (val);
+ return NULL;
+ }
+
gconf_value_set_schema(val, *((GConfSchema**)address));
break;
@@ -1306,7 +1366,8 @@ GConfValue*
gconf_value_pair_from_primitive_pair(GConfValueType car_type,
GConfValueType cdr_type,
gconstpointer address_of_car,
- gconstpointer address_of_cdr)
+ gconstpointer address_of_cdr,
+ GError **err)
{
GConfValue* pair;
GConfValue* car;
@@ -1321,9 +1382,16 @@ gconf_value_pair_from_primitive_pair(GConfValueType car_type,
g_return_val_if_fail(address_of_car != NULL, NULL);
g_return_val_if_fail(address_of_cdr != NULL, NULL);
- car = from_primitive(car_type, address_of_car);
- cdr = from_primitive(cdr_type, address_of_cdr);
-
+ car = from_primitive(car_type, address_of_car, err);
+ if (car == NULL)
+ return NULL;
+ cdr = from_primitive(cdr_type, address_of_cdr, err);
+ if (cdr == NULL)
+ {
+ gconf_value_free (car);
+ return NULL;
+ }
+
pair = gconf_value_new(GCONF_VALUE_PAIR);
gconf_value_set_car_nocopy(pair, car);
gconf_value_set_cdr_nocopy(pair, cdr);
@@ -1840,6 +1908,12 @@ gconf_value_decode (const gchar* encoded)
if (type == GCONF_VALUE_INVALID)
return NULL;
+ if (!g_utf8_validate (encoded, -1, NULL))
+ {
+ gconf_log (GCL_ERR, _("Encoded value is not valid UTF-8"));
+ return NULL;
+ }
+
val = gconf_value_new(type);
s = encoded + 1;
@@ -4141,5 +4215,139 @@ g_execute (const gchar *file,
+#define UTF8_COMPUTE(Char, Mask, Len) \
+ if (Char < 128) \
+ { \
+ Len = 1; \
+ Mask = 0x7f; \
+ } \
+ else if ((Char & 0xe0) == 0xc0) \
+ { \
+ Len = 2; \
+ Mask = 0x1f; \
+ } \
+ else if ((Char & 0xf0) == 0xe0) \
+ { \
+ Len = 3; \
+ Mask = 0x0f; \
+ } \
+ else if ((Char & 0xf8) == 0xf0) \
+ { \
+ Len = 4; \
+ Mask = 0x07; \
+ } \
+ else if ((Char & 0xfc) == 0xf8) \
+ { \
+ Len = 5; \
+ Mask = 0x03; \
+ } \
+ else if ((Char & 0xfe) == 0xfc) \
+ { \
+ Len = 6; \
+ Mask = 0x01; \
+ } \
+ else \
+ Len = -1;
+
+#define UTF8_LENGTH(Char) \
+ ((Char) < 0x80 ? 1 : \
+ ((Char) < 0x800 ? 2 : \
+ ((Char) < 0x10000 ? 3 : \
+ ((Char) < 0x200000 ? 4 : \
+ ((Char) < 0x4000000 ? 5 : 6)))))
+
+
+#define UTF8_GET(Result, Chars, Count, Mask, Len) \
+ (Result) = (Chars)[0] & (Mask); \
+ for ((Count) = 1; (Count) < (Len); ++(Count)) \
+ { \
+ if (((Chars)[(Count)] & 0xc0) != 0x80) \
+ { \
+ (Result) = -1; \
+ break; \
+ } \
+ (Result) <<= 6; \
+ (Result) |= ((Chars)[(Count)] & 0x3f); \
+ }
+
+#define UNICODE_VALID(Char) \
+ ((Char) < 0x110000 && \
+ ((Char) < 0xD800 || (Char) >= 0xE000) && \
+ (Char) != 0xFFFE && (Char) != 0xFFFF)
+
+
+static const gchar utf8_skip_data[256] = {
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0
+};
+
+const gchar * const g_utf8_skip = utf8_skip_data;
+
+typedef guint32 gunichar;
+
+gboolean
+g_utf8_validate (const gchar *str,
+ gssize max_len,
+ const gchar **end)
+{
+ const gchar *p;
+ g_return_val_if_fail (str != NULL, FALSE);
+
+ if (end)
+ *end = str;
+
+ p = str;
+
+ while ((max_len < 0 || (p - str) < max_len) && *p)
+ {
+ int i, mask = 0, len;
+ gunichar result;
+ unsigned char c = (unsigned char) *p;
+
+ UTF8_COMPUTE (c, mask, len);
+
+ if (len == -1)
+ break;
+
+ /* check that the expected number of bytes exists in str */
+ if (max_len >= 0 &&
+ ((max_len - (p - str)) < len))
+ break;
+
+ UTF8_GET (result, p, i, mask, len);
+
+ if (UTF8_LENGTH (result) != len) /* Check for overlong UTF-8 */
+ break;
+
+ if (result == (gunichar)-1)
+ break;
+
+ if (!UNICODE_VALID (result))
+ break;
+
+ p += len;
+ }
+
+ if (end)
+ *end = p;
+
+ /* See that we covered the entire length if a length was
+ * passed in, or that we ended on a nul if not
+ */
+ if (max_len >= 0 &&
+ p != (str + max_len))
+ return FALSE;
+ else if (max_len < 0 &&
+ *p != '\0')
+ return FALSE;
+ else
+ return TRUE;
+}
diff --git a/gconf/gconf-internals.h b/gconf/gconf-internals.h
index be127852..137daca1 100644
--- a/gconf/gconf-internals.h
+++ b/gconf/gconf-internals.h
@@ -142,12 +142,13 @@ gchar* gconf_quote_percents (const gchar* src);
*/
GConfValue* gconf_value_list_from_primitive_list (GConfValueType list_type,
- GSList *list);
+ GSList *list,
+ GError **err);
GConfValue* gconf_value_pair_from_primitive_pair (GConfValueType car_type,
GConfValueType cdr_type,
gconstpointer address_of_car,
- gconstpointer address_of_cdr);
-
+ gconstpointer address_of_cdr,
+ GError **err);
GSList* gconf_value_list_to_primitive_list_destructive (GConfValue *val,
GConfValueType list_type,
@@ -199,6 +200,13 @@ ConfigServer gconf_activate_server (gboolean start_if_not_found,
char* gconf_get_lock_dir (void);
char* gconf_get_daemon_dir (void);
+gboolean gconf_schema_validate (GConfSchema *sc,
+ GError **err);
+
+gboolean g_utf8_validate (const gchar *str,
+ gssize max_len,
+ const gchar **end);
+
#ifdef ENABLE_NLS
# include <libintl.h>
# include <config.h>
diff --git a/gconf/gconf-schema.c b/gconf/gconf-schema.c
index de42f1c5..29af2b7a 100644
--- a/gconf/gconf-schema.c
+++ b/gconf/gconf-schema.c
@@ -18,7 +18,7 @@
*/
#include "gconf-schema.h"
-
+#include "gconf-internals.h"
GConfSchema*
gconf_schema_new(void)
@@ -108,6 +108,8 @@ gconf_schema_set_cdr_type(GConfSchema* sc, GConfValueType type)
void
gconf_schema_set_locale(GConfSchema* sc, const gchar* locale)
{
+ g_return_if_fail (locale == NULL || g_utf8_validate (locale, -1, NULL));
+
if (sc->locale)
g_free(sc->locale);
@@ -120,6 +122,8 @@ gconf_schema_set_locale(GConfSchema* sc, const gchar* locale)
void
gconf_schema_set_short_desc(GConfSchema* sc, const gchar* desc)
{
+ g_return_if_fail (desc == NULL || g_utf8_validate (desc, -1, NULL));
+
if (sc->short_desc)
g_free(sc->short_desc);
@@ -132,6 +136,8 @@ gconf_schema_set_short_desc(GConfSchema* sc, const gchar* desc)
void
gconf_schema_set_long_desc(GConfSchema* sc, const gchar* desc)
{
+ g_return_if_fail (desc == NULL || g_utf8_validate (desc, -1, NULL));
+
if (sc->long_desc)
g_free(sc->long_desc);
@@ -144,6 +150,8 @@ gconf_schema_set_long_desc(GConfSchema* sc, const gchar* desc)
void
gconf_schema_set_owner(GConfSchema* sc, const gchar* owner)
{
+ g_return_if_fail (owner == NULL || g_utf8_validate (owner, -1, NULL));
+
if (sc->owner)
g_free(sc->owner);
@@ -171,4 +179,41 @@ gconf_schema_set_default_value_nocopy(GConfSchema* sc, GConfValue* val)
sc->default_value = val;
}
-
+gboolean
+gconf_schema_validate (GConfSchema *sc,
+ GError **err)
+{
+ if (sc->locale && !g_utf8_validate (sc->locale, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_FAILED,
+ _("Schema contains invalid UTF-8"));
+ return FALSE;
+ }
+
+ if (sc->short_desc && !g_utf8_validate (sc->short_desc, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_FAILED,
+ _("Schema contains invalid UTF-8"));
+ return FALSE;
+ }
+
+ if (sc->long_desc && !g_utf8_validate (sc->long_desc, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_FAILED,
+ _("Schema contains invalid UTF-8"));
+ return FALSE;
+ }
+
+ if (sc->owner && !g_utf8_validate (sc->owner, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_FAILED,
+ _("Schema contains invalid UTF-8"));
+ return FALSE;
+ }
+
+ return TRUE;
+}
diff --git a/gconf/gconf-value.c b/gconf/gconf-value.c
index 6e8b3ca8..f5389db2 100644
--- a/gconf/gconf-value.c
+++ b/gconf/gconf-value.c
@@ -1,4 +1,3 @@
-
/* GConf
* Copyright (C) 1999, 2000 Red Hat Inc.
*
@@ -118,8 +117,19 @@ gconf_value_new_from_string(GConfValueType type, const gchar* value_str,
}
}
break;
- case GCONF_VALUE_STRING:
- gconf_value_set_string(value, value_str);
+ case GCONF_VALUE_STRING:
+ if (!g_utf8_validate (value_str, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_PARSE_ERROR,
+ _("Text contains invalid UTF-8"));
+ gconf_value_free(value);
+ value = NULL;
+ }
+ else
+ {
+ gconf_value_set_string(value, value_str);
+ }
break;
case GCONF_VALUE_BOOL:
switch (*value_str)
@@ -207,6 +217,14 @@ gconf_value_new_list_from_string(GConfValueType list_type,
g_return_val_if_fail(list_type != GCONF_VALUE_LIST, NULL);
g_return_val_if_fail(list_type != GCONF_VALUE_PAIR, NULL);
+ if (!g_utf8_validate (str, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_PARSE_ERROR,
+ _("Text contains invalid UTF-8"));
+ return NULL;
+ }
+
if (str[0] != '[')
{
if (err)
@@ -341,6 +359,14 @@ gconf_value_new_pair_from_string(GConfValueType car_type,
g_return_val_if_fail(cdr_type != GCONF_VALUE_LIST, NULL);
g_return_val_if_fail(cdr_type != GCONF_VALUE_PAIR, NULL);
+ if (!g_utf8_validate (str, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_PARSE_ERROR,
+ _("Text contains invalid UTF-8"));
+ return NULL;
+ }
+
if (str[0] != '(')
{
if (err)
diff --git a/gconf/gconf.c b/gconf/gconf.c
index b7703c52..572ff795 100644
--- a/gconf/gconf.c
+++ b/gconf/gconf.c
@@ -2833,7 +2833,7 @@ error_checked_set(GConfEngine* conf, const gchar* key,
gboolean
gconf_engine_set_float (GConfEngine* conf, const gchar* key,
- gdouble val, GError** err)
+ gdouble val, GError** err)
{
GConfValue* gval;
@@ -2850,7 +2850,7 @@ gconf_engine_set_float (GConfEngine* conf, const gchar* key,
gboolean
gconf_engine_set_int (GConfEngine* conf, const gchar* key,
- gint val, GError** err)
+ gint val, GError** err)
{
GConfValue* gval;
@@ -2867,14 +2867,24 @@ gconf_engine_set_int (GConfEngine* conf, const gchar* key,
gboolean
gconf_engine_set_string (GConfEngine* conf, const gchar* key,
- const gchar* val, GError** err)
+ const gchar* val, GError** err)
{
GConfValue* gval;
- g_return_val_if_fail(val != NULL, FALSE);
- g_return_val_if_fail(conf != NULL, FALSE);
- g_return_val_if_fail(key != NULL, FALSE);
- g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
+ g_return_val_if_fail (val != NULL, FALSE);
+ g_return_val_if_fail (conf != NULL, FALSE);
+ g_return_val_if_fail (key != NULL, FALSE);
+ g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+
+ if (!g_utf8_validate (val, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_FAILED,
+ _("Text contains invalid UTF-8"));
+ return FALSE;
+ }
+
+ g_return_val_if_fail (g_utf8_validate (val, -1, NULL), FALSE);
gval = gconf_value_new(GCONF_VALUE_STRING);
@@ -2885,7 +2895,7 @@ gconf_engine_set_string (GConfEngine* conf, const gchar* key,
gboolean
gconf_engine_set_bool (GConfEngine* conf, const gchar* key,
- gboolean val, GError** err)
+ gboolean val, GError** err)
{
GConfValue* gval;
@@ -2902,7 +2912,7 @@ gconf_engine_set_bool (GConfEngine* conf, const gchar* key,
gboolean
gconf_engine_set_schema (GConfEngine* conf, const gchar* key,
- GConfSchema* val, GError** err)
+ GConfSchema* val, GError** err)
{
GConfValue* gval;
@@ -2910,6 +2920,9 @@ gconf_engine_set_schema (GConfEngine* conf, const gchar* key,
g_return_val_if_fail(key != NULL, FALSE);
g_return_val_if_fail(val != NULL, FALSE);
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
+
+ if (!gconf_schema_validate (val, err))
+ return FALSE;
gval = gconf_value_new(GCONF_VALUE_SCHEMA);
@@ -2920,11 +2933,12 @@ gconf_engine_set_schema (GConfEngine* conf, const gchar* key,
gboolean
gconf_engine_set_list (GConfEngine* conf, const gchar* key,
- GConfValueType list_type,
- GSList* list,
- GError** err)
+ GConfValueType list_type,
+ GSList* list,
+ GError** err)
{
GConfValue* value_list;
+ GError *tmp_err = NULL;
g_return_val_if_fail(conf != NULL, FALSE);
g_return_val_if_fail(key != NULL, FALSE);
@@ -2933,7 +2947,13 @@ gconf_engine_set_list (GConfEngine* conf, const gchar* key,
g_return_val_if_fail(list_type != GCONF_VALUE_PAIR, FALSE);
g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
- value_list = gconf_value_list_from_primitive_list(list_type, list);
+ value_list = gconf_value_list_from_primitive_list(list_type, list, &tmp_err);
+
+ if (tmp_err)
+ {
+ g_propagate_error (err, tmp_err);
+ return FALSE;
+ }
/* destroys the value_list */
@@ -2942,12 +2962,13 @@ gconf_engine_set_list (GConfEngine* conf, const gchar* key,
gboolean
gconf_engine_set_pair (GConfEngine* conf, const gchar* key,
- GConfValueType car_type, GConfValueType cdr_type,
- gconstpointer address_of_car,
- gconstpointer address_of_cdr,
- GError** err)
+ GConfValueType car_type, GConfValueType cdr_type,
+ gconstpointer address_of_car,
+ gconstpointer address_of_cdr,
+ GError** err)
{
GConfValue* pair;
+ GError *tmp_err = NULL;
g_return_val_if_fail(conf != NULL, FALSE);
g_return_val_if_fail(key != NULL, FALSE);
@@ -2963,7 +2984,14 @@ gconf_engine_set_pair (GConfEngine* conf, const gchar* key,
pair = gconf_value_pair_from_primitive_pair(car_type, cdr_type,
- address_of_car, address_of_cdr);
+ address_of_car, address_of_cdr,
+ &tmp_err);
+
+ if (tmp_err)
+ {
+ g_propagate_error (err, tmp_err);
+ return FALSE;
+ }
return error_checked_set(conf, key, pair, err);
}
diff --git a/tests/testgconf.c b/tests/testgconf.c
index a6d088f2..92581afb 100644
--- a/tests/testgconf.c
+++ b/tests/testgconf.c
@@ -69,6 +69,7 @@ some_strings[] = {
"sdkjfkljg",
"a",
"&",
+ "UTF-8: German (Deutsch Süd) Grüß Gott Greek (Ελληνικά) Γειά σας Hebrew(שלום) Hebrew punctuation(\xd6\xbfש\xd6\xbb\xd6\xbc\xd6\xbb\xd6\xbfל\xd6\xbcו\xd6\xbc\xd6\xbb\xd6\xbb\xd6\xbfם\xd6\xbc\xd6\xbb\xd6\xbf) Japanese (日本語) Thai (สวัสดีครับ) Thai wrong spelling (คำต่อไปนื่สะกดผิด พัั้ัั่งโกะ)\n",
"#$&&^(%^^#$&&*(%^&#!$%$%&^&(%&>>>>>>>>>>>>>!>>>.....<<<<<<<<<<<<<<,,,,,,,&&&&&&",
"sjdflkjg;kljklj",
"hello this is a string with spaces and \t\t\t\ttabs",
diff --git a/tests/testpersistence.c b/tests/testpersistence.c
index 322bd2e3..4b7861ff 100644
--- a/tests/testpersistence.c
+++ b/tests/testpersistence.c
@@ -81,6 +81,7 @@ some_strings[] = {
"sdkjfkljg",
"a",
"&",
+ "UTF-8: German (Deutsch Süd) Grüß Gott Greek (Ελληνικά) Γειά σας Hebrew(שלום) Hebrew punctuation(\xd6\xbfש\xd6\xbb\xd6\xbc\xd6\xbb\xd6\xbfל\xd6\xbcו\xd6\xbc\xd6\xbb\xd6\xbb\xd6\xbfם\xd6\xbc\xd6\xbb\xd6\xbf) Japanese (日本語) Thai (สวัสดีครับ) Thai wrong spelling (คำต่อไปนื่สะกดผิด พัั้ัั่งโกะ)\n",
"#$&&^(%^^#$&&*(%^&#!$%$%&^&(%&>>>>>>>>>>>>>!>>>.....<<<<<<<<<<<<<<,,,,,,,&&&&&&",
"sjdflkjg;kljklj",
"hello this is a string with spaces and \t\t\t\ttabs",
diff --git a/tests/testschemas.c b/tests/testschemas.c
index d5226d7a..e6a8c217 100644
--- a/tests/testschemas.c
+++ b/tests/testschemas.c
@@ -373,7 +373,8 @@ check_schema_storage(GConfEngine* conf)
*keyp, ints[i]);
gconf_schema_set_short_desc(schema, short_desc);
- long_desc = g_strdup_printf("Long description for schema with short description `%s' is really really long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long ", short_desc);
+ long_desc = g_strdup_printf("Long description for schema with short description `%s' is really really long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long "
+ "UTF-8: German (Deutsch Süd) Grüß Gott Greek (Ελληνικά) Γειά σας Hebrew(שלום) Hebrew punctuation(\xd6\xbfש\xd6\xbb\xd6\xbc\xd6\xbb\xd6\xbfל\xd6\xbcו\xd6\xbc\xd6\xbb\xd6\xbb\xd6\xbfם\xd6\xbc\xd6\xbb\xd6\xbf) Japanese (日本語) Thai (สวัสดีครับ) Thai wrong spelling (คำต่อไปนื่สะกดผิด พัั้ัั่งโกะ)\n", short_desc);
gconf_schema_set_long_desc(schema, long_desc);