X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fdentry.c;h=3847fbb2a6fd429dd2eb925c343679f9dcc7a48e;hb=cecdece7933824c248a1b07021ce576f0f9d6892;hp=daab2fea4bd16a3f96cc851897a0e6f3d6659976;hpb=b001aca524f15cb0239518537378924725cc5b12;p=wimlib diff --git a/src/dentry.c b/src/dentry.c index daab2fea..3847fbb2 100644 --- a/src/dentry.c +++ b/src/dentry.c @@ -83,13 +83,12 @@ int get_names(char **name_utf16_ret, char **name_utf8_ret, size_t utf8_len; size_t utf16_len; char *name_utf16, *name_utf8; + int ret; utf8_len = strlen(name); - - name_utf16 = utf8_to_utf16(name, utf8_len, &utf16_len); - - if (!name_utf16) - return WIMLIB_ERR_NOMEM; + ret = utf8_to_utf16(name, utf8_len, &name_utf16, &utf16_len); + if (ret != 0) + return ret; name_utf8 = MALLOC(utf8_len + 1); if (!name_utf8) { @@ -115,11 +114,14 @@ static int change_dentry_name(struct dentry *dentry, const char *new_name) ret = get_names(&dentry->file_name, &dentry->file_name_utf8, &dentry->file_name_len, &dentry->file_name_utf8_len, - new_name); - FREE(dentry->short_name); - dentry->short_name_len = 0; - if (ret == 0) + new_name); + if (ret == 0) { + if (dentry->short_name_len) { + FREE(dentry->short_name); + dentry->short_name_len = 0; + } dentry->length = dentry_correct_length(dentry); + } return ret; } @@ -809,6 +811,9 @@ static struct inode *new_inode() * * Returns a pointer to the new dentry, or NULL if out of memory. */ +#ifndef WITH_FUSE +static +#endif struct dentry *new_dentry(const char *name) { struct dentry *dentry; @@ -826,7 +831,7 @@ struct dentry *new_dentry(const char *name) return dentry; err: FREE(dentry); - ERROR("Failed to allocate new dentry"); + ERROR_WITH_ERRNO("Failed to create new dentry with name \"%s\"", name); return NULL; } @@ -890,6 +895,8 @@ void free_inode(struct inode *inode) wimlib_assert(inode->num_opened_fds == 0); FREE(inode->fds); pthread_mutex_destroy(&inode->i_mutex); + if (inode->hlist.pprev) + hlist_safe_del(&inode->hlist); #endif FREE(inode->extracted_file); FREE(inode); @@ -1249,15 +1256,14 @@ static int read_ads_entries(const u8 *p, struct inode *inode, } get_bytes(p, cur_entry->stream_name_len, (u8*)cur_entry->stream_name); - cur_entry->stream_name_utf8 = utf16_to_utf8(cur_entry->stream_name, - cur_entry->stream_name_len, - &utf8_len); - cur_entry->stream_name_utf8_len = utf8_len; - if (!cur_entry->stream_name_utf8) { - ret = WIMLIB_ERR_NOMEM; + ret = utf16_to_utf8(cur_entry->stream_name, + cur_entry->stream_name_len, + &cur_entry->stream_name_utf8, + &utf8_len); + if (ret != 0) goto out_free_ads_entries; - } + cur_entry->stream_name_utf8_len = utf8_len; } /* It's expected that the size of every ADS entry is a multiple * of 8. However, to be safe, I'm allowing the possibility of @@ -1432,15 +1438,10 @@ int read_dentry(const u8 metadata_resource[], u64 metadata_resource_len, p = get_bytes(p, file_name_len, file_name); /* Convert filename to UTF-8. */ - file_name_utf8 = utf16_to_utf8(file_name, file_name_len, - &file_name_utf8_len); - - if (!file_name_utf8) { - ERROR("Failed to allocate memory to convert UTF-16 " - "filename (%hu bytes) to UTF-8", file_name_len); - ret = WIMLIB_ERR_NOMEM; + ret = utf16_to_utf8(file_name, file_name_len, &file_name_utf8, + &file_name_utf8_len); + if (ret != 0) goto out_free_file_name; - } if (*(u16*)p) WARNING("Expected two zero bytes following the file name " "`%s', but found non-zero bytes", file_name_utf8);