From 075e1470621233971f5785ce12e5106f3c0f4d42 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sun, 26 Aug 2012 13:19:20 -0500 Subject: [PATCH] Misc. fixes --- src/dentry.c | 1 + src/mount.c | 26 ++++++++++++++++++++++++-- src/ntfs-apply.c | 8 ++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/dentry.c b/src/dentry.c index c84a9565..3f258b76 100644 --- a/src/dentry.c +++ b/src/dentry.c @@ -478,6 +478,7 @@ int print_dentry(struct dentry *dentry, void *lookup_table) printf("Hash = 0x"); print_hash(hash); putchar('\n'); + putchar('\n'); } } for (u16 i = 0; i < dentry->num_ads; i++) { diff --git a/src/mount.c b/src/mount.c index 58bbabec..6bdd0c45 100644 --- a/src/mount.c +++ b/src/mount.c @@ -1770,12 +1770,34 @@ static int check_lte_refcnt(struct lookup_table_entry *lte, void *ignore) lte_group_size++; if (lte_group_size > lte->refcnt) { #ifdef ENABLE_ERROR_MESSAGES - ERROR("The following lookup table entry has a reference count " + struct dentry *example_dentry; + struct list_head *next; + struct stream_list_head *head; + WARNING("The following lookup table entry has a reference count " "of %u, but", lte->refcnt); - ERROR("We found %u references to it", lte_group_size); + WARNING("We found %u references to it", lte_group_size); + next = lte->lte_group_list.next; + head = container_of(next, struct stream_list_head, list); + if (head->type == STREAM_TYPE_NORMAL) { + example_dentry = container_of(head, struct dentry, + lte_group_list); + WARNING("(One dentry referencing it is at `%s')", + example_dentry->full_path_utf8); + } print_lookup_table_entry(lte); #endif + /* Guess what! install.wim for Windows 8 contains a stream with + * 2 dentries referencing it, but the lookup table entry has + * reference count of 1. So we will need to handle this case + * and not just make it be an error... I'm just setting the + * reference count to the number of references we found. */ + + #if 1 + lte->refcnt = lte_group_size; + WARNING("Fixing reference count"); + #else return WIMLIB_ERR_INVALID_DENTRY; + #endif } return 0; } diff --git a/src/ntfs-apply.c b/src/ntfs-apply.c index 3ac62291..d3457fb8 100644 --- a/src/ntfs-apply.c +++ b/src/ntfs-apply.c @@ -305,7 +305,8 @@ static int preapply_dentry_with_dos_name(struct dentry *dentry, char orig; ntfs_volume *vol = (*dir_ni_p)->vol; - DEBUG("pre-applying DOS name `%s'", dentry_with_dos_name); + DEBUG("pre-applying DOS name `%s'", + dentry_with_dos_name->full_path_utf8); ret = do_wim_apply_dentry_ntfs(dentry_with_dos_name, *dir_ni_p, w); if (ret != 0) @@ -364,8 +365,11 @@ static int do_wim_apply_dentry_ntfs(struct dentry *dentry, ntfs_inode *dir_ni, if (other->extracted_file) { ret = wim_apply_hardlink_ntfs(dentry, other, dir_ni, &ni); + is_hardlink = true; if (ret != 0) - return ret; + goto out_close_dir_ni; + else + goto out_set_dos_name; } } /* Can't make a hard link */ -- 2.43.0