diff -r 3ad2e14e4cb7 -r c9c90315ea24 librazor/merger.c --- a/librazor/merger.c Wed Jan 14 11:47:55 2009 +0000 +++ b/librazor/merger.c Wed Apr 22 15:09:17 2009 +0100 @@ -231,16 +231,15 @@ uint32_t e; int found_file = 0; - e = top->start; + e = top - files; do { - if (files[e].start) - fix_file_map(map, files, &files[e]); + if (files[e].start && + fix_file_map(map, files, &files[files[e].start])) + map[e] = 1; if (map[e]) found_file = 1; } while (!(files[e++].flags & RAZOR_ENTRY_LAST)); - if (found_file) - map[top - files] = 1; return found_file; } @@ -271,9 +270,9 @@ array_init(&merge_stack); start = merger->set->files.size / sizeof (struct razor_entry); - last = 0; - e1 = md->dir1 ? root1 + md->dir1 : NULL; - e2 = md->dir2 ? root2 + md->dir2 : NULL; + last = 0xFFFFFFFF; + e1 = md->dir1 != 0xFFFFFFFF ? root1 + md->dir1 : NULL; + e2 = md->dir2 != 0xFFFFFFFF ? root2 + md->dir2 : NULL; while (e1 || e2) { if (!e2 && !map1[e1 - root1]) { if ((e1++)->flags & RAZOR_ENTRY_LAST) @@ -311,7 +310,7 @@ child_md = array_add(&merge_stack, sizeof (struct merge_directory)); child_md->merged = last; child_md->dir1 = e1->start; - child_md->dir2 = 0; + child_md->dir2 = 0xFFFFFFFF; } } if ((e1++)->flags & RAZOR_ENTRY_LAST) @@ -323,7 +322,7 @@ if (e2->start) { child_md = array_add(&merge_stack, sizeof (struct merge_directory)); child_md->merged = last; - child_md->dir1 = 0; + child_md->dir1 = 0xFFFFFFFF; child_md->dir2 = e2->start; } } @@ -335,8 +334,8 @@ if (e1->start || e2->start) { child_md = array_add(&merge_stack, sizeof (struct merge_directory)); child_md->merged = last; - child_md->dir1 = e1->start; - child_md->dir2 = e2->start; + child_md->dir1 = e1->start ? e1->start : 0xFFFFFFFF; + child_md->dir2 = e2->start ? e2->start : 0xFFFFFFFF; } if ((e1++)->flags & RAZOR_ENTRY_LAST) e1 = NULL; @@ -346,11 +345,10 @@ } mroot = (struct razor_entry *)merger->set->files.data; - if (last) { + if (last != 0xFFFFFFFF) { mroot[last].flags = RAZOR_ENTRY_LAST; mroot[md->merged].start = start; - } else - mroot[md->merged].start = 0; + } end_md = merge_stack.data + merge_stack.size; for (child_md = merge_stack.data; child_md < end_md; child_md++) @@ -374,17 +372,23 @@ root = (struct razor_entry *) merger->source1.set->files.data; if (root->start) fix_file_map(map1, root, root); - md.dir1 = root->start; - } else md.dir1 = 0; + } else { + md.dir1 = 0xFFFFFFFF; + } if (merger->source2.set->files.size) { root = (struct razor_entry *) merger->source2.set->files.data; if (root->start) fix_file_map(map2, root, root); - md.dir2 = root->start; - } else md.dir2 = 0; + } else { + md.dir2 = 0xFFFFFFFF; + } + + /* Remove the unnamed root which razor_set_create() added */ + array_release(&merger->set->files); + array_init(&merger->set->files); merge_one_directory(merger, &md); }