diff options
Diffstat (limited to 'ipc/syscall.c')
| -rw-r--r-- | ipc/syscall.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/ipc/syscall.c b/ipc/syscall.c index 77a883ef2eca..65d405f1ba0c 100644 --- a/ipc/syscall.c +++ b/ipc/syscall.c @@ -30,9 +30,14 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,  		return ksys_semtimedop(first, (struct sembuf __user *)ptr,  				       second, NULL);  	case SEMTIMEDOP: -		return ksys_semtimedop(first, (struct sembuf __user *)ptr, -				       second, -				       (const struct timespec __user *)fifth); +		if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME)) +			return ksys_semtimedop(first, ptr, second, +			        (const struct __kernel_timespec __user *)fifth); +		else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME)) +			return compat_ksys_semtimedop(first, ptr, second, +			        (const struct compat_timespec __user *)fifth); +		else +			return -ENOSYS;  	case SEMGET:  		return ksys_semget(first, second, third); @@ -130,6 +135,8 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,  		/* struct sembuf is the same on 32 and 64bit :)) */  		return ksys_semtimedop(first, compat_ptr(ptr), second, NULL);  	case SEMTIMEDOP: +		if (!IS_ENABLED(CONFIG_COMPAT_32BIT_TIME)) +			return -ENOSYS;  		return compat_ksys_semtimedop(first, compat_ptr(ptr), second,  						compat_ptr(fifth));  	case SEMGET:  | 
