unsigned sym = sorted_syms[i];
unsigned codeword_len = lens[sym];
unsigned extra_bits = codeword_len - table_bits;
- unsigned extra_mask;
cur_codeword <<= (codeword_len - prev_codeword_len);
prev_codeword_len = codeword_len;
unsigned s;
unsigned i;
unsigned len;
- u32 R[3];
ret = bitstream_ensure_bits(istream, 4);
if (ret != 0) {
* existing NTFS inode which already has a name @inode->i_extracted_file.
*
* The new name is made in the POSIX namespace (this is the behavior of
- * ntfs_link()). I am assuming this is an acceptable behavior; however, it's
- * possible that the original name was actually in the Win32 namespace. Note
- * that the WIM format does not provide enough information to distinguish Win32
- * names from POSIX names in all cases.
+ * ntfs_link()).
*
- * Return 0 on success, nonzero on failure.
+ * Return 0 on success, nonzero on failure. dir_ni is closed either way.
*/
static int apply_ntfs_hardlink(const struct wim_dentry *from_dentry,
const struct wim_inode *inode,
- ntfs_inode **dir_ni_p)
+ ntfs_inode *dir_ni)
{
int ret;
ntfs_inode *to_ni;
- ntfs_inode *dir_ni;
ntfs_volume *vol;
- dir_ni = *dir_ni_p;
vol = dir_ni->vol;
ret = ntfs_inode_close(dir_ni);
- *dir_ni_p = NULL;
if (ret != 0) {
ERROR_WITH_ERRNO("Error closing directory");
return WIMLIB_ERR_NTFS_3G;
ret |= ntfs_inode_close(dir_ni);
ret |= ntfs_inode_close(to_ni);
if (ret) {
- ERROR_WITH_ERRNO("Could not create hard link `%s' => `%s' (ret=%d)",
+ ERROR_WITH_ERRNO("Could not create hard link `%s' => `%s'",
from_dentry->full_path_utf8,
- inode->i_extracted_file,
- ret);
+ inode->i_extracted_file);
ret = WIMLIB_ERR_NTFS_3G;
}
return ret;
/* Already extracted another dentry in the hard
* link group. Make a hard link instead of
* extracting the file data. */
- ret = apply_ntfs_hardlink(dentry, inode,
- &dir_ni);
- goto out_close_dir_ni;
+ ret = apply_ntfs_hardlink(dentry, inode, dir_ni);
+ /* dir_ni was closed */
+ goto out;
} else {
/* None of the dentries of this inode have been
* extracted yet, so go ahead and extract the
#include <errno.h>
#include "rbtree.h"
-/* Structure that allows searching the security descriptors by SHA1 message
- * digest. */
+/* Red-black tree that maps SHA1 message digests of security descriptors to
+ * security IDs, which are themselves indices into the table of security
+ * descriptors in the 'struct wim_security_data'. */
struct sd_set {
struct wim_security_data *sd;
struct rb_root rb_root;
};
-/* Binary tree node of security descriptors, indexed by the @hash field. */
struct sd_node {
int security_id;
u8 hash[SHA1_HASH_SIZE];
if (dentry->is_win32_name) {
node = lookup_dos_name(map, dentry->d_inode->i_ino);
if (node) {
- dentry->short_name = MALLOC(node->name_len_bytes + 2);
+ dentry->short_name = MALLOC(node->name_len_bytes);
if (!dentry->short_name)
return WIMLIB_ERR_NOMEM;
memcpy(dentry->short_name, node->dos_name,
node->name_len_bytes);
- *(u16*)&dentry->short_name[node->name_len_bytes] = 0;
dentry->short_name_len = node->name_len_bytes;
DEBUG("Assigned DOS name to ino %"PRIu64,
dentry->d_inode->i_ino);
} else {
- DEBUG("ino %"PRIu64" has Win32 name with no "
- "corresponding DOS name",
- dentry->d_inode->i_ino);
+ WARNING("NTFS inode %"PRIu64" has Win32 name with no "
+ "corresponding DOS name",
+ dentry->d_inode->i_ino);
}
}
return 0;
ctx = dirent;
if (name_type & FILE_NAME_DOS) {
- /* Special case: If this is the entry for a DOS name, store it
- * for later. */
+ /* If this is the entry for a DOS name, store it for later. */
ret = insert_dos_name(ctx->dos_name_map, name,
name_len, mref & MFT_REF_MASK_CPU);
- if (ret != 0)
+
+ /* Return now if an error occurred or if this is just a DOS name
+ * and not a Win32+DOS name. */
+ if (ret != 0 || name_type == FILE_NAME_DOS)
return ret;
- if (name_type == FILE_NAME_DOS) /* DOS only, not Win32 + DOS */
- return 0;
}
ret = utf16_to_utf8((const char*)name, name_len * 2,
&utf8_name, &utf8_name_len);