utf16le_dupz() input may be misaligned
authorEric Biggers <ebiggers3@gmail.com>
Tue, 16 Dec 2014 02:33:59 +0000 (20:33 -0600)
committerEric Biggers <ebiggers3@gmail.com>
Tue, 16 Dec 2014 02:34:02 +0000 (20:34 -0600)
include/wimlib/encoding.h
src/dentry.c
src/encoding.c
src/ntfs-3g_capture.c

index b48fe9c..3d3c685 100644 (file)
@@ -35,7 +35,7 @@ varname1##_to_##varname2##_buf(const chartype1 *in, size_t in_nbytes, \
                               chartype2 *out);
 
 extern utf16lechar *
-utf16le_dupz(const utf16lechar *ustr, size_t usize);
+utf16le_dupz(const void *ustr, size_t usize);
 
 #if !TCHAR_IS_UTF16LE
 DECLARE_CHAR_CONVERSION_FUNCTIONS(utf16le, tstr, utf16lechar, tchar);
index 669b447..862c664 100644 (file)
@@ -1342,8 +1342,7 @@ read_dentry(const u8 * restrict buf, size_t buf_len,
        /* Read the filename if present.  Note: if the filename is empty, there
         * is no null terminator following it.  */
        if (file_name_nbytes) {
-               dentry->file_name = utf16le_dupz((const utf16lechar *)p,
-                                                file_name_nbytes);
+               dentry->file_name = utf16le_dupz(p, file_name_nbytes);
                if (dentry->file_name == NULL) {
                        ret = WIMLIB_ERR_NOMEM;
                        goto err_free_dentry;
@@ -1355,8 +1354,7 @@ read_dentry(const u8 * restrict buf, size_t buf_len,
        /* Read the short filename if present.  Note: if there is no short
         * filename, there is no null terminator following it. */
        if (short_name_nbytes) {
-               dentry->short_name = utf16le_dupz((const utf16lechar *)p,
-                                                 short_name_nbytes);
+               dentry->short_name = utf16le_dupz(p, short_name_nbytes);
                if (dentry->short_name == NULL) {
                        ret = WIMLIB_ERR_NOMEM;
                        goto err_free_dentry;
index b54e787..6a1148a 100644 (file)
@@ -561,9 +561,11 @@ cmp_utf16le_strings(const utf16lechar *s1, size_t n1,
        return (n1 < n2) ? -1 : 1;
 }
 
-/* Duplicate a UTF16-LE string which may not be null-terminated.  */
+/* Duplicate a UTF16-LE string.  The input string might not be null terminated
+ * and might be misaligned, but the returned string is guaranteed to be null
+ * terminated and properly aligned.  */
 utf16lechar *
-utf16le_dupz(const utf16lechar *ustr, size_t usize)
+utf16le_dupz(const void *ustr, size_t usize)
 {
        utf16lechar *dup = MALLOC(usize + sizeof(utf16lechar));
        if (dup) {
index cd0758a..22b9e55 100644 (file)
@@ -393,7 +393,7 @@ set_dentry_dos_name(struct wim_dentry *dentry, const struct dos_name_map *map)
        if (dentry->is_win32_name) {
                node = lookup_dos_name(map, dentry->d_inode->i_ino);
                if (node) {
-                       dentry->short_name = utf16le_dupz((const utf16lechar *)node->dos_name,
+                       dentry->short_name = utf16le_dupz(node->dos_name,
                                                          node->name_nbytes);
                        if (!dentry->short_name)
                                return WIMLIB_ERR_NOMEM;