aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeepa Dinamani2017-08-02 19:51:10 -0700
committerAl Viro2017-09-03 20:21:23 -0400
commit3ef56dc2678258b7211b1870d034c1666becb2bd (patch)
tree0798aa4b92b9c2724dbf8ae3db8b852134a10ade
parent8ac72a462371b39579790394efcea014388f737d (diff)
ipc: Make sys_semtimedop() y2038 safe
struct timespec is not y2038 safe on 32 bit machines. Replace timespec with y2038 safe struct timespec64. Note that the patch only changes the internals without modifying the syscall interface. This will be part of a separate series. Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com> Reviewed-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--ipc/sem.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/ipc/sem.c b/ipc/sem.c
index 6b832b7fa9fc..feea26f897e7 100644
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -1856,7 +1856,7 @@ out:
}
static long do_semtimedop(int semid, struct sembuf __user *tsops,
- unsigned nsops, const struct timespec *timeout)
+ unsigned nsops, const struct timespec64 *timeout)
{
int error = -EINVAL;
struct sem_array *sma;
@@ -1892,7 +1892,7 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops,
error = -EINVAL;
goto out_free;
}
- jiffies_left = timespec_to_jiffies(timeout);
+ jiffies_left = timespec64_to_jiffies(timeout);
}
max = 0;
@@ -2111,8 +2111,8 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
unsigned, nsops, const struct timespec __user *, timeout)
{
if (timeout) {
- struct timespec ts;
- if (copy_from_user(&ts, timeout, sizeof(*timeout)))
+ struct timespec64 ts;
+ if (get_timespec64(&ts, timeout))
return -EFAULT;
return do_semtimedop(semid, tsops, nsops, &ts);
}
@@ -2125,8 +2125,8 @@ COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
const struct compat_timespec __user *, timeout)
{
if (timeout) {
- struct timespec ts;
- if (compat_get_timespec(&ts, timeout))
+ struct timespec64 ts;
+ if (compat_get_timespec64(&ts, timeout))
return -EFAULT;
return do_semtimedop(semid, tsems, nsops, &ts);
}