Don't use entire word for d_extraction_name_nchars
authorEric Biggers <ebiggers3@gmail.com>
Sun, 31 May 2015 15:08:51 +0000 (10:08 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Fri, 5 Jun 2015 03:45:35 +0000 (22:45 -0500)
include/wimlib/dentry.h
src/extract.c

index cbc0b7c..ad4e73e 100644 (file)
@@ -73,17 +73,21 @@ struct wim_dentry {
        /* Length of 'd_short_name' in bytes, excluding the terminating null  */
        u16 d_short_name_nbytes;
 
+       /* (Extraction only) Length of 'd_extraction_name' in _characters_,
+        * excluding the terminating null  */
+       u16 d_extraction_name_nchars;
+
        /* When capturing from an NTFS volume using NTFS-3g, this flag is set on
         * dentries that were created from a filename in the WIN32 or WIN32+DOS
         * namespaces rather than the POSIX namespace.  Otherwise this will
         * always be 0.  */
-       u8 d_is_win32_name : 1;
+       u16 d_is_win32_name : 1;
 
        /* Temporary flag; always reset to 0 when done using.  */
-       u8 d_tmp_flag : 1;
+       u16 d_tmp_flag : 1;
 
        /* Used by wimlib_update_image()  */
-       u8 d_is_orphan : 1;
+       u16 d_is_orphan : 1;
 
        union {
                /* The subdir offset is only used while reading and writing this
@@ -107,14 +111,11 @@ struct wim_dentry {
         * doesn't, it is an allocated buffer which must be freed.  */
        void *d_extraction_name;
 
-       /* (Extraction only) Number of characters in d_extraction_name.  */
-       size_t d_extraction_name_nchars;
-
        /* (Extraction only) Linked list node that connects all dentries being
         * extracted as part of the current extraction operation.  */
        struct list_head d_extraction_list_node;
 
-       /* (Extraction only) Pointer to the next alias for this dentry's inode
+       /* (Extraction only) Pointer to the next alias of this dentry's inode
         * that needs to be extracted as part of the current extraction
         * operation, or NULL if this is the last alias.  */
        struct wim_dentry *d_next_extraction_alias;
index b234876..417300b 100644 (file)
@@ -753,11 +753,12 @@ dentry_calculate_extraction_name(struct wim_dentry *dentry,
        }
 
        if (file_name_valid(dentry->d_name, dentry->d_name_nbytes / 2, false)) {
+               size_t nbytes = 0;
                ret = utf16le_get_tstr(dentry->d_name,
                                       dentry->d_name_nbytes,
                                       (const tchar **)&dentry->d_extraction_name,
-                                      &dentry->d_extraction_name_nchars);
-               dentry->d_extraction_name_nchars /= sizeof(tchar);
+                                      &nbytes);
+               dentry->d_extraction_name_nchars = nbytes / sizeof(tchar);
                return ret;
        } else {
                if (ctx->extract_flags & WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES)