X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fdentry.c;h=48b310411f2d1ed447bcd6eb19298f4ab90e01fc;hb=603da5edd9d878b6ffeb11508a18356e5c324aaf;hp=7cd93ed1ab9e42a21aa0dfcaf6ae31d6e5e441c7;hpb=ff556d243953bd6df1399466c452f327feae2ed9;p=wimlib diff --git a/src/dentry.c b/src/dentry.c index 7cd93ed1..48b31041 100644 --- a/src/dentry.c +++ b/src/dentry.c @@ -230,13 +230,13 @@ for_dentry_tree_in_rbtree(struct rb_node *node, int ret; if (node) { ret = for_dentry_tree_in_rbtree(node->rb_left, visitor, arg); - if (ret != 0) + if (ret) return ret; ret = for_dentry_in_tree(rbnode_dentry(node), visitor, arg); - if (ret != 0) + if (ret) return ret; ret = for_dentry_tree_in_rbtree(node->rb_right, visitor, arg); - if (ret != 0) + if (ret) return ret; } return 0; @@ -250,11 +250,15 @@ int for_dentry_in_tree(struct wim_dentry *root, int (*visitor)(struct wim_dentry*, void*), void *arg) { - int ret = visitor(root, arg); - if (ret == 0) { - ret = for_dentry_tree_in_rbtree(root->d_inode->i_children.rb_node, - visitor, - arg); + int ret = 0; + + if (root) { + int ret = visitor(root, arg); + if (ret == 0) { + ret = for_dentry_tree_in_rbtree(root->d_inode->i_children.rb_node, + visitor, + arg); + } } return ret; } @@ -265,11 +269,13 @@ int for_dentry_in_tree_depth(struct wim_dentry *root, int (*visitor)(struct wim_dentry*, void*), void *arg) { - int ret; - ret = for_dentry_tree_in_rbtree_depth(root->d_inode->i_children.rb_node, - visitor, arg); - if (ret == 0) - ret = visitor(root, arg); + int ret = 0; + if (root) { + ret = for_dentry_tree_in_rbtree_depth(root->d_inode->i_children.rb_node, + visitor, arg); + if (ret == 0) + ret = visitor(root, arg); + } return ret; } @@ -711,6 +717,7 @@ new_timeless_inode() inode->i_nlink = 1; inode->i_next_stream_id = 1; inode->i_not_rpfixed = 1; + INIT_LIST_HEAD(&inode->i_list); #ifdef WITH_FUSE if (pthread_mutex_init(&inode->i_mutex, NULL) != 0) { ERROR_WITH_ERRNO("Error initializing mutex"); @@ -843,9 +850,10 @@ free_inode(struct wim_inode *inode) wimlib_assert(inode->i_num_opened_fds == 0); FREE(inode->i_fds); pthread_mutex_destroy(&inode->i_mutex); - if (inode->i_hlist.pprev) - hlist_del(&inode->i_hlist); #endif + /* HACK: This may instead delete the inode from i_list, but the + * hlist_del() behaves the same as list_del(). */ + hlist_del(&inode->i_hlist); FREE(inode->i_extracted_file); FREE(inode); } @@ -917,8 +925,7 @@ do_free_dentry(struct wim_dentry *dentry, void *__lookup_table) void free_dentry_tree(struct wim_dentry *root, struct wim_lookup_table *lookup_table) { - if (root) - for_dentry_in_tree_depth(root, do_free_dentry, lookup_table); + for_dentry_in_tree_depth(root, do_free_dentry, lookup_table); } /* @@ -1211,7 +1218,7 @@ inode_get_unix_data(const struct wim_inode *inode, if (size != sizeof(struct wimlib_unix_data)) return BAD_UNIX_DATA; - ret = read_full_resource_into_buf(lte, unix_data, true); + ret = read_full_resource_into_buf(lte, unix_data); if (ret) return ret; @@ -1268,13 +1275,13 @@ replace_forbidden_characters(utf16lechar *name) #ifdef __WIN32__ if (wcschr(L"<>:\"/\\|?*", (wchar_t)*p)) #else - if (*p == '/') + if (*p == cpu_to_le16('/')) #endif { #ifdef __WIN32__ *p = cpu_to_le16(0xfffd); #else - *p = '?'; + *p = cpu_to_le16('?'); #endif if (name) { WARNING("File, directory, or stream name \"%"WS"\"\n"