From 51ea4eb4951fa272a5e3e80938d6b93b705f1ca4 Mon Sep 17 00:00:00 2001
From: Sebastian Reimers <hallo@studio-link.de>
Date: Mon, 23 May 2022 13:20:04 +0200
Subject: [PATCH 1/2] mem,btrace: fix struct alignment

---
 include/re_btrace.h |  4 ++--
 src/btrace/btrace.c | 10 +++++++---
 src/mem/mem.c       | 12 ++++++------
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/include/re_btrace.h b/include/re_btrace.h
index 79d826229..6f45c64b4 100644
--- a/include/re_btrace.h
+++ b/include/re_btrace.h
@@ -6,7 +6,7 @@
 
 struct btrace {
 	void *stack[BTRACE_SZ];
-	int len;
+	size_t len;
 };
 
 int btrace_print(struct re_printf *pf, struct btrace *btrace);
@@ -20,7 +20,7 @@ static inline int btrace(struct btrace *btrace)
 	if (!btrace)
 		return EINVAL;
 
-	btrace->len = (int)backtrace(btrace->stack, BTRACE_SZ);
+	btrace->len = backtrace(btrace->stack, BTRACE_SZ);
 
 	return 0;
 }
diff --git a/src/btrace/btrace.c b/src/btrace/btrace.c
index 08fef88b3..0b6fcd920 100644
--- a/src/btrace/btrace.c
+++ b/src/btrace/btrace.c
@@ -26,26 +26,30 @@ static int print_debug(struct re_printf *pf, struct btrace *btrace,
 	if (!btrace->len)
 		return 0;
 
+#if defined(FREEBSD) || defined(OPENBSD)
 	symbols = backtrace_symbols(btrace->stack, btrace->len);
+#else
+	symbols = backtrace_symbols(btrace->stack, (int)btrace->len);
+#endif
 
 	if (!symbols)
 		return 0;
 
 	switch (type) {
 	case BTRACE_CSV:
-		for (int j = 0; j < btrace->len; j++) {
+		for (size_t j = 0; j < btrace->len; j++) {
 			re_hprintf(pf, "%s%s", symbols[j],
 				   ((j + 1) < btrace->len) ? ", " : "");
 		}
 		break;
 	case BTRACE_NEWLINE:
-		for (int j = 0; j < btrace->len; j++) {
+		for (size_t j = 0; j < btrace->len; j++) {
 			re_hprintf(pf, "%s \n", symbols[j]);
 		}
 		break;
 	case BTRACE_JSON:
 		re_hprintf(pf, "[");
-		for (int j = 0; j < btrace->len; j++) {
+		for (size_t j = 0; j < btrace->len; j++) {
 			re_hprintf(pf, "\"%s\"%s", symbols[j],
 				   ((j + 1) < btrace->len) ? ", " : "");
 		}
diff --git a/src/mem/mem.c b/src/mem/mem.c
index 28a654a29..41bfa1929 100644
--- a/src/mem/mem.c
+++ b/src/mem/mem.c
@@ -27,12 +27,12 @@
 
 /** Defines a reference-counting memory object */
 struct mem {
-	uint32_t nrefs;     /**< Number of references  */
-	mem_destroy_h *dh;  /**< Destroy handler       */
+	size_t nrefs;          /**< Number of references  */
+	mem_destroy_h *dh;     /**< Destroy handler       */
 #if MEM_DEBUG
-	struct le le;          /**< Linked list element   */
-	uint32_t magic;        /**< Magic number          */
+	size_t magic;          /**< Magic number          */
 	size_t size;           /**< Size of memory object */
+	struct le le;          /**< Linked list element   */
 	struct btrace btraces; /**< Backtrace array       */
 #endif
 };
@@ -40,7 +40,7 @@ struct mem {
 #if MEM_DEBUG
 /* Memory debugging */
 static struct list meml = LIST_INIT;
-static const uint32_t mem_magic = 0xe7fb9ac4;
+static const size_t mem_magic = 0xe7fb9ac4;
 static ssize_t threshold = -1;  /**< Memory threshold, disabled by default */
 
 static struct memstat memstat = {
@@ -349,7 +349,7 @@ uint32_t mem_nrefs(const void *data)
 
 	MAGIC_CHECK(m);
 
-	return m->nrefs;
+	return (uint32_t)m->nrefs;
 }
 
 

From afe7525f5e0cd5a08db336d8a2430aa510663411 Mon Sep 17 00:00:00 2001
From: Sebastian Reimers <hallo@studio-link.de>
Date: Mon, 23 May 2022 14:10:42 +0200
Subject: [PATCH 2/2] cmake: add mem alignment check

---
 CMakeLists.txt | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b40cdf9a6..2ffff71e1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -80,6 +80,8 @@ endif()
 
 if(CMAKE_C_COMPILER_ID MATCHES "Clang")
   add_compile_options(-Wshorten-64-to-32)
+  # Ensure struct mem is aligned (used as fat pointer)
+  set_source_files_properties(src/mem/mem.c PROPERTIES COMPILE_FLAGS -Wpadded)
 endif()