*/
/*
- * Copyright (C) 2010 Carl Thijssen
* Copyright (C) 2012 Eric Biggers
*
* This file is part of wimlib, a library for working with WIM files.
*
* wimlib is free software; you can redistribute it and/or modify it under the
- * terms of the GNU Lesser General Public License as published by the Free
- * Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3 of the License, or (at your option) any later
+ * version.
*
* wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public License
- * along with wimlib; if not, see http://www.gnu.org/licenses/.
+ * You should have received a copy of the GNU General Public License along with
+ * wimlib; if not, see http://www.gnu.org/licenses/.
*/
#include "wimlib_internal.h"
break;
#ifdef WITH_NTFS_3G
case RESOURCE_IN_NTFS_VOLUME:
+ wimlib_assert(lte->ntfs_loc);
if (lte->attr) {
+ u64 adjusted_offset;
+ if (lte->ntfs_loc->is_reparse_point)
+ adjusted_offset = offset + 8;
+ else
+ adjusted_offset = offset;
if (ntfs_attr_pread(lte->attr, offset, size, buf) == size) {
return 0;
} else {
bool raw;
off_t file_offset;
#ifdef WITH_NTFS_3G
- ntfs_inode *ni;
+ ntfs_inode *ni = NULL;
#endif
+ wimlib_assert(lte);
+
/* Original size of the resource */
original_size = wim_resource_size(lte);
}
#ifdef WITH_NTFS_3G
else if (lte->resource_location == RESOURCE_IN_NTFS_VOLUME
- && !lte->attr)
+ && !lte->attr)
{
struct ntfs_location *loc = lte->ntfs_loc;
wimlib_assert(loc);
if (!ni) {
ERROR_WITH_ERRNO("Failed to open inode `%s' in NTFS "
"volume", loc->path_utf8);
+ ret = WIMLIB_ERR_NTFS_3G;
+ goto out;
}
lte->attr = ntfs_attr_open(ni,
loc->is_reparse_point ? AT_REPARSE_POINT : AT_DATA,
(ntfschar*)loc->stream_name_utf16,
loc->stream_name_utf16_num_chars);
if (!lte->attr) {
- ntfs_inode_close(ni);
ERROR_WITH_ERRNO("Failed to open attribute of `%s' in "
"NTFS volume", loc->path_utf8);
+ ret = WIMLIB_ERR_NTFS_3G;
+ goto out_fclose;
}
}
#endif
lte->file_on_disk_fp = NULL;
}
#ifdef WITH_NTFS_3G
- else if (lte->resource_location == RESOURCE_IN_NTFS_VOLUME
- && lte->attr) {
- ntfs_attr_close(lte->attr);
- ntfs_inode_close(ni);
+ else if (lte->resource_location == RESOURCE_IN_NTFS_VOLUME) {
+ if (lte->attr) {
+ ntfs_attr_close(lte->attr);
+ lte->attr = NULL;
+ } if (ni) {
+ ntfs_inode_close(ni);
+ }
}
#endif
out:
lte.resource_location = RESOURCE_IN_ATTACHED_BUFFER;
lte.attached_buffer = (u8*)buf;
- zero_hash(lte.hash);
+ zero_out_hash(lte.hash);
ret = write_wim_resource(<e, out_fp, out_ctype, out_res_entry);
if (ret != 0)
return ret;