X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fntfs-3g_apply.c;h=148abc769f058373ad5f350cfad773ae0c269bc7;hp=0a3dcaca50f77d5b97b9b1cb743fd70e0cd3c3e6;hb=b982f17d9d036b7a0cac445c62983a30a0d16eb2;hpb=56f6607d5ecb59ab50f97c8b99f7fc92b9c67a39 diff --git a/src/ntfs-3g_apply.c b/src/ntfs-3g_apply.c index 0a3dcaca..148abc76 100644 --- a/src/ntfs-3g_apply.c +++ b/src/ntfs-3g_apply.c @@ -30,6 +30,7 @@ # include "config.h" #endif +#include #include #include @@ -415,15 +416,24 @@ ntfs_3g_set_metadata(ntfs_inode *ni, const struct wim_inode *inode, desc_size = sd->sizes[inode->i_security_id]; ret = ntfs_3g_set_security_descriptor(ni, desc, desc_size); - if (ret) { - if (wimlib_print_errors) { - ERROR_WITH_ERRNO("Failed to set security descriptor " - "on \"%s\" in NTFS volume", - dentry_full_path(one_dentry)); + + if (unlikely(ret)) { + int err = errno; + ERROR_WITH_ERRNO("Failed to set security descriptor on " + "\"%s\" in NTFS volume", + dentry_full_path(one_dentry)); + if (err == EINVAL && wimlib_print_errors) { fprintf(wimlib_error_file, "The security descriptor is: "); print_byte_field(desc, desc_size, wimlib_error_file); fprintf(wimlib_error_file, "\n"); + fprintf(wimlib_error_file, + "\nThis error occurred because libntfs-3g thinks " + "the security descriptor is invalid. If you " + "are extracting a Windows 10 image, this may be " + "caused by a known bug in libntfs-3g. See: " + "http://wimlib.net/forums/viewtopic.php?f=1&t=4 " + "for more information.\n\n"); } return ret; } @@ -704,6 +714,7 @@ ntfs_3g_begin_extract_blob_instance(struct blob_descriptor *blob, struct ntfs_3g_apply_ctx *ctx) { struct wim_dentry *one_dentry = inode_first_extraction_dentry(inode); + ntfschar *stream_name; size_t stream_name_nchars; ntfs_attr *attr; @@ -726,22 +737,29 @@ ntfs_3g_begin_extract_blob_instance(struct blob_descriptor *blob, /* It's a data stream (may be unnamed or named). */ wimlib_assert(strm->stream_type == STREAM_TYPE_DATA); - stream_name_nchars = utf16le_len_chars(strm->stream_name); + if (unlikely(stream_is_named(strm))) { + stream_name = strm->stream_name; + stream_name_nchars = utf16le_len_chars(stream_name); - if (stream_name_nchars && - (ntfs_attr_add(ni, AT_DATA, strm->stream_name, - stream_name_nchars, NULL, 0))) - { - ERROR_WITH_ERRNO("Failed to create named data stream of \"%s\"", - dentry_full_path(one_dentry)); - return WIMLIB_ERR_NTFS_3G; + if (ntfs_attr_add(ni, AT_DATA, stream_name, + stream_name_nchars, NULL, 0)) + { + ERROR_WITH_ERRNO("Failed to create named data stream of \"%s\"", + dentry_full_path(one_dentry)); + return WIMLIB_ERR_NTFS_3G; + } + } else { + /* Don't pass an empty string other than AT_UNNAMED to + * ntfs_attr_open() --- it violates assumptions made by + * libntfs-3g. */ + stream_name = AT_UNNAMED; + stream_name_nchars = 0; } /* This should be ensured by extract_blob_list() */ wimlib_assert(ctx->num_open_attrs < MAX_OPEN_FILES); - attr = ntfs_attr_open(ni, AT_DATA, strm->stream_name, - stream_name_nchars); + attr = ntfs_attr_open(ni, AT_DATA, stream_name, stream_name_nchars); if (!attr) { ERROR_WITH_ERRNO("Failed to open data stream of \"%s\"", dentry_full_path(one_dentry));