summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Jonathan Beck2009-02-14 17:32:19 +0100
committerGravatar Jonathan Beck2009-02-14 17:32:19 +0100
commitaa3a4c8d45be9da585d1aae141a546cfbbdf509f (patch)
tree5924d46f2392127fa75272daa99e85fc73c9e9bf /src
parent461c947d1238a1ca5604ec34bd4fe84e040334f7 (diff)
downloadlibplist-aa3a4c8d45be9da585d1aae141a546cfbbdf509f.tar.gz
libplist-aa3a4c8d45be9da585d1aae141a546cfbbdf509f.tar.bz2
Fix some memory leaks.
Diffstat (limited to 'src')
-rw-r--r--src/bplist.c1
-rw-r--r--src/plist.c16
-rw-r--r--src/plist.h2
-rw-r--r--src/xplist.c52
4 files changed, 42 insertions, 29 deletions
diff --git a/src/bplist.c b/src/bplist.c
index 003bff1..d848e6a 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -487,6 +487,7 @@ void plist_from_bin(const char *plist_bin, uint32_t length, plist_t * plist)
487 } 487 }
488 488
489 *plist = nodeslist[root_object]; 489 *plist = nodeslist[root_object];
490 free(nodeslist);
490} 491}
491 492
492static guint plist_data_hash(gconstpointer key) 493static guint plist_data_hash(gconstpointer key)
diff --git a/src/plist.c b/src/plist.c
index 87a1de5..c69f4c1 100644
--- a/src/plist.c
+++ b/src/plist.c
@@ -44,16 +44,27 @@ plist_data_t plist_new_plist_data()
44 return data; 44 return data;
45} 45}
46 46
47void plist_free_plist_data(plist_data_t data) 47static void plist_free_node(GNode * node, gpointer none)
48{ 48{
49 plist_data_t data = plist_get_data(node);
49 if (data) { 50 if (data) {
50 switch (data->type) { 51 switch (data->type) {
51 52 case PLIST_KEY:
53 case PLIST_STRING:
54 free(data->strval);
55 break;
56 case PLIST_UNICODE:
57 free(data->unicodeval);
58 break;
59 case PLIST_DATA:
60 free(data->buff);
61 break;
52 default: 62 default:
53 break; 63 break;
54 } 64 }
55 free(data); 65 free(data);
56 } 66 }
67 node->data = NULL;
57} 68}
58 69
59plist_t plist_new_dict() 70plist_t plist_new_dict()
@@ -133,6 +144,7 @@ static plist_t plist_add_sub_element(plist_t node, plist_type type, const void *
133 144
134void plist_free(plist_t plist) 145void plist_free(plist_t plist)
135{ 146{
147 g_node_children_foreach(plist, G_TRAVERSE_ALL, plist_free_node, NULL);
136 g_node_destroy(plist); 148 g_node_destroy(plist);
137} 149}
138 150
diff --git a/src/plist.h b/src/plist.h
index 48b66f1..4bb97e3 100644
--- a/src/plist.h
+++ b/src/plist.h
@@ -49,7 +49,7 @@ typedef struct plist_data_s *plist_data_t;
49plist_t plist_new_node(plist_data_t data); 49plist_t plist_new_node(plist_data_t data);
50plist_data_t plist_get_data(const plist_t node); 50plist_data_t plist_get_data(const plist_t node);
51plist_data_t plist_new_plist_data(); 51plist_data_t plist_new_plist_data();
52void plist_free_plist_data(plist_data_t node); 52
53 53
54 54
55#endif 55#endif
diff --git a/src/xplist.c b/src/xplist.c
index e985243..525706c 100644
--- a/src/xplist.c
+++ b/src/xplist.c
@@ -112,18 +112,6 @@ static xmlDocPtr new_xml_plist()
112 return plist_xml; 112 return plist_xml;
113} 113}
114 114
115/** Destroys a previously created XML document.
116 *
117 * @param plist The XML document to destroy.
118 */
119static void free_plist(xmlDocPtr plist)
120{
121 if (!plist)
122 return;
123
124 xmlFreeDoc(plist);
125}
126
127static void node_to_xml(GNode * node, gpointer xml_struct) 115static void node_to_xml(GNode * node, gpointer xml_struct)
128{ 116{
129 struct xml_node *xstruct = NULL; 117 struct xml_node *xstruct = NULL;
@@ -284,61 +272,72 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)
284 } 272 }
285 273
286 if (!xmlStrcmp(node->name, XPLIST_INT)) { 274 if (!xmlStrcmp(node->name, XPLIST_INT)) {
287 char *strval = (char *) xmlNodeGetContent(node); 275 xmlChar *strval = xmlNodeGetContent(node);
288 data->intval = g_ascii_strtoull(strval, NULL, 0); 276 data->intval = g_ascii_strtoull((char *)strval, NULL, 0);
289 data->type = PLIST_UINT; 277 data->type = PLIST_UINT;
290 data->length = 8; 278 data->length = 8;
279 xmlFree(strval);
291 continue; 280 continue;
292 } 281 }
293 282
294 if (!xmlStrcmp(node->name, XPLIST_REAL)) { 283 if (!xmlStrcmp(node->name, XPLIST_REAL)) {
295 char *strval = (char *) xmlNodeGetContent(node); 284 xmlChar *strval = xmlNodeGetContent(node);
296 data->realval = atof(strval); 285 data->realval = atof((char *)strval);
297 data->type = PLIST_REAL; 286 data->type = PLIST_REAL;
298 data->length = 8; 287 data->length = 8;
288 xmlFree(strval);
299 continue; 289 continue;
300 } 290 }
301 291
302 if (!xmlStrcmp(node->name, XPLIST_DATE)) { 292 if (!xmlStrcmp(node->name, XPLIST_DATE)) {
303 g_time_val_from_iso8601((char *) xmlNodeGetContent(node), &data->timeval); 293 xmlChar *strval = xmlNodeGetContent(node);
294 g_time_val_from_iso8601((char *) strval, &data->timeval);
304 data->type = PLIST_DATE; 295 data->type = PLIST_DATE;
305 data->length = sizeof(GTimeVal); 296 data->length = sizeof(GTimeVal);
297 xmlFree(strval);
306 continue; 298 continue;
307 } 299 }
308 300
309 if (!xmlStrcmp(node->name, XPLIST_STRING)) { 301 if (!xmlStrcmp(node->name, XPLIST_STRING)) {
310 302 xmlChar *strval = xmlNodeGetContent(node);
311 tmp = xmlNodeGetContent(node); 303 len = strlen((char *) strval);
312 len = strlen((char *) tmp);
313 items_read = 0; 304 items_read = 0;
314 items_written = 0; 305 items_written = 0;
315 error = NULL; 306 error = NULL;
316 type = xmlDetectCharEncoding(tmp, len); 307 type = xmlDetectCharEncoding(strval, len);
317 308
318 if (XML_CHAR_ENCODING_UTF8 == type) { 309 if (XML_CHAR_ENCODING_UTF8 == type) {
319 data->unicodeval = g_utf8_to_utf16((char *) tmp, len, &items_read, &items_written, &error); 310 data->unicodeval = g_utf8_to_utf16((char *) strval, len, &items_read, &items_written, &error);
320 data->type = PLIST_UNICODE; 311 data->type = PLIST_UNICODE;
321 data->length = items_written; 312 data->length = items_written;
322 } else if (XML_CHAR_ENCODING_ASCII == type || XML_CHAR_ENCODING_NONE == type) { 313 } else if (XML_CHAR_ENCODING_ASCII == type || XML_CHAR_ENCODING_NONE == type) {
323 data->strval = strdup((char *) xmlNodeGetContent(node)); 314 data->strval = strdup((char *) strval);
324 data->type = PLIST_STRING; 315 data->type = PLIST_STRING;
325 data->length = strlen(data->strval); 316 data->length = strlen(data->strval);
326 } 317 }
318 xmlFree(strval);
327 continue; 319 continue;
328 } 320 }
329 321
330 if (!xmlStrcmp(node->name, XPLIST_KEY)) { 322 if (!xmlStrcmp(node->name, XPLIST_KEY)) {
331 data->strval = strdup((char *) xmlNodeGetContent(node)); 323 xmlChar *strval = xmlNodeGetContent(node);
324 data->strval = strdup((char *) strval);
332 data->type = PLIST_KEY; 325 data->type = PLIST_KEY;
333 data->length = strlen(data->strval); 326 data->length = strlen(data->strval);
327 xmlFree(strval);
334 continue; 328 continue;
335 } 329 }
336 330
337 if (!xmlStrcmp(node->name, XPLIST_DATA)) { 331 if (!xmlStrcmp(node->name, XPLIST_DATA)) {
332 xmlChar *strval = xmlNodeGetContent(node);
338 gsize size = 0; 333 gsize size = 0;
339 data->buff = g_base64_decode((char *) xmlNodeGetContent(node), &size); 334 guchar *dec = g_base64_decode((char *) strval, &size);
335 data->buff = (uint8_t*) malloc( size * sizeof(uint8_t));
336 memcpy(data->buff, dec, size * sizeof(uint8_t));
337 g_free(dec);
340 data->length = size; 338 data->length = size;
341 data->type = PLIST_DATA; 339 data->type = PLIST_DATA;
340 xmlFree(strval);
342 continue; 341 continue;
343 } 342 }
344 343
@@ -374,7 +373,7 @@ void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length)
374 xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, &size); 373 xmlDocDumpMemory(plist_doc, (xmlChar **) plist_xml, &size);
375 if (size >= 0) 374 if (size >= 0)
376 *length = size; 375 *length = size;
377 free_plist(plist_doc); 376 xmlFreeDoc(plist_doc);
378} 377}
379 378
380void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist) 379void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist)
@@ -383,4 +382,5 @@ void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist)
383 xmlNodePtr root_node = xmlDocGetRootElement(plist_doc); 382 xmlNodePtr root_node = xmlDocGetRootElement(plist_doc);
384 383
385 xml_to_node(root_node, plist); 384 xml_to_node(root_node, plist);
385 xmlFreeDoc(plist_doc);
386} 386}