X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fntfs-3g_capture.c;h=bbf6749f16a4284b3e4fd9850ce9ecd4f5385017;hp=9f03b6383b0aa057ec9dac664b3eed2fe960a10a;hb=ebe0206c700963ee0ace86cc55fca6570b03cac3;hpb=6db2e4847a0a509e26ae41b497c7b367ecc20a2e diff --git a/src/ntfs-3g_capture.c b/src/ntfs-3g_capture.c index 9f03b638..bbf6749f 100644 --- a/src/ntfs-3g_capture.c +++ b/src/ntfs-3g_capture.c @@ -53,10 +53,10 @@ #include /* This should be included last as it requires definitions from above not included by itself */ -#include "wimlib/buffer_io.h" #include "wimlib/capture.h" #include "wimlib/dentry.h" #include "wimlib/encoding.h" +#include "wimlib/endianness.h" #include "wimlib/error.h" #include "wimlib/lookup_table.h" #include "wimlib/ntfs_3g.h" @@ -151,7 +151,7 @@ read_reparse_tag(ntfs_inode *ni, struct ntfs_location *loc, u32 *reparse_tag_ret) { int ret; - u8 buf[8]; + le32 reparse_tag; ntfs_attr *na; na = open_ntfs_attr(ni, loc); @@ -160,12 +160,14 @@ read_reparse_tag(ntfs_inode *ni, struct ntfs_location *loc, goto out; } - if (ntfs_attr_pread(na, 0, 8, buf) != 8) { + if (ntfs_attr_pread(na, 0, sizeof(reparse_tag), + &reparse_tag) != sizeof(reparse_tag)) + { ERROR_WITH_ERRNO("Error reading reparse data"); ret = WIMLIB_ERR_NTFS_3G; goto out_close_ntfs_attr; } - *reparse_tag_ret = le32_to_cpu(*(u32*)buf); + *reparse_tag_ret = le32_to_cpu(reparse_tag); DEBUG("ReparseTag = %#x", *reparse_tag_ret); ret = 0; out_close_ntfs_attr: @@ -220,21 +222,18 @@ capture_ntfs_streams(struct wim_inode *inode, goto out_put_actx; } ntfs_loc->ntfs_vol = vol; - ntfs_loc->path = MALLOC(path_len + 1); + ntfs_loc->path = memdup(path, path_len + 1); if (!ntfs_loc->path) { ret = WIMLIB_ERR_NOMEM; goto out_free_ntfs_loc; } - memcpy(ntfs_loc->path, path, path_len + 1); if (name_length) { - ntfs_loc->stream_name = MALLOC(name_length * 2); + ntfs_loc->stream_name = memdup(attr_record_name(actx->attr), + name_length * 2); if (!ntfs_loc->stream_name) { ret = WIMLIB_ERR_NOMEM; goto out_free_ntfs_loc; } - memcpy(ntfs_loc->stream_name, - attr_record_name(actx->attr), - actx->attr->name_length * 2); ntfs_loc->stream_name_nchars = name_length; } @@ -548,7 +547,7 @@ build_dentry_tree_ntfs_recursive(struct wim_dentry **root_ret, ntfs_volume *vol, struct add_image_params *params) { - u32 attributes; + le32 attributes; int ret; struct wim_dentry *root; struct wim_inode *inode; @@ -576,8 +575,8 @@ build_dentry_tree_ntfs_recursive(struct wim_dentry **root_ret, ctx.vol = vol; ret = ntfs_xattr_system_getxattr(&ctx, XATTR_NTFS_ATTRIB, ni, dir_ni, (char *)&attributes, - sizeof(u32)); - if (ret != 4) { + sizeof(attributes)); + if (ret != sizeof(attributes)) { ERROR_WITH_ERRNO("Failed to get NTFS attributes from `%s'", path); return WIMLIB_ERR_NTFS_3G; @@ -725,12 +724,22 @@ build_dentry_tree_ntfs(struct wim_dentry **root_p, DEBUG("Mounting NTFS volume `%s' read-only", device); -#if defined(NTFS_MNT_RDONLY) +/* NTFS-3g 2013 renamed the "read-only" mount flag from MS_RDONLY to + * NTFS_MNT_RDONLY. + * + * Unfortunately we can't check for defined(NTFS_MNT_RDONLY) because + * NTFS_MNT_RDONLY is an enumerated constant. Also, the NTFS-3g headers don't + * seem to contain any explicit version information. So we have to rely on a + * test done at configure time to detect whether NTFS_MNT_RDONLY should be used. + * */ +#ifdef HAVE_NTFS_MNT_RDONLY /* NTFS-3g 2013 */ vol = ntfs_mount(device, NTFS_MNT_RDONLY); #elif defined(MS_RDONLY) /* NTFS-3g 2011, 2012 */ vol = ntfs_mount(device, MS_RDONLY); +#else + #error "Can't find NTFS_MNT_RDONLY or MS_RDONLY flags" #endif if (!vol) { ERROR_WITH_ERRNO("Failed to mount NTFS volume `%s' read-only",