From f921c113c91ed6940f030db837e83afe4dab9ca8 Mon Sep 17 00:00:00 2001
From: pwpiwi <pwpiwi@users.noreply.github.com>
Date: Wed, 31 Jan 2018 18:31:51 +0100
Subject: [PATCH 1/1] add force_align_arg_pointer attribute to all callback
 functions * inspired by issue #404 and respective fix PR #538 * possible fix
 for mysterious crashes, e.g. issue #497 and
 http://www.proxmark.org/forum/viewtopic.php?id=5388

---
 client/cmdhfmfhard.c | 16 ++++++++++++++--
 client/mifarehost.c  |  9 ++++++++-
 client/proxmark3.c   | 17 +++++++++++++++--
 3 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/client/cmdhfmfhard.c b/client/cmdhfmfhard.c
index 69ad898d..cf19436c 100644
--- a/client/cmdhfmfhard.c
+++ b/client/cmdhfmfhard.c
@@ -1158,7 +1158,13 @@ static bool timeout(void)
 }
 
 
-static void *check_for_BitFlipProperties_thread(void *args)
+static void 
+#ifdef __has_attribute
+#if __has_attribute(force_align_arg_pointer)
+__attribute__((force_align_arg_pointer)) 
+#endif
+#endif
+*check_for_BitFlipProperties_thread(void *args)
 {
 	uint8_t first_byte = ((uint8_t *)args)[0];
 	uint8_t last_byte = ((uint8_t *)args)[1];
@@ -1906,7 +1912,13 @@ static void init_book_of_work(void)
 }
 
 
-static void *generate_candidates_worker_thread(void *args)
+static void 
+#ifdef __has_attribute
+#if __has_attribute(force_align_arg_pointer)
+__attribute__((force_align_arg_pointer)) 
+#endif
+#endif
+*generate_candidates_worker_thread(void *args)
 {
 	uint16_t *sum_args = (uint16_t *)args;
 	uint16_t sum_a0 = sums[sum_args[0]];
diff --git a/client/mifarehost.c b/client/mifarehost.c
index d204bf12..dd656ee1 100644
--- a/client/mifarehost.c
+++ b/client/mifarehost.c
@@ -295,7 +295,13 @@ typedef
 
 
 // wrapper function for multi-threaded lfsr_recovery32
-void* nested_worker_thread(void *arg)
+void
+#ifdef __has_attribute
+#if __has_attribute(force_align_arg_pointer)
+__attribute__((force_align_arg_pointer)) 
+#endif
+#endif
+*nested_worker_thread(void *arg)
 {
 	struct Crypto1State *p1;
 	StateList_t *statelist = arg;
@@ -309,6 +315,7 @@ void* nested_worker_thread(void *arg)
 	return statelist->head.slhead;
 }
 
+
 int mfnested(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo, uint8_t trgKeyType, uint8_t *resultKey, bool calibrate)
 {
 	uint16_t i;
diff --git a/client/proxmark3.c b/client/proxmark3.c
index 99ba9fba..95dd7cb9 100644
--- a/client/proxmark3.c
+++ b/client/proxmark3.c
@@ -67,7 +67,14 @@ struct receiver_arg {
 byte_t rx[sizeof(UsbCommand)];
 byte_t* prx = rx;
 
-static void *uart_receiver(void *targ) {
+
+static void
+#ifdef __has_attribute
+#if __has_attribute(force_align_arg_pointer)
+__attribute__((force_align_arg_pointer)) 
+#endif
+#endif
+*uart_receiver(void *targ) {
 	struct receiver_arg *arg = (struct receiver_arg*)targ;
 	size_t rxlen;
 
@@ -95,7 +102,13 @@ static void *uart_receiver(void *targ) {
 }
 
 
-void main_loop(char *script_cmds_file, char *script_cmd, bool usb_present) {
+void
+#ifdef __has_attribute
+#if __has_attribute(force_align_arg_pointer)
+__attribute__((force_align_arg_pointer)) 
+#endif
+#endif
+main_loop(char *script_cmds_file, char *script_cmd, bool usb_present) {
 	struct receiver_arg rarg;
 	char *cmd = NULL;
 	pthread_t reader_thread;
-- 
2.39.5