memcpy(new, old, sizeof(*old));
new->extracted_file = NULL;
switch (new->resource_location) {
- case RESOURCE_IN_STAGING_FILE:
- case RESOURCE_IN_FILE_ON_DISK:
#ifdef __WIN32__
case RESOURCE_WIN32:
+ {
+ size_t nbytes = utf16le_strlen(old->win32_file_on_disk);
+ new->win32_file_on_disk = MALLOC(nbytes + 2);
+ if (!new->win32_file_on_disk)
+ goto out_free;
+ memcpy(new->win32_file_on_disk, old->win32_file_on_disk,
+ nbytes + 2);
+ }
+ break;
#endif
+ case RESOURCE_IN_STAGING_FILE:
+ case RESOURCE_IN_FILE_ON_DISK:
BUILD_BUG_ON((void*)&old->file_on_disk !=
(void*)&old->staging_file_name);
new->staging_file_name = STRDUP(old->staging_file_name);
if (!loc)
goto out_free;
memcpy(loc, old->ntfs_loc, sizeof(*loc));
- loc->path_utf8 = NULL;
- loc->stream_name_utf16 = NULL;
+ loc->path = NULL;
+ loc->stream_name = NULL;
new->ntfs_loc = loc;
- loc->path_utf8 = STRDUP(old->ntfs_loc->path_utf8);
- if (!loc->path_utf8)
+ loc->path = STRDUP(old->ntfs_loc->path);
+ if (!loc->path)
goto out_free;
- loc->stream_name_utf16 = MALLOC(loc->stream_name_utf16_num_chars * 2);
- if (!loc->stream_name_utf16)
+ loc->stream_name = MALLOC((loc->stream_name_nchars + 1) * 2);
+ if (!loc->stream_name)
goto out_free;
- memcpy(loc->stream_name_utf16,
- old->ntfs_loc->stream_name_utf16,
- loc->stream_name_utf16_num_chars * 2);
+ memcpy(loc->stream_name,
+ old->ntfs_loc->stream_name,
+ (loc->stream_name_nchars + 1) * 2);
}
break;
#endif
#ifdef WITH_NTFS_3G
case RESOURCE_IN_NTFS_VOLUME:
if (lte->ntfs_loc) {
- FREE(lte->ntfs_loc->path_utf8);
- FREE(lte->ntfs_loc->stream_name_utf16);
+ FREE(lte->ntfs_loc->path);
+ FREE(lte->ntfs_loc->stream_name);
FREE(lte->ntfs_loc);
}
break;
if (lookup_flags & LOOKUP_FLAG_ADS_OK) {
stream_name = path_stream_name(path);
if (stream_name) {
- p = (char*)stream_name - 1;
+ p = (mbchar*)stream_name - 1;
*p = '\0';
}
}
if (p)
*p = ':';
if (!dentry)
- return -ENOENT;
+ return -errno;
inode = dentry->d_inode;