eion/purple-hangouts

Some memleak fixes
draft
2016-09-24, dx
0ebdcdad6e06
Parents f93a2627370c
Children 4e2647e8d62d
Some memleak fixes
--- a/hangouts_connection.c Fri Sep 23 16:20:23 2016 +1200
+++ b/hangouts_connection.c Sat Sep 24 15:02:34 2016 -0300
@@ -453,14 +453,17 @@
for(i = 0; i < map_list_len; i++) {
JsonObject *obj = json_array_get_object_element(map_list, i);
GList *members = json_object_get_members(obj);
+ GList *l;
- for (; members != NULL; members = members->next) {
- const gchar *member_name = members->data;
+ for (l = members; l != NULL; l = l->next) {
+ const gchar *member_name = l->data;
JsonNode *value = json_object_get_member(obj, member_name);
g_string_append_printf(postdata, "req%u_%s=", i, purple_url_encode(member_name));
g_string_append_printf(postdata, "%s&", purple_url_encode(json_node_get_string(value)));
}
+
+ g_list_free(members);
}
}
purple_http_request_set_contents(request, postdata->str, postdata->len);
--- a/hangouts_conversation.c Fri Sep 23 16:20:23 2016 +1200
+++ b/hangouts_conversation.c Sat Sep 24 15:02:34 2016 -0300
@@ -954,6 +954,8 @@
g_free(alias);
g_free(photo);
}
+
+ json_object_unref(obj);
}
void
--- a/hangouts_json.c Fri Sep 23 16:20:23 2016 +1200
+++ b/hangouts_json.c Sat Sep 24 15:02:34 2016 -0300
@@ -101,6 +101,7 @@
json_decode_array(const gchar *data, gssize len)
{
JsonNode *root = json_decode(data, len);
+ JsonArray *ret;
g_return_val_if_fail(root, NULL);
@@ -109,14 +110,19 @@
json_node_free(root);
return NULL;
}
+
+ ret = json_node_dup_array(root);
+
+ json_node_free(root);
- return json_node_get_array(root);
+ return ret;
}
JsonObject *
json_decode_object(const gchar *data, gssize len)
{
JsonNode *root = json_decode(data, len);
+ JsonObject *ret;
g_return_val_if_fail(root, NULL);
@@ -126,7 +132,11 @@
return NULL;
}
- return json_node_get_object(root);
+ ret = json_node_dup_object(root);
+
+ json_node_free(root);
+
+ return ret;
}
--- a/hangouts_pblite.c Fri Sep 23 16:20:23 2016 +1200
+++ b/hangouts_pblite.c Sat Sep 24 15:02:34 2016 -0300
@@ -296,6 +296,7 @@
guint j;
size_t siz;
size_t array_len;
+ void *tmp;
array_len = json_array_get_length(value_array);
#ifdef DEBUG
@@ -305,7 +306,7 @@
//see protobuf-c.c:3068
siz = sizeof_elt_in_repeated_array(field->type);
STRUCT_MEMBER(size_t, message, field->quantifier_offset) = array_len;
- STRUCT_MEMBER(void *, message, field->offset) = g_malloc0(siz * array_len);
+ STRUCT_MEMBER(void *, message, field->offset) = tmp = g_malloc0(siz * array_len);
for (j = 0; j < array_len; j++) {
#ifdef DEBUG
@@ -314,7 +315,10 @@
}
#endif
success = pblite_decode_field(field, json_array_get_element(value_array, j), STRUCT_MEMBER(void *, message, field->offset) + (siz * j));
- g_return_val_if_fail(success, FALSE);
+ if (!success) {
+ g_free(tmp);
+ g_return_val_if_fail(success, FALSE);
+ }
}
} else {
success = pblite_decode_field(field, value, STRUCT_MEMBER_P(message, field->offset));
@@ -369,8 +373,9 @@
if (last_element_is_object) {
JsonObject *last_object = json_array_get_object_element(pblite_array, len);
GList *members = json_object_get_members(last_object);
- for (; members != NULL; members = members->next) {
- const gchar *member_name = members->data;
+ GList *l;
+ for (l = members; l != NULL; l = l->next) {
+ const gchar *member_name = l->data;
guint64 member = g_ascii_strtoull(member_name, NULL, 0);
JsonNode *value = json_object_get_member(last_object, member_name);
@@ -378,6 +383,7 @@
g_return_val_if_fail(success, FALSE);
}
+ g_list_free(members);
}
return TRUE;