diff options
| author | 2009-02-14 17:32:19 +0100 | |
|---|---|---|
| committer | 2009-02-14 17:32:19 +0100 | |
| commit | aa3a4c8d45be9da585d1aae141a546cfbbdf509f (patch) | |
| tree | 5924d46f2392127fa75272daa99e85fc73c9e9bf /src/xplist.c | |
| parent | 461c947d1238a1ca5604ec34bd4fe84e040334f7 (diff) | |
| download | libplist-aa3a4c8d45be9da585d1aae141a546cfbbdf509f.tar.gz libplist-aa3a4c8d45be9da585d1aae141a546cfbbdf509f.tar.bz2 | |
Fix some memory leaks.
Diffstat (limited to 'src/xplist.c')
| -rw-r--r-- | src/xplist.c | 52 |
1 files changed, 26 insertions, 26 deletions
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 | */ | ||
| 119 | static void free_plist(xmlDocPtr plist) | ||
| 120 | { | ||
| 121 | if (!plist) | ||
| 122 | return; | ||
| 123 | |||
| 124 | xmlFreeDoc(plist); | ||
| 125 | } | ||
| 126 | |||
| 127 | static void node_to_xml(GNode * node, gpointer xml_struct) | 115 | static 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 | ||
| 380 | void plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist) | 379 | void 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 | } |
