Bug fix: Prevent allocation of empty ECMA-119 directory children list.

Thanks Richard Nolde.
This commit is contained in:
Thomas Schmitt 2014-04-02 19:06:53 +02:00
parent 0e00aeb638
commit 185cbd99bf

View File

@ -201,22 +201,25 @@ static
int create_dir(Ecma119Image *img, IsoDir *iso, Ecma119Node **node) int create_dir(Ecma119Image *img, IsoDir *iso, Ecma119Node **node)
{ {
int ret; int ret;
Ecma119Node **children; Ecma119Node **children = NULL;
struct ecma119_dir_info *dir_info; struct ecma119_dir_info *dir_info;
if (iso->nchildren > 0) {
children = calloc(1, sizeof(void*) * iso->nchildren); children = calloc(1, sizeof(void*) * iso->nchildren);
if (children == NULL) { if (children == NULL)
return ISO_OUT_OF_MEM; return ISO_OUT_OF_MEM;
} }
dir_info = calloc(1, sizeof(struct ecma119_dir_info)); dir_info = calloc(1, sizeof(struct ecma119_dir_info));
if (dir_info == NULL) { if (dir_info == NULL) {
if (children != NULL)
free(children); free(children);
return ISO_OUT_OF_MEM; return ISO_OUT_OF_MEM;
} }
ret = create_ecma119_node(img, (IsoNode*)iso, node); ret = create_ecma119_node(img, (IsoNode*)iso, node);
if (ret < 0) { if (ret < 0) {
if (children != NULL)
free(children); free(children);
free(dir_info); free(dir_info);
return ret; return ret;
@ -353,6 +356,7 @@ void ecma119_node_free(Ecma119Node *node)
for (i = 0; i < node->info.dir->nchildren; i++) { for (i = 0; i < node->info.dir->nchildren; i++) {
ecma119_node_free(node->info.dir->children[i]); ecma119_node_free(node->info.dir->children[i]);
} }
if (node->info.dir->children != NULL)
free(node->info.dir->children); free(node->info.dir->children);
free(node->info.dir); free(node->info.dir);
} }
@ -564,6 +568,8 @@ void sort_tree(Ecma119Node *root)
{ {
size_t i; size_t i;
if (root->info.dir->children == NULL)
return;
qsort(root->info.dir->children, root->info.dir->nchildren, sizeof(void*), qsort(root->info.dir->children, root->info.dir->nchildren, sizeof(void*),
cmp_node_name); cmp_node_name);
for (i = 0; i < root->info.dir->nchildren; i++) { for (i = 0; i < root->info.dir->nchildren; i++) {