blob: cf7ada9ddc126756a12a71797c0d9ac353a81c0b [file] [log] [blame]
From a4c708dd24e5ba8ac381973c14db8d23f4ac97bf Mon Sep 17 00:00:00 2001
From: Lepton Wu <lepton@chromium.org>
Date: Thu, 13 Aug 2020 19:14:13 -0700
Subject: [PATCH] util/ralloc: fix ralloc alignment.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
On some malloc implementation, malloc doesn't always align to 16
bytes even on 64 bits system. To make sure ralloc_header always
starts at the wanted alignment, just force the size to be aligned at
the alignment of ralloc_header. This fixes crashed on instruction
like "movaps %xmm0,0x10(%rax)" which requires aligned memory access.
Signed-off-by: Lepton Wu <lepton@chromium.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6314>
---
src/util/ralloc.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/util/ralloc.c b/src/util/ralloc.c
index f36f8bf3654..4c2cf0772ce 100644
--- a/src/util/ralloc.c
+++ b/src/util/ralloc.c
@@ -28,6 +28,9 @@
#include <string.h>
#include <stdint.h>
+#include "util/macros.h"
+#include "util/u_math.h"
+
/* Some versions of MinGW are missing _vscprintf's declaration, although they
* still provide the symbol in the import library. */
#ifdef __MINGW32__
@@ -120,7 +123,15 @@ ralloc_context(const void *ctx)
void *
ralloc_size(const void *ctx, size_t size)
{
- void *block = malloc(size + sizeof(ralloc_header));
+ /* Some malloc allocation doesn't always align to 16 bytes even on 64 bits
+ * system, from Android bionic/tests/malloc_test.cpp:
+ * - Allocations of a size that rounds up to a multiple of 16 bytes
+ * must have at least 16 byte alignment.
+ * - Allocations of a size that rounds up to a multiple of 8 bytes and
+ * not 16 bytes, are only required to have at least 8 byte alignment.
+ */
+ void *block = malloc(align64(size + sizeof(ralloc_header),
+ alignof(ralloc_header)));
ralloc_header *info;
ralloc_header *parent;
@@ -167,7 +178,8 @@ resize(void *ptr, size_t size)
ralloc_header *child, *old, *info;
old = get_header(ptr);
- info = realloc(old, size + sizeof(ralloc_header));
+ info = realloc(old, align64(size + sizeof(ralloc_header),
+ alignof(ralloc_header)));
if (info == NULL)
return NULL;
--
GitLab