about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-08-24 11:31:59 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-08-24 11:32:04 +0200
commite964b458942131f95b48936a97c808911c6161fa (patch)
tree3f1c1ec812ab32517679f2e9b40c473d1138a325 /src
parentb8526c79201bdc6d08909d01bb0e41f7cb48ecfc (diff)
downloadbox64-e964b458942131f95b48936a97c808911c6161fa.tar.gz
box64-e964b458942131f95b48936a97c808911c6161fa.zip
[BOX32][WRAPPER] Fixed some SIGBUS with 32bits smeaphores
Diffstat (limited to 'src')
-rwxr-xr-xsrc/wrapped32/wrappedlibpthread.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/wrapped32/wrappedlibpthread.c b/src/wrapped32/wrappedlibpthread.c
index dbeee699..541a10c1 100755
--- a/src/wrapped32/wrappedlibpthread.c
+++ b/src/wrapped32/wrappedlibpthread.c
@@ -62,7 +62,20 @@ typedef struct my_sem_32_s {
     sem_t   *sem;
 } my_sem_32_t;
 
-#define GET_SEM(sem) sem_t* _sem = (sem->sign != SEM_SIGN)?((sem_t*)sem):(sem->sem)
+static sem_t* get_sem(void* sem)
+{
+    if(!(((uintptr_t)sem)&0x07))
+        return sem;
+    // sem is unaligned, create a wrapped sem
+    sem_t *new_sem = box_calloc(1, sizeof(sem_t));
+    memcpy(new_sem, sem, sizeof(sem_t));
+    my_sem_32_t* old = sem;
+    old->sign = SEM_SIGN;
+    old->sem = new_sem;
+    return new_sem;
+}
+
+#define GET_SEM(sem) sem_t* _sem = (sem->sign != SEM_SIGN)?(get_sem(sem)):(sem->sem)
 EXPORT int my32_sem_close(sem_t* sem)
 {
     return sem_close(sem);