diff options
| author | 2016-06-29 13:17:00 +0200 | |
|---|---|---|
| committer | 2016-06-29 13:17:00 +0200 | |
| commit | 16f45a04f8790f36e5af939bfd728ee410470e05 (patch) | |
| tree | f92be6bb3f0663f21941bbc20407736879225fed | |
| parent | 02bd8acd41d1ed7891100fa0057981e98a0dbdad (diff) | |
| download | libplist-16f45a04f8790f36e5af939bfd728ee410470e05.tar.gz libplist-16f45a04f8790f36e5af939bfd728ee410470e05.tar.bz2 | |
xplist: Plug memory leak when converting PLIST_UID nodes to XML
In node_to_xml nodes of type PLIST_UID are temporarily converted
to a PLIST_DICT for an appropriate XML output. Therefore a PLIST_KEY
and a PLIST_UINT node is created and inserted into the PLIST_DICT
node. Upon completion, the child nodes of the PLIST_DICT node are
detached from the original node and freed, however the data of the
child nodes - the key string and the uint value - are not.
This commit fixes it.
| -rw-r--r-- | src/plist.c | 2 | ||||
| -rw-r--r-- | src/plist.h | 1 | ||||
| -rw-r--r-- | src/xplist.c | 1 |
3 files changed, 3 insertions, 1 deletions
diff --git a/src/plist.c b/src/plist.c index d20a252..703ac65 100644 --- a/src/plist.c +++ b/src/plist.c | |||
| @@ -91,7 +91,7 @@ plist_data_t plist_new_plist_data(void) | |||
| 91 | return data; | 91 | return data; |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | static void plist_free_data(plist_data_t data) | 94 | void plist_free_data(plist_data_t data) |
| 95 | { | 95 | { |
| 96 | if (data) | 96 | if (data) |
| 97 | { | 97 | { |
diff --git a/src/plist.h b/src/plist.h index 822144d..ad65dea 100644 --- a/src/plist.h +++ b/src/plist.h | |||
| @@ -67,6 +67,7 @@ typedef struct plist_data_s *plist_data_t; | |||
| 67 | plist_t plist_new_node(plist_data_t data); | 67 | plist_t plist_new_node(plist_data_t data); |
| 68 | plist_data_t plist_get_data(const plist_t node); | 68 | plist_data_t plist_get_data(const plist_t node); |
| 69 | plist_data_t plist_new_plist_data(void); | 69 | plist_data_t plist_new_plist_data(void); |
| 70 | void plist_free_data(plist_data_t data); | ||
| 70 | int plist_data_compare(const void *a, const void *b); | 71 | int plist_data_compare(const void *a, const void *b); |
| 71 | 72 | ||
| 72 | 73 | ||
diff --git a/src/xplist.c b/src/xplist.c index e0a76da..8fe3604 100644 --- a/src/xplist.c +++ b/src/xplist.c | |||
| @@ -337,6 +337,7 @@ static void node_to_xml(node_t* node, void *xml_struct) | |||
| 337 | for (j = num; j > 0; j--) { | 337 | for (j = num; j > 0; j--) { |
| 338 | node_t* ch = node_nth_child(node, j-1); | 338 | node_t* ch = node_nth_child(node, j-1); |
| 339 | node_detach(node, ch); | 339 | node_detach(node, ch); |
| 340 | plist_free_data((plist_data_t)((node_t*)ch)->data); | ||
| 340 | node_destroy(ch); | 341 | node_destroy(ch); |
| 341 | } | 342 | } |
| 342 | node_data->type = PLIST_UID; | 343 | node_data->type = PLIST_UID; |
