summaryrefslogtreecommitdiff
path: root/json-glib/json-object.c
diff options
context:
space:
mode:
Diffstat (limited to 'json-glib/json-object.c')
-rw-r--r--json-glib/json-object.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/json-glib/json-object.c b/json-glib/json-object.c
index 0b5875f..7a5f2ec 100644
--- a/json-glib/json-object.c
+++ b/json-glib/json-object.c
@@ -25,6 +25,8 @@
#include "config.h"
#endif
+#include <string.h>
+
#include <glib.h>
#include "json-types-private.h"
@@ -131,6 +133,25 @@ object_set_member_internal (JsonObject *object,
if (g_hash_table_lookup (object->members, name) == NULL)
object->members_ordered = g_list_prepend (object->members_ordered, name);
+ else
+ {
+ GList *l;
+
+ /* if the member already exists then we need to replace the
+ * pointer to its name, to avoid keeping invalid pointers
+ * once we replace the key in the hash table
+ */
+ for (l = object->members_ordered; l != NULL; l = l->next)
+ {
+ gchar *tmp = l->data;
+
+ if (strcmp (tmp, name) == 0)
+ {
+ l->data = name;
+ break;
+ }
+ }
+ }
g_hash_table_replace (object->members, name, node);
}