]> wimlib.net Git - wimlib/blobdiff - src/dentry.c
Remove sle{16,32,64} types
[wimlib] / src / dentry.c
index 13940a32d3b96c2a4c7d6f9a60babea8e3931ceb..4501525dcd0d70a2b121d00a6e64d60ba31fdd99 100644 (file)
@@ -3,7 +3,7 @@
  */
 
 /*
- * Copyright (C) 2012, 2013, 2014, 2015 Eric Biggers
+ * Copyright (C) 2012-2016 Eric Biggers
  *
  * This file is free software; you can redistribute it and/or modify it under
  * the terms of the GNU Lesser General Public License as published by the Free
@@ -92,10 +92,10 @@ struct wim_dentry_on_disk {
        le32 attributes;
 
        /* A value that specifies the security descriptor for this file or
-        * directory.  If -1, the file or directory has no security descriptor.
-        * Otherwise, it is a 0-based index into the WIM image's table of
-        * security descriptors (see: `struct wim_security_data') */
-       sle32 security_id;
+        * directory.  If 0xFFFFFFFF, the file or directory has no security
+        * descriptor.  Otherwise, it is a 0-based index into the WIM image's
+        * table of security descriptors (see: `struct wim_security_data') */
+       le32 security_id;
 
        /* Offset, in bytes, from the start of the uncompressed metadata
         * resource of this directory's child directory entries, or 0 if this
@@ -358,7 +358,8 @@ dentry_out_total_length(const struct wim_dentry *dentry)
                                        dentry->d_short_name_nbytes);
        len = ALIGN(len, 8);
 
-       len += ALIGN(inode->i_extra_size, 8);
+       if (inode->i_extra)
+               len += ALIGN(inode->i_extra->size, 8);
 
        if (!(inode->i_attributes & FILE_ATTRIBUTE_ENCRYPTED)) {
                /*
@@ -503,7 +504,8 @@ calculate_dentry_full_path(struct wim_dentry *dentry)
        d = dentry;
        do {
                p -= d->d_name_nbytes / sizeof(utf16lechar);
-               memcpy(p, d->d_name, d->d_name_nbytes);
+               if (d->d_name_nbytes)
+                       memcpy(p, d->d_name, d->d_name_nbytes);
                *--p = cpu_to_le16(WIM_PATH_SEPARATOR);
                d = d->d_parent;  /* assumes d == d->d_parent for root  */
        } while (!dentry_is_root(d));
@@ -1187,10 +1189,12 @@ read_extra_data(const u8 *p, const u8 *end, struct wim_inode *inode)
                p++;
 
        if (unlikely(p < end)) {
-               inode->i_extra = memdup(p, end - p);
+               inode->i_extra = MALLOC(sizeof(struct wim_inode_extra) +
+                                       end - p);
                if (!inode->i_extra)
                        return WIMLIB_ERR_NOMEM;
-               inode->i_extra_size = end - p;
+               inode->i_extra->size = end - p;
+               memcpy(inode->i_extra->data, p, end - p);
        }
        return 0;
 }
@@ -1774,9 +1778,9 @@ write_dentry(const struct wim_dentry * restrict dentry, u8 * restrict p)
        while ((uintptr_t)p & 7)
                *p++ = 0;
 
-       if (inode->i_extra_size) {
+       if (inode->i_extra) {
                /* Extra tagged items --- not usually present.  */
-               p = mempcpy(p, inode->i_extra, inode->i_extra_size);
+               p = mempcpy(p, inode->i_extra->data, inode->i_extra->size);
 
                /* Align to 8-byte boundary */
                while ((uintptr_t)p & 7)