summaryrefslogtreecommitdiffstats
path: root/lasso
diff options
context:
space:
mode:
authorValery Febvre <vfebvre at easter-eggs.com>2004-04-27 13:03:47 +0000
committerValery Febvre <vfebvre at easter-eggs.com>2004-04-27 13:03:47 +0000
commitb83db4d9de88d3af8f5baf430cd5f985d291a3d7 (patch)
treec616e81ab3ddfd6993318950b9e92c12582b0c7a /lasso
parente3e8147360b836696365be8f29b1cccfeaf51830 (diff)
downloadlasso-b83db4d9de88d3af8f5baf430cd5f985d291a3d7.tar.gz
lasso-b83db4d9de88d3af8f5baf430cd5f985d291a3d7.tar.xz
lasso-b83db4d9de88d3af8f5baf430cd5f985d291a3d7.zip
Memory leaks fixed
Diffstat (limited to 'lasso')
-rw-r--r--lasso/xml/tools.c36
-rw-r--r--lasso/xml/xml.c89
2 files changed, 79 insertions, 46 deletions
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; i<array->len; 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 (i<a->len - 1) {
query = g_string_append(query, "&");
}
- // free allocated memory
+ /* free allocated memory for array aa */
+ for (j=0; j<aa->len; 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; i<array->len; 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; i<attrs->len; 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);
}