Atomic operations on aarch64 (arm64) have to be aligned to 8 byte
boundaries (same size as a pointer type), otherwise a SIGBUS is raised.
Because the variable ts here isn't guaranteed to be aligned due to the
various data_size adjustments, make sure that data_size is always
incremented by a minimum of sizeof(int *) rather than sizeof(int).
Program received signal SIGBUS, Bus error.
0xaab1176c in process_store_rules (s=s@entry=0xaae01060,
rep=0xaae010d0, rep=0xaae010d0, an_bit=8388608)
at src/stream.c:1609
1609HA_RWLOCK_WRLOCK(STK_SESS_LOCK, &ts->lock);
(gdb) bt
%0 0xaab1176c in process_store_rules (s=s@entry=0xaae01060,
rep=0xaae010d0, rep=0xaae010d0, an_bit=8388608)
at src/stream.c:1609
%1 0xaab18898 in process_stream (t=,
context=0xaae01060, state=) at src/stream.c:2054
%2 0xaabb0220 in process_runnable_tasks () at src/task.c:421
%3 0xaab51b40 in run_poll_loop () at src/haproxy.c:2609
%4 run_thread_poll_loop (data=) at src/haproxy.c:2674
%5 0xaaac715c in main (argc=, argv=0xf290)
at src/haproxy.c:3286
---
include/proto/stick_table.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/proto/stick_table.h b/include/proto/stick_table.h
index 40bb8ca6..6e39ad47 100644
--- a/include/proto/stick_table.h
+++ b/include/proto/stick_table.h
@@ -64,7 +64,7 @@ static inline int stktable_type_size(int type)
switch(type) {
case STD_T_SINT:
case STD_T_UINT:
- return sizeof(int);
+ return sizeof(int *);
case STD_T_ULL:
return sizeof(unsigned long long);
case STD_T_FRQP:
--
2.19.1