X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fntfs-3g_capture.c;h=b6d9226276e7afe44f4d1ce3ad50a93933ad7c9a;hb=9899681e667c07db9a286c38fa76f53cfa726b73;hp=6daf0a54720afaa2a31bb1a75bfbc4546c213d1f;hpb=431652ab74b5aba3fd8ec746d464b0c75eb4e517;p=wimlib diff --git a/src/ntfs-3g_capture.c b/src/ntfs-3g_capture.c index 6daf0a54..b6d92262 100644 --- a/src/ntfs-3g_capture.c +++ b/src/ntfs-3g_capture.c @@ -75,12 +75,8 @@ open_ntfs_attr(ntfs_inode *ni, struct ntfs_location *loc) } int -read_ntfs_file_prefix(const struct wim_lookup_table_entry *lte, - u64 size, - consume_data_callback_t cb, - u32 in_chunk_size, - void *ctx_or_buf, - int _ignored_flags) +read_ntfs_file_prefix(const struct wim_lookup_table_entry *lte, u64 size, + consume_data_callback_t cb, void *cb_ctx) { struct ntfs_location *loc = lte->ntfs_loc; ntfs_volume *vol = loc->ntfs_vol; @@ -88,11 +84,10 @@ read_ntfs_file_prefix(const struct wim_lookup_table_entry *lte, ntfs_attr *na; s64 pos; s64 bytes_remaining; - void *out_buf; - bool out_buf_malloced; int ret; + u8 buf[BUFFER_SIZE]; - ni = ntfs_pathname_to_inode(vol, NULL, loc->path); + ni = ntfs_pathname_to_inode(vol, NULL, loc->path); if (!ni) { ERROR_WITH_ERRNO("Can't find NTFS inode for \"%"TS"\"", loc->path); ret = WIMLIB_ERR_NTFS_3G; @@ -105,44 +100,22 @@ read_ntfs_file_prefix(const struct wim_lookup_table_entry *lte, goto out_close_ntfs_inode; } - out_buf_malloced = false; - if (cb) { - if (in_chunk_size <= STACK_MAX) { - out_buf = alloca(in_chunk_size); - } else { - out_buf = MALLOC(in_chunk_size); - if (out_buf == NULL) { - ret = WIMLIB_ERR_NOMEM; - goto out_close_ntfs_attr; - } - out_buf_malloced = true; - } - } else { - out_buf = ctx_or_buf; - } pos = (loc->is_reparse_point) ? 8 : 0; bytes_remaining = size; while (bytes_remaining) { - s64 to_read = min(bytes_remaining, in_chunk_size); - if (ntfs_attr_pread(na, pos, to_read, out_buf) != to_read) { + s64 to_read = min(bytes_remaining, sizeof(buf)); + if (ntfs_attr_pread(na, pos, to_read, buf) != to_read) { ERROR_WITH_ERRNO("Error reading \"%"TS"\"", loc->path); ret = WIMLIB_ERR_NTFS_3G; - goto out_free_memory; + goto out_close_ntfs_attr; } pos += to_read; bytes_remaining -= to_read; - if (cb) { - ret = cb(out_buf, to_read, ctx_or_buf); - if (ret) - goto out_free_memory; - } else { - out_buf += to_read; - } + ret = cb(buf, to_read, cb_ctx); + if (ret) + goto out_close_ntfs_attr; } ret = 0; -out_free_memory: - if (out_buf_malloced) - FREE(out_buf); out_close_ntfs_attr: ntfs_attr_close(na); out_close_ntfs_inode: @@ -258,14 +231,14 @@ capture_ntfs_streams(struct wim_inode *inode, goto out_free_lte; } lte->ntfs_loc->is_reparse_point = true; - lte->resource_entry.original_size = data_size - 8; + lte->size = data_size - 8; ret = read_reparse_tag(ni, lte->ntfs_loc, &inode->i_reparse_tag); if (ret) goto out_free_lte; } else { lte->ntfs_loc->is_reparse_point = false; - lte->resource_entry.original_size = data_size; + lte->size = data_size; } } if (name_length == 0) { @@ -275,8 +248,8 @@ capture_ntfs_streams(struct wim_inode *inode, if (lte) { ERROR("Found two un-named data streams for \"%s\" " "(sizes = %"PRIu64", %"PRIu64")", - path, wim_resource_size(inode->i_lte), - wim_resource_size(lte)); + path, inode->i_lte->size, + lte->size); ret = WIMLIB_ERR_NTFS_3G; goto out_free_lte; }