]> wimlib.net Git - wimlib/blobdiff - src/resource.c
resource.c: Don't manually align buffer for uncompressed data
[wimlib] / src / resource.c
index 6fb95de9336c0e17680b0b96ea45b6c7b5246d5e..13c1581fc866ff48e51fef709ef75887c0109c3c 100644 (file)
@@ -7,19 +7,18 @@
 /*
  * Copyright (C) 2012, 2013 Eric Biggers
  *
- * This file is part of wimlib, a library for working with WIM files.
+ * 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
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version.
  *
- * wimlib is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3 of the License, or (at your option) any later
- * version.
+ * This file is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
  *
- * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * wimlib; if not, see http://www.gnu.org/licenses/.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this file; if not, see http://www.gnu.org/licenses/.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -27,6 +26,7 @@
 #endif
 
 #include "wimlib/assert.h"
+#include "wimlib/bitops.h"
 #include "wimlib/endianness.h"
 #include "wimlib/error.h"
 #include "wimlib/file_io.h"
@@ -137,7 +137,6 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec,
        int errno_save;
 
        u64 *chunk_offsets = NULL;
-       u8 *_ubuf = NULL;
        u8 *ubuf = NULL;
        void *cbuf = NULL;
        bool chunk_offsets_malloced = false;
@@ -215,7 +214,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec,
                }
        }
 
-       const u32 chunk_order = bsr32(chunk_size);
+       const u32 chunk_order = fls32(chunk_size);
 
        /* Calculate the total number of chunks the resource is divided into.  */
        const u64 num_chunks = (rspec->uncompressed_size + chunk_size - 1) >> chunk_order;
@@ -327,8 +326,8 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec,
                /* Now fill in chunk_offsets from the entries we have read in
                 * chunk_tab_data.  We break aliasing rules here to avoid having
                 * to allocate yet another array.  */
-               typedef le64 __attribute__((may_alias)) aliased_le64_t;
-               typedef le32 __attribute__((may_alias)) aliased_le32_t;
+               typedef le64 _may_alias_attribute aliased_le64_t;
+               typedef le32 _may_alias_attribute aliased_le32_t;
                u64 * chunk_offsets_p = chunk_offsets;
 
                if (alt_chunk_table) {
@@ -368,14 +367,13 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec,
 
        /* Allocate buffer for holding the uncompressed data of each chunk.  */
        if (chunk_size <= STACK_MAX) {
-               _ubuf = alloca(chunk_size + 15);
+               ubuf = alloca(chunk_size);
        } else {
-               _ubuf = MALLOC(chunk_size + 15);
-               if (_ubuf == NULL)
+               ubuf = MALLOC(chunk_size);
+               if (ubuf == NULL)
                        goto oom;
                ubuf_malloced = true;
        }
-       ubuf = (u8 *)(((uintptr_t)_ubuf + 15) & ~15);
 
        /* Allocate a temporary buffer for reading compressed chunks, each of
         * which can be at most @chunk_size - 1 bytes.  This excludes compressed
@@ -549,7 +547,7 @@ out_free_memory:
        if (chunk_offsets_malloced)
                FREE(chunk_offsets);
        if (ubuf_malloced)
-               FREE(_ubuf);
+               FREE(ubuf);
        if (cbuf_malloced)
                FREE(cbuf);
        errno = errno_save;
@@ -1095,13 +1093,6 @@ hasher_consume_chunk(const void *chunk, size_t size, void *_ctx)
                return (*ctx->cbs.consume_chunk)(chunk, size, ctx->cbs.consume_chunk_ctx);
 }
 
-static void
-get_sha1_string(const u8 md[SHA1_HASH_SIZE], tchar *str)
-{
-       for (size_t i = 0; i < SHA1_HASH_SIZE; i++)
-               str += tsprintf(str, T("%02x"), md[i]);
-}
-
 /* Callback for finishing reading a stream while calculating its SHA1 message
  * digest.  */
 static int
@@ -1136,8 +1127,8 @@ hasher_end_stream(struct wim_lookup_table_entry *lte, int status, void *_ctx)
                                if (wimlib_print_errors) {
                                        tchar expected_hashstr[SHA1_HASH_SIZE * 2 + 1];
                                        tchar actual_hashstr[SHA1_HASH_SIZE * 2 + 1];
-                                       get_sha1_string(lte->hash, expected_hashstr);
-                                       get_sha1_string(hash, actual_hashstr);
+                                       sprint_hash(lte->hash, expected_hashstr);
+                                       sprint_hash(hash, actual_hashstr);
                                        ERROR("The stream is corrupted!\n"
                                              "        (Expected SHA1=%"TS",\n"
                                              "              got SHA1=%"TS")",