X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fdentry.c;h=fa7ff56b2073dfa88f43f26f2c231c9899149d9e;hb=e0beab67ce67493da928a9fe5957c1f258073b9a;hp=aec94c3435c901778f73894459f208eef33e7db0;hpb=aa882e9bb92d998707484d7f6f56e9cf109a7c62;p=wimlib diff --git a/src/dentry.c b/src/dentry.c index aec94c34..fa7ff56b 100644 --- a/src/dentry.c +++ b/src/dentry.c @@ -176,7 +176,7 @@ static u64 dentry_total_length(const struct dentry *dentry) return __dentry_total_length(dentry, dentry->length); } -/* Transfers file attributes from a `stat' buffer to an inode. */ +/* Transfers file attributes from a `stat' buffer to a WIM "inode". */ void stbuf_to_inode(const struct stat *stbuf, struct inode *inode) { if (S_ISLNK(stbuf->st_mode)) { @@ -191,7 +191,7 @@ void stbuf_to_inode(const struct stat *stbuf, struct inode *inode) inode->ino = (u64)stbuf->st_ino; else inode->ino = (u64)stbuf->st_ino | - ((u64)stbuf->st_dev << (sizeof(ino_t) * 8)); + ((u64)stbuf->st_dev << ((sizeof(ino_t) * 8) & 63)); /* Set timestamps */ inode->creation_time = timespec_to_wim_timestamp(&stbuf->st_mtim); inode->last_write_time = timespec_to_wim_timestamp(&stbuf->st_mtim); @@ -590,26 +590,26 @@ static void dentry_common_init(struct dentry *dentry) static struct inode *new_timeless_inode() { struct inode *inode = CALLOC(1, sizeof(struct inode)); - if (!inode) - return NULL; - inode->security_id = -1; - inode->link_count = 1; -#ifdef WITH_FUSE - inode->next_stream_id = 1; -#endif - INIT_LIST_HEAD(&inode->dentry_list); + if (inode) { + inode->security_id = -1; + inode->link_count = 1; + #ifdef WITH_FUSE + inode->next_stream_id = 1; + #endif + INIT_LIST_HEAD(&inode->dentry_list); + } return inode; } static struct inode *new_inode() { struct inode *inode = new_timeless_inode(); - if (!inode) - return NULL; - u64 now = get_wim_timestamp(); - inode->creation_time = now; - inode->last_access_time = now; - inode->last_write_time = now; + if (inode) { + u64 now = get_wim_timestamp(); + inode->creation_time = now; + inode->last_access_time = now; + inode->last_write_time = now; + } return inode; } @@ -703,6 +703,7 @@ void free_inode(struct inode *inode) wimlib_assert(inode->num_opened_fds == 0); FREE(inode->fds); #endif + FREE(inode->extracted_file); FREE(inode); } } @@ -719,7 +720,6 @@ static void put_inode(struct inode *inode) #endif { free_inode(inode); - inode = NULL; } } } @@ -737,7 +737,8 @@ void free_dentry(struct dentry *dentry) FREE(dentry->file_name_utf8); FREE(dentry->short_name); FREE(dentry->full_path_utf8); - put_inode(dentry->d_inode); + if (dentry->d_inode) + put_inode(dentry->d_inode); FREE(dentry); }