X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fntfs-capture.c;h=eadedac725a5efc33872a76855ddb5904852b4b0;hp=9dc0b9d49c683f6bf238c4d69dffa02a5ad92ca5;hb=8396da8b23c2c66cf7f8752f2c487cdc6c40516e;hpb=313c155f5e11169b9d2d7d10945fe47c41374cb7 diff --git a/src/ntfs-capture.c b/src/ntfs-capture.c index 9dc0b9d4..eadedac7 100644 --- a/src/ntfs-capture.c +++ b/src/ntfs-capture.c @@ -121,7 +121,7 @@ static int lookup_sd(const u8 hash[SHA1_HASH_SIZE], struct sd_node *root) * the security ID for it. If a new security descriptor cannot be allocated, * return -1. */ -static int sd_set_add_sd(struct sd_set *sd_set, const u8 *descriptor, +static int sd_set_add_sd(struct sd_set *sd_set, const char descriptor[], size_t size) { u8 hash[SHA1_HASH_SIZE]; @@ -132,7 +132,7 @@ static int sd_set_add_sd(struct sd_set *sd_set, const u8 *descriptor, u8 *descr_copy; struct wim_security_data *sd; - sha1_buffer(descriptor, size, hash); + sha1_buffer((const u8*)descriptor, size, hash); security_id = lookup_sd(hash, sd_set->root); if (security_id >= 0) return security_id; @@ -166,6 +166,7 @@ static int sd_set_add_sd(struct sd_set *sd_set, const u8 *descriptor, sd->descriptors[sd->num_entries] = descr_copy; sd->sizes[sd->num_entries] = size; sd->num_entries++; + DEBUG("There are now %d security descriptors", sd->num_entries); sd->total_length += size + sizeof(sd->sizes[0]); if (sd_set->root) @@ -242,7 +243,7 @@ static int capture_ntfs_streams(struct dentry *dentry, ntfs_inode *ni, ntfs_attr_search_ctx *actx; u8 attr_hash[SHA1_HASH_SIZE]; - struct ntfs_location *ntfs_loc; + struct ntfs_location *ntfs_loc = NULL; struct lookup_table_entry *lte; int ret = 0; @@ -251,7 +252,7 @@ static int capture_ntfs_streams(struct dentry *dentry, ntfs_inode *ni, /* Get context to search the streams of the NTFS file. */ actx = ntfs_attr_get_search_ctx(ni, NULL); if (!actx) { - ERROR_WITH_ERRNO("Cannot get attribute search " + ERROR_WITH_ERRNO("Cannot get NTFS attribute search " "context"); return WIMLIB_ERR_NTFS_3G; } @@ -275,8 +276,6 @@ static int capture_ntfs_streams(struct dentry *dentry, ntfs_inode *ni, if (lte) { lte->refcnt++; } else { - struct ntfs_location *ntfs_loc; - ntfs_loc = CALLOC(1, sizeof(*ntfs_loc)); if (!ntfs_loc) goto out_put_actx; @@ -317,9 +316,10 @@ static int capture_ntfs_streams(struct dentry *dentry, ntfs_inode *ni, dentry->lte = lte; } else { struct ads_entry *new_ads_entry; - stream_name_utf8 = utf16_to_utf8((const u8*)attr_record_name(actx->attr), + size_t stream_name_utf8_len; + stream_name_utf8 = utf16_to_utf8((const char*)attr_record_name(actx->attr), actx->attr->name_length, - &stream_name_utf16_len); + &stream_name_utf8_len); if (!stream_name_utf8) goto out_free_lte; new_ads_entry = dentry_add_ads(dentry, stream_name_utf8); @@ -385,7 +385,7 @@ static int wim_ntfs_capture_filldir(void *dirent, const ntfschar *name, ret = -1; - utf8_name = utf16_to_utf8((const u8*)name, name_len * 2, + utf8_name = utf16_to_utf8((const char*)name, name_len * 2, &utf8_name_len); if (!utf8_name) goto out; @@ -421,7 +421,6 @@ static int wim_ntfs_capture_filldir(void *dirent, const ntfschar *name, child->file_name_utf8, ctx->parent->file_name_utf8); link_dentry(child, ctx->parent); } -out_close_ni: ntfs_inode_close(ni); out_free_utf8_name: FREE(utf8_name); @@ -435,7 +434,8 @@ out: */ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p, ntfs_inode *ni, - char path[], size_t path_len, + char path[], + size_t path_len, struct lookup_table *lookup_table, struct sd_set *sd_set, const struct capture_config *config, @@ -443,7 +443,7 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p, { u32 attributes; int mrec_flags; - u32 sd_size; + u32 sd_size = 0; int ret = 0; struct dentry *root; @@ -464,7 +464,6 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p, root->creation_time = le64_to_cpu(ni->creation_time); root->last_write_time = le64_to_cpu(ni->last_data_change_time); root->last_access_time = le64_to_cpu(ni->last_access_time); - root->security_id = le32_to_cpu(ni->security_id); root->attributes = le32_to_cpu(attributes); root->link_group_id = ni->mft_no; root->resolved = true; @@ -511,7 +510,7 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p, DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, NULL, 0, &sd_size); - u8 sd[sd_size]; + char sd[sd_size]; ret = ntfs_inode_get_security(ni, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | @@ -526,6 +525,10 @@ static int build_dentry_tree_ntfs_recursive(struct dentry **root_p, if (ret > 0) { /*print_security_descriptor(sd, sd_size);*/ root->security_id = sd_set_add_sd(sd_set, sd, sd_size); + if (root->security_id == -1) { + ERROR("Out of memory"); + return WIMLIB_ERR_NOMEM; + } DEBUG("Added security ID = %u for `%s'", root->security_id, path); } else { @@ -548,9 +551,10 @@ static int build_dentry_tree_ntfs(struct dentry **root_p, ntfs_volume *vol; ntfs_inode *root_ni; int ret = 0; - struct sd_set sd_set; - sd_set.sd = sd; - sd_set.root = NULL; + struct sd_set sd_set = { + .sd = sd, + .root = NULL, + }; ntfs_volume **ntfs_vol_p = extra_arg; DEBUG("Mounting NTFS volume `%s' read-only", device); @@ -562,6 +566,9 @@ static int build_dentry_tree_ntfs(struct dentry **root_p, return WIMLIB_ERR_NTFS_3G; } + /* We don't want to capture the special NTFS files such as $Bitmap. Not + * to be confused with "hidden" or "system" files which are real files + * that we do need to capture. */ NVolClearShowSysFiles(vol); DEBUG("Opening root NTFS dentry"); @@ -572,11 +579,15 @@ static int build_dentry_tree_ntfs(struct dentry **root_p, ret = WIMLIB_ERR_NTFS_3G; goto out; } - char *path = MALLOC(32769); + + /* Currently we assume that all the UTF-8 paths fit into this length and + * there is no check for overflow. */ + char *path = MALLOC(32768); if (!path) { ERROR("Could not allocate memory for NTFS pathname"); goto out_cleanup; } + path[0] = '/'; path[1] = '\0'; ret = build_dentry_tree_ntfs_recursive(root_p, root_ni, path, 1, @@ -596,6 +607,8 @@ out: ret = WIMLIB_ERR_NTFS_3G; } } else { + /* We need to leave the NTFS volume mounted so that we can read + * the NTFS files again when we are actually writing the WIM */ *ntfs_vol_p = vol; } return ret; @@ -622,11 +635,9 @@ WIMLIBAPI int wimlib_add_image_from_ntfs_volume(WIMStruct *w, WIMLIBAPI int wimlib_add_image_from_ntfs_volume(WIMStruct *w, const char *device, const char *name, - const char *description, - const char *flags_element, - int flags, const char *config_str, - size_t config_len) + size_t config_len, + int flags) { ERROR("wimlib was compiled without support for NTFS-3g, so"); ERROR("we cannot capture a WIM image directly from a NTFS volume");