summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2015-01-31 20:19:40 +0100
committerGravatar Nikias Bassen2015-01-31 20:19:40 +0100
commit9da6e82da3552daf27bf50cc3308bdac886dc28d (patch)
treed5b1b6875e4e9ded9e1f5b7edca7a7578cce0bc3
parent3c4bf492e5211e4196de872b823370670d8c56fc (diff)
downloadlibplist-9da6e82da3552daf27bf50cc3308bdac886dc28d.tar.gz
libplist-9da6e82da3552daf27bf50cc3308bdac886dc28d.tar.bz2
bplist: Fix possible crash in plist_from_bin() caused by access to already freed memory
Given a specifically ordered binary plist the function plist_from_bin() would free BPLIST_DICT or BPLIST_ARRAY raw node data that is still required for parsing of following nodes. This commit addresses this issues by moving the memory free to the end of the parsing process.
-rw-r--r--src/bplist.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/bplist.c b/src/bplist.c
index 40b453b..cbe9481 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -720,8 +720,6 @@ PLIST_API void plist_from_bin(const char *plist_bin, uint32_t length, plist_t *
720 node_attach(nodeslist[i], n); 720 node_attach(nodeslist[i], n);
721 } 721 }
722 } 722 }
723
724 free(data->buff);
725 break; 723 break;
726 724
727 case PLIST_ARRAY: 725 case PLIST_ARRAY:
@@ -738,7 +736,6 @@ PLIST_API void plist_from_bin(const char *plist_bin, uint32_t length, plist_t *
738 node_attach(nodeslist[i], node_copy_deep(nodeslist[index1], copy_plist_data)); 736 node_attach(nodeslist[i], node_copy_deep(nodeslist[index1], copy_plist_data));
739 } 737 }
740 } 738 }
741 free(data->buff);
742 break; 739 break;
743 default: 740 default:
744 break; 741 break;
@@ -749,6 +746,11 @@ PLIST_API void plist_from_bin(const char *plist_bin, uint32_t length, plist_t *
749 746
750 // free unreferenced nodes that would otherwise leak memory 747 // free unreferenced nodes that would otherwise leak memory
751 for (i = 0; i < num_objects; i++) { 748 for (i = 0; i < num_objects; i++) {
749 plist_data_t data = plist_get_data(nodeslist[i]);
750 if ((data->type == PLIST_DICT) || (data->type == PLIST_ARRAY)) {
751 free(data->buff);
752 data->buff = NULL;
753 }
752 if (i == root_object) continue; 754 if (i == root_object) continue;
753 node_t* node = (node_t*)nodeslist[i]; 755 node_t* node = (node_t*)nodeslist[i];
754 if (node && NODE_IS_ROOT(node)) { 756 if (node && NODE_IS_ROOT(node)) {