X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fntfs-3g_apply.c;h=9de5774bd256661278f28b270cb2ae4d5cfbf48c;hb=846d3ae386f6c12953816108c04de244533e3a4a;hp=5833d0419616e1bf53920d9ebb11c4bd2d14d3c9;hpb=3de1ec66f778edda19865482d685bc6f4e17faf7;p=wimlib diff --git a/src/ntfs-3g_apply.c b/src/ntfs-3g_apply.c index 5833d041..9de5774b 100644 --- a/src/ntfs-3g_apply.c +++ b/src/ntfs-3g_apply.c @@ -124,7 +124,10 @@ sid_size(const wimlib_SID *sid) static u8 * sd_fixup(const u8 *_desc, size_t *size_p) { - u32 owner_offset, group_offset, dacl_offset, sacl_offset; + u32 owner_offset, group_offset, dacl_offset; +#if !defined(HAVE_NTFS_MNT_RDONLY) + u32 sacl_offset; +#endif bool owner_valid, group_valid; size_t size = *size_p; const wimlib_SECURITY_DESCRIPTOR_RELATIVE *desc = @@ -141,10 +144,12 @@ sd_fixup(const u8 *_desc, size_t *size_p) else dacl_offset = 0; +#if !defined(HAVE_NTFS_MNT_RDONLY) if (le16_to_cpu(desc->control) & wimlib_SE_SACL_PRESENT) sacl_offset = le32_to_cpu(desc->sacl_offset); else sacl_offset = 0; +#endif /* Check if the security descriptor will be affected by one of the bugs. * If not, do nothing and return. @@ -380,7 +385,7 @@ ntfs_3g_set_metadata(ntfs_inode *ni, const struct wim_inode *inode, } /* Security descriptor */ - if ((inode->i_security_id >= 0) + if (inode_has_security_descriptor(inode) && !(extract_flags & WIMLIB_EXTRACT_FLAG_NO_ACLS)) { const void *desc; @@ -513,17 +518,12 @@ ntfs_3g_create_directories(struct wim_dentry *root, static struct wim_dentry * ntfs_3g_first_extraction_alias(struct wim_inode *inode) { - struct list_head *next = inode->i_extraction_aliases.next; struct wim_dentry *dentry; - do { - dentry = list_entry(next, struct wim_dentry, - d_extraction_alias_node); + inode_for_each_extraction_alias(dentry, inode) if (dentry_has_short_name(dentry)) - break; - next = next->next; - } while (next != &inode->i_extraction_aliases); - return dentry; + return dentry; + return inode_first_extraction_dentry(inode); } /* @@ -568,7 +568,6 @@ ntfs_3g_create_nondirectory(struct wim_inode *inode, struct wim_dentry *first_dentry; ntfs_inode *dir_ni; ntfs_inode *ni; - struct list_head *next; struct wim_dentry *dentry; int ret; @@ -624,17 +623,13 @@ ntfs_3g_create_nondirectory(struct wim_inode *inode, } /* Create additional links if present. */ - next = inode->i_extraction_aliases.next; - do { - dentry = list_entry(next, struct wim_dentry, - d_extraction_alias_node); + inode_for_each_extraction_alias(dentry, inode) { if (dentry != first_dentry) { ret = ntfs_3g_add_link(ni, dentry); if (ret) goto out_close_ni; } - next = next->next; - } while (next != &inode->i_extraction_aliases); + } /* Set metadata. */ ret = ntfs_3g_set_metadata(ni, inode, ctx); @@ -702,8 +697,6 @@ ntfs_3g_begin_extract_blob_instance(struct blob_descriptor *blob, return WIMLIB_ERR_INVALID_REPARSE_DATA; } ctx->reparse_ptr = ctx->rpbuf.rpdata; - ctx->rpbuf.rpdatalen = cpu_to_le16(blob->size); - ctx->rpbuf.rpreserved = cpu_to_le16(0); ctx->ntfs_reparse_inodes[ctx->num_reparse_inodes] = ni; ctx->wim_reparse_inodes[ctx->num_reparse_inodes] = inode; ctx->num_reparse_inodes++; @@ -857,18 +850,18 @@ ntfs_3g_end_extract_blob(struct blob_descriptor *blob, int status, void *_ctx) for (u32 i = 0; i < ctx->num_reparse_inodes; i++) { struct wim_inode *inode = ctx->wim_reparse_inodes[i]; - ctx->rpbuf.rptag = cpu_to_le32(inode->i_reparse_tag); + complete_reparse_point(&ctx->rpbuf, inode, blob->size); if (ntfs_set_ntfs_reparse_data(ctx->ntfs_reparse_inodes[i], (const char *)&ctx->rpbuf, - blob->size + REPARSE_DATA_OFFSET, + REPARSE_DATA_OFFSET + blob->size, 0)) { ERROR_WITH_ERRNO("Failed to set reparse " "data on \"%s\"", dentry_full_path( inode_first_extraction_dentry(inode))); - ret = WIMLIB_ERR_NTFS_3G; + ret = WIMLIB_ERR_SET_REPARSE_DATA; goto out; } } @@ -881,11 +874,11 @@ out: return ret; } -static uint64_t +static u64 ntfs_3g_count_dentries(const struct list_head *dentry_list) { const struct wim_dentry *dentry; - uint64_t count = 0; + u64 count = 0; list_for_each_entry(dentry, dentry_list, d_extraction_list_node) { count++; @@ -942,13 +935,11 @@ ntfs_3g_extract(struct list_head *dentry_list, struct apply_ctx *_ctx) goto out_unmount; /* Extract blobs. */ - struct read_blob_list_callbacks cbs = { - .begin_blob = ntfs_3g_begin_extract_blob, - .begin_blob_ctx = ctx, - .consume_chunk = ntfs_3g_extract_chunk, - .consume_chunk_ctx = ctx, - .end_blob = ntfs_3g_end_extract_blob, - .end_blob_ctx = ctx, + struct read_blob_callbacks cbs = { + .begin_blob = ntfs_3g_begin_extract_blob, + .consume_chunk = ntfs_3g_extract_chunk, + .end_blob = ntfs_3g_end_extract_blob, + .ctx = ctx, }; ret = extract_blob_list(&ctx->common, &cbs);