X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fntfs-3g_apply.c;h=27b0ab90a260969cd351db0b352f6a7a112ba765;hp=b8b612967ed40e522d12b3cb400bd4b363bce2e0;hb=43f92ce30b2398d1823e34e39ff248de521d015c;hpb=3efc09accb5b4c7f879d3401d0380078d5f4b4fe diff --git a/src/ntfs-3g_apply.c b/src/ntfs-3g_apply.c index b8b61296..27b0ab90 100644 --- a/src/ntfs-3g_apply.c +++ b/src/ntfs-3g_apply.c @@ -87,9 +87,6 @@ struct ntfs_3g_apply_ctx { struct reparse_buffer_disk rpbuf; u8 *reparse_ptr; - /* Offset in the blob currently being read */ - u64 offset; - unsigned num_reparse_inodes; ntfs_inode *ntfs_reparse_inodes[MAX_OPEN_FILES]; struct wim_inode *wim_reparse_inodes[MAX_OPEN_FILES]; @@ -167,7 +164,7 @@ ntfs_3g_restore_dos_name(ntfs_inode *ni, ntfs_inode *dir_ni, ret = -1; } utf16le_put_tstr(dos_name); - if (ret) { + if (unlikely(ret)) { int err = errno; ERROR_WITH_ERRNO("Failed to set DOS name of \"%s\" in NTFS " "volume", dentry_full_path(dentry)); @@ -179,6 +176,19 @@ ntfs_3g_restore_dos_name(ntfs_inode *ni, ntfs_inode *dir_ni, "was fixed in the development version of " "NTFS-3G in June 2016."); } + if (err == EINVAL) { + utf16lechar c = + dentry->d_name[dentry->d_name_nbytes / 2 - 1]; + if (c == cpu_to_le16('.') || c == cpu_to_le16(' ')) { + ERROR("This error was probably caused by a " + "known bug in libntfs-3g where it is " + "unable to set DOS names on files whose " + "long names end with a dot or space " + "character. See " + "https://wimlib.net/forums/viewtopic.php?f=1&t=294 " + "for more information."); + } + } ret = WIMLIB_ERR_SET_SHORT_NAME; goto out_close; } @@ -743,7 +753,6 @@ ntfs_3g_cleanup_blob_extract(struct ntfs_3g_apply_ctx *ctx) } ctx->num_open_inodes = 0; - ctx->offset = 0; ctx->reparse_ptr = NULL; ctx->num_reparse_inodes = 0; return ret; @@ -829,13 +838,14 @@ ntfs_3g_full_pwrite(ntfs_attr *na, u64 offset, size_t size, const u8 *data) } static int -ntfs_3g_extract_chunk(const void *chunk, size_t size, void *_ctx) +ntfs_3g_extract_chunk(const struct blob_descriptor *blob, u64 offset, + const void *chunk, size_t size, void *_ctx) { struct ntfs_3g_apply_ctx *ctx = _ctx; for (unsigned i = 0; i < ctx->num_open_attrs; i++) { - if (!ntfs_3g_full_pwrite(ctx->open_attrs[i], - ctx->offset, size, chunk)) + if (!ntfs_3g_full_pwrite(ctx->open_attrs[i], offset, + size, chunk)) { ERROR_WITH_ERRNO("Error writing data to NTFS volume"); return WIMLIB_ERR_NTFS_3G; @@ -843,7 +853,6 @@ ntfs_3g_extract_chunk(const void *chunk, size_t size, void *_ctx) } if (ctx->reparse_ptr) ctx->reparse_ptr = mempcpy(ctx->reparse_ptr, chunk, size); - ctx->offset += size; return 0; } @@ -947,7 +956,7 @@ ntfs_3g_extract(struct list_head *dentry_list, struct apply_ctx *_ctx) /* Extract blobs. */ struct read_blob_callbacks cbs = { .begin_blob = ntfs_3g_begin_extract_blob, - .consume_chunk = ntfs_3g_extract_chunk, + .continue_blob = ntfs_3g_extract_chunk, .end_blob = ntfs_3g_end_extract_blob, .ctx = ctx, };