Просмотр исходного кода

x86: fix struct semid_ds layout for TIME64

i386 uses the same y2038-split kernel semid64_ds as the asm-generic
targets (sem_otime, sem_otime_high, sem_ctime, sem_ctime_high, then
sem_nsems at sem_perm + 16).  bits/sem.h omitted i386 from the arch list
that drops __uclibc_unused1/2 under __UCLIBC_USE_TIME64__, so the TIME64
build placed sem_nsems 8 bytes too far (sem_perm + 24).  semctl(IPC_STAT)
then returned sem_nsems == 0, and the 64-bit sem_otime/sem_ctime were
reconstructed from the wrong words.

Add __i386__ to that list, like arc/arm/csky/or1k/xtensa/riscv.

Signed-off-by: Ramin Moussavi <ramin.moussavi@yacoub.de>
Ramin Moussavi 1 неделя назад
Родитель
Сommit
99d7fe024a
1 измененных файлов с 4 добавлено и 4 удалено
  1. 4 4
      libc/sysdeps/linux/common/bits/sem.h

+ 4 - 4
libc/sysdeps/linux/common/bits/sem.h

@@ -45,8 +45,8 @@ struct semid_ds
 #else
   __time_t sem_otime;			/* last semop() time */
 #endif
-#if (__WORDSIZE == 32 && !defined(__ARC64_ARCH32__) && !defined(__arc__) && !defined(__arm__) && !defined(__or1k__) && !defined(__xtensa__) && !defined(__riscv) && !defined(__csky__)) || \
-    ((defined(__ARC64_ARCH32__) || defined(__arc__) || defined(__arm__) || defined(__or1k__) || defined(__xtensa__) || defined(__riscv) || defined(__csky__)) && !defined(__UCLIBC_USE_TIME64__))
+#if (__WORDSIZE == 32 && !defined(__ARC64_ARCH32__) && !defined(__arc__) && !defined(__arm__) && !defined(__or1k__) && !defined(__xtensa__) && !defined(__riscv) && !defined(__csky__) && !defined(__i386__)) || \
+    ((defined(__ARC64_ARCH32__) || defined(__arc__) || defined(__arm__) || defined(__or1k__) || defined(__xtensa__) || defined(__riscv) || defined(__csky__) || defined(__i386__)) && !defined(__UCLIBC_USE_TIME64__))
   unsigned long int __uclibc_unused1;
 #endif
 #if defined(__UCLIBC_USE_TIME64__)
@@ -55,8 +55,8 @@ struct semid_ds
 #else
   __time_t sem_ctime;			/* last time changed by semctl() */
 #endif
-#if (__WORDSIZE == 32 && !defined(__ARC64_ARCH32__) && !defined(__arc__) && !defined(__arm__) && !defined(__or1k__) && !defined(__xtensa__) && !defined(__riscv) && !defined(__csky__)) || \
-    ((defined(__ARC64_ARCH32__) || defined(__arc__) || defined(__arm__) || defined(__or1k__) || defined(__xtensa__) || defined(__riscv) || defined(__csky__)) && !defined(__UCLIBC_USE_TIME64__))
+#if (__WORDSIZE == 32 && !defined(__ARC64_ARCH32__) && !defined(__arc__) && !defined(__arm__) && !defined(__or1k__) && !defined(__xtensa__) && !defined(__riscv) && !defined(__csky__) && !defined(__i386__)) || \
+    ((defined(__ARC64_ARCH32__) || defined(__arc__) || defined(__arm__) || defined(__or1k__) || defined(__xtensa__) || defined(__riscv) || defined(__csky__) || defined(__i386__)) && !defined(__UCLIBC_USE_TIME64__))
   unsigned long int __uclibc_unused2;
 #endif
   unsigned long int sem_nsems;		/* number of semaphores in set */