Skip to content

Commit 5dc0b15

Browse files
committed
y2038: ipc: Redirect ipc(SEMTIMEDOP, ...) to compat_ksys_semtimedop
32-bit architectures implementing 64BIT_TIME and COMPAT_32BIT_TIME need to have the traditional semtimedop() behavior with 32-bit timestamps for sys_ipc() by calling compat_ksys_semtimedop(), while those that are not yet converted need to keep using ksys_semtimedop() like 64-bit architectures do. Note that I chose to not implement a new SEMTIMEDOP64 function that corresponds to the new sys_semtimedop() with 64-bit timeouts. The reason here is that sys_ipc() should no longer be used for new system calls, and libc should just call the semtimedop syscall directly. One open question remain to whether we want to completely avoid the sys_ipc() system call for architectures that do not yet have all the individual calls as they get converted to 64-bit time_t. Doing that would require adding several extra system calls on m68k, mips, powerpc, s390, sh, sparc, and x86-32. Signed-off-by: Arnd Bergmann <[email protected]>
1 parent b0d1757 commit 5dc0b15

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

ipc/syscall.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,14 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
3030
return ksys_semtimedop(first, (struct sembuf __user *)ptr,
3131
second, NULL);
3232
case SEMTIMEDOP:
33-
return ksys_semtimedop(first, (struct sembuf __user *)ptr,
34-
second,
35-
(const struct timespec __user *)fifth);
33+
if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME))
34+
return ksys_semtimedop(first, ptr, second,
35+
(const struct __kernel_timespec __user *)fifth);
36+
else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
37+
return compat_ksys_semtimedop(first, ptr, second,
38+
(const struct compat_timespec __user *)fifth);
39+
else
40+
return -ENOSYS;
3641

3742
case SEMGET:
3843
return ksys_semget(first, second, third);
@@ -130,6 +135,8 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
130135
/* struct sembuf is the same on 32 and 64bit :)) */
131136
return ksys_semtimedop(first, compat_ptr(ptr), second, NULL);
132137
case SEMTIMEDOP:
138+
if (!IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
139+
return -ENOSYS;
133140
return compat_ksys_semtimedop(first, compat_ptr(ptr), second,
134141
compat_ptr(fifth));
135142
case SEMGET:

0 commit comments

Comments
 (0)