* along with wimlib; if not, see http://www.gnu.org/licenses/.
*/
-#include "wimlib_internal.h"
-#include "dentry.h"
-#include "list.h"
-#include "lookup_table.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "wimlib/capture.h"
+#include "wimlib/dentry.h"
+#include "wimlib/error.h"
+#include "wimlib/lookup_table.h"
/* NULL NULL
* ^ ^
pos = d_inode->i_ino % table->capacity;
hlist_for_each_entry(inode, cur, &table->array[pos], i_hlist) {
if (inode->i_ino == d_inode->i_ino) {
+ if (unlikely((inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY) ||
+ (d_inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY)))
+ {
+ ERROR("Unsupported directory hard link "
+ "\"%"TS"\" <=> \"%"TS"\"",
+ dentry_full_path(dentry),
+ dentry_full_path(inode_first_dentry(inode)));
+ return WIMLIB_ERR_INVALID_DENTRY;
+ }
inode_add_dentry(dentry, inode);
inode->i_nlink++;
return 0;
wimlib_assert(inode->i_nlink == inode_link_count(inode));
+ if (inode->i_nlink > 1 &&
+ (inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ ERROR("Found unsupported directory hard link!");
+ return WIMLIB_ERR_INVALID_DENTRY;
+ }
+
LIST_HEAD(dentries_with_data_streams);
LIST_HEAD(dentries_with_no_data_streams);
HLIST_HEAD(true_inodes);
DEBUG("Inserting dentries into inode table");
ret = init_inode_table(&inode_tab, 9001);
if (ret)
- return ret;
+ goto out;
- for_dentry_in_tree(root, inode_table_insert, &inode_tab);
+ ret = for_dentry_in_tree(root, inode_table_insert, &inode_tab);
+ if (ret)
+ goto out_destroy_image_table;
DEBUG("Cleaning up the hard link groups");
ino_changes_needed = false;
ret = fix_inodes(&inode_tab, inode_list, &ino_changes_needed);
- destroy_inode_table(&inode_tab);
+ if (ret)
+ goto out_destroy_image_table;
- if (ret == 0 && ino_changes_needed) {
+ if (ino_changes_needed) {
u64 cur_ino = 1;
struct wim_inode *inode;
inode->i_ino = 0;
}
}
+ ret = 0;
+out_destroy_image_table:
+ destroy_inode_table(&inode_tab);
+out:
return ret;
}
inode->i_ino = cur_ino++;
else
inode->i_ino = 0;
- list_add_tail(&inode->i_list, head);
}
for (size_t i = 0; i < table->capacity; i++) {