From b83db4d9de88d3af8f5baf430cd5f985d291a3d7 Mon Sep 17 00:00:00 2001 From: Valery Febvre Date: Tue, 27 Apr 2004 13:03:47 +0000 Subject: Memory leaks fixed --- lasso/xml/tools.c | 36 +++++++++++++++------- lasso/xml/xml.c | 89 +++++++++++++++++++++++++++++++++---------------------- 2 files changed, 79 insertions(+), 46 deletions(-) (limited to 'lasso') diff --git a/lasso/xml/tools.c b/lasso/xml/tools.c index 15cc4887..c4279707 100644 --- a/lasso/xml/tools.c +++ b/lasso/xml/tools.c @@ -51,7 +51,7 @@ lasso_build_unique_id(guint8 size) id[size] = '\0'; /* base64 encoding of build string */ - enc_id = xmlSecBase64Encode(id, size, 0); + enc_id = xmlSecBase64Encode((const xmlChar *)id, size, 0); g_free(id); return (enc_id); @@ -96,6 +96,16 @@ lasso_get_current_time() return (ret); } +static void gdata_query_to_dict_destroy_notify(gpointer data) { + gint i; + GPtrArray *array = data; + + for (i=0; ilen; i++) { + g_free(array->pdata[i]); + } + g_ptr_array_free(array, TRUE); +} + /** * lasso_query_to_dict: * @query: the query part of the 'url-encoded + signed' message @@ -112,32 +122,36 @@ lasso_query_to_dict(const xmlChar *query) { GData *gd = NULL; gchar **sa1, **sa2, **sa3; - + xmlChar *str_unescaped; GPtrArray *gpa; guint i, j; g_datalist_init(&gd); - sa1 = g_strsplit(query, "&", 0); - i = 0; + sa1 = g_strsplit(query, "&", 0); while (sa1[i++] != NULL) { /* split of key=value to get (key, value) sub-strings */ - sa2 = g_strsplit(lasso_str_unescape(sa1[i-1]), "=", 0); + str_unescaped = lasso_str_unescape(sa1[i-1]); + sa2 = g_strsplit(str_unescaped, "=", 0); + xmlFree(str_unescaped); //printf("%s => ", sa2[0]); /* split of value to get mutli values sub-strings separated by SPACE char */ - sa3 = g_strsplit(lasso_str_unescape(sa2[1]), " ", 0); + str_unescaped = lasso_str_unescape(sa2[1]); + sa3 = g_strsplit(str_unescaped, " ", 0); + xmlFree(str_unescaped); gpa = g_ptr_array_new(); j = 0; while (sa3[j++] != NULL) { - g_ptr_array_add(gpa, sa3[j-1]); + g_ptr_array_add(gpa, g_strdup(sa3[j-1])); //printf("%s, ", sa3[j-1]); } - // add key => values in dict - g_datalist_set_data(&gd, sa2[0], gpa); //printf("\n"); - //g_strfreev(sa3); - //g_strfreev(sa2); + /* add key => values in dict */ + g_datalist_set_data_full(&gd, sa2[0], gpa, + gdata_query_to_dict_destroy_notify); + g_strfreev(sa3); + g_strfreev(sa2); } g_strfreev(sa1); diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c index 7d996e9d..a6f4def7 100644 --- a/lasso/xml/xml.c +++ b/lasso/xml/xml.c @@ -291,10 +291,9 @@ lasso_node_set_prop(LassoNode *node, /* implementation methods */ /*****************************************************************************/ -static void -gdata_build_query_foreach_func(GQuark key_id, - gpointer data, - gpointer user_data) { +static void gdata_build_query_foreach_func(GQuark key_id, + gpointer data, + gpointer user_data) { guint i; GString *str; GPtrArray *array; @@ -306,10 +305,8 @@ gdata_build_query_foreach_func(GQuark key_id, if (i<((GPtrArray *)data)->len - 1) { str = g_string_append(str, " "); } - /* free each val get with xmlGetProp() in lasso_node_impl_serialize() */ - xmlFree(g_ptr_array_index((GPtrArray *)data, i)); } - g_ptr_array_add(array, (gpointer)g_quark_to_string(key_id)); + g_ptr_array_add(array, g_strdup((gpointer)g_quark_to_string(key_id))); g_ptr_array_add(array, str->str); g_string_free(str, FALSE); g_ptr_array_add((GPtrArray *)user_data, array); @@ -318,10 +315,11 @@ gdata_build_query_foreach_func(GQuark key_id, static GString * lasso_node_impl_build_query(LassoNode *node) { - guint i; + guint i, j; GData *gd; GPtrArray *a, *aa; GString *query; + xmlChar *str_escaped; g_return_val_if_fail (LASSO_IS_NODE(node), NULL); @@ -336,14 +334,19 @@ lasso_node_impl_build_query(LassoNode *node) aa = g_ptr_array_index(a, i); query = g_string_append(query, g_ptr_array_index(aa, 0)); query = g_string_append(query, "="); - query = g_string_append(query, lasso_str_escape(g_ptr_array_index(aa, 1))); + str_escaped = lasso_str_escape(g_ptr_array_index(aa, 1)); + query = g_string_append(query, str_escaped); + xmlFree(str_escaped); if (ilen - 1) { query = g_string_append(query, "&"); } - // free allocated memory + /* free allocated memory for array aa */ + for (j=0; jlen; j++) { + g_free(aa->pdata[j]); + } g_ptr_array_free(aa, TRUE); } - // free allocated memory + /* free allocated memory for array a */ g_ptr_array_free(a, TRUE); g_datalist_clear(&gd); @@ -563,6 +566,18 @@ lasso_node_impl_rename_prop(LassoNode *node, } } +static void +gdata_serialize_destroy_notify(gpointer data) +{ + gint i; + GPtrArray *array = data; + + for (i=0; ilen; i++) { + xmlFree(array->pdata[i]); + } + g_ptr_array_free(array, TRUE); +} + static GData * lasso_node_impl_serialize(LassoNode *node, GData *gd) @@ -583,10 +598,12 @@ lasso_node_impl_serialize(LassoNode *node, for(i=0; ilen; i++) { values = g_ptr_array_new(); name = (xmlChar *)((LassoAttr *)g_ptr_array_index(attrs, i))->name; - /* val must be xmlFree() */ + /* xmlGetProp returns a COPY of attr value + each val must be xmlFree in gdata_serialize_destroy_notify() + which is called by g_datalist_clear() */ val = xmlGetProp(node->private->node, name); g_ptr_array_add(values, val); - g_datalist_set_data(&gd, name, values); + g_datalist_set_data_full(&gd, name, values, gdata_serialize_destroy_notify); } g_ptr_array_free(attrs, TRUE); @@ -600,14 +617,20 @@ lasso_node_impl_serialize(LassoNode *node, break; case XML_TEXT_NODE: name = lasso_node_get_name(node); + /* xmlNodeGetContent returns a COPY of node content + each val must be xmlFree in gdata_serialize_destroy_notify() + which is called by g_datalist_clear() */ + val = xmlNodeGetContent(node->private->node); values = (GPtrArray *)g_datalist_get_data(&gd, name); if (values == NULL) { values = g_ptr_array_new(); + g_ptr_array_add(values, val); + g_datalist_set_data_full(&gd, name, values, + gdata_serialize_destroy_notify); + } + else { + g_ptr_array_add(values, val); } - /* val must be xmlFree() */ - val = xmlNodeGetContent(node->private->node); - g_ptr_array_add(values, val); - g_datalist_set_data(&gd, name, values); break; } } @@ -624,7 +647,7 @@ lasso_node_impl_url_encode(LassoNode *node, { GString *msg; xmlDocPtr doc; - xmlChar *str1, *str2; + xmlChar *str1, *str2, *str_escaped; gchar *ret; g_return_val_if_fail (LASSO_IS_NODE(node), NULL); @@ -633,35 +656,31 @@ lasso_node_impl_url_encode(LassoNode *node, msg = lasso_node_build_query(node); if (sign_method > 0 && private_key_file != NULL) { + msg = g_string_append(msg, "&SigAlg="); switch (sign_method) { case lassoUrlEncodeRsaSha1: - msg = g_string_append(msg, "&SigAlg="); - msg = g_string_append(msg, lasso_str_escape("http://www.w3.org/2000/09/xmldsig#rsa-sha1")); + str_escaped = lasso_str_escape(xmlSecHrefRsaSha1); + msg = g_string_append(msg, str_escaped); doc = lasso_str_sign(msg->str, xmlSecTransformRsaSha1Id, private_key_file); - msg = g_string_append(msg, "&Signature="); - str1 = lasso_doc_get_node_content(doc, xmlSecNodeSignatureValue); - str2 = lasso_str_escape(str1); - xmlFree(str1); - msg = g_string_append(msg, str2); - xmlFree(str2); break; case lassoUrlEncodeDsaSha1: - msg = g_string_append(msg, "&SigAlg="); - msg = g_string_append(msg, lasso_str_escape("http://www.w3.org/2000/09/xmldsig#dsa-sha1")); + str_escaped = lasso_str_escape(xmlSecHrefDsaSha1); + msg = g_string_append(msg, str_escaped); doc = lasso_str_sign(msg->str, xmlSecTransformDsaSha1Id, private_key_file); - msg = g_string_append(msg, "&Signature="); - str1 = lasso_doc_get_node_content(doc, xmlSecNodeSignatureValue); - str2 = lasso_str_escape(str1); - xmlFree(str1); - msg = g_string_append(msg, str2); - xmlFree(str2); break; } + xmlFree(str_escaped); + msg = g_string_append(msg, "&Signature="); + str1 = lasso_doc_get_node_content(doc, xmlSecNodeSignatureValue); + str2 = lasso_str_escape(str1); + xmlFree(str1); + msg = g_string_append(msg, str2); + xmlFree(str2); + xmlFreeDoc(doc); } ret = g_strdup(msg->str); g_string_free(msg, TRUE); - xmlFreeDoc(doc); return (ret); } -- cgit