aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeepa Dinamani <deepa.kernel@gmail.com>2017-08-02 22:51:10 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-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:
1856} 1856}
1857 1857
1858static long do_semtimedop(int semid, struct sembuf __user *tsops, 1858static long do_semtimedop(int semid, struct sembuf __user *tsops,
1859 unsigned nsops, const struct timespec *timeout) 1859 unsigned nsops, const struct timespec64 *timeout)
1860{ 1860{
1861 int error = -EINVAL; 1861 int error = -EINVAL;
1862 struct sem_array *sma; 1862 struct sem_array *sma;
@@ -1892,7 +1892,7 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops,
1892 error = -EINVAL; 1892 error = -EINVAL;
1893 goto out_free; 1893 goto out_free;
1894 } 1894 }
1895 jiffies_left = timespec_to_jiffies(timeout); 1895 jiffies_left = timespec64_to_jiffies(timeout);
1896 } 1896 }
1897 1897
1898 max = 0; 1898 max = 0;
@@ -2111,8 +2111,8 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
2111 unsigned, nsops, const struct timespec __user *, timeout) 2111 unsigned, nsops, const struct timespec __user *, timeout)
2112{ 2112{
2113 if (timeout) { 2113 if (timeout) {
2114 struct timespec ts; 2114 struct timespec64 ts;
2115 if (copy_from_user(&ts, timeout, sizeof(*timeout))) 2115 if (get_timespec64(&ts, timeout))
2116 return -EFAULT; 2116 return -EFAULT;
2117 return do_semtimedop(semid, tsops, nsops, &ts); 2117 return do_semtimedop(semid, tsops, nsops, &ts);
2118 } 2118 }
@@ -2125,8 +2125,8 @@ COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
2125 const struct compat_timespec __user *, timeout) 2125 const struct compat_timespec __user *, timeout)
2126{ 2126{
2127 if (timeout) { 2127 if (timeout) {
2128 struct timespec ts; 2128 struct timespec64 ts;
2129 if (compat_get_timespec(&ts, timeout)) 2129 if (compat_get_timespec64(&ts, timeout))
2130 return -EFAULT; 2130 return -EFAULT;
2131 return do_semtimedop(semid, tsems, nsops, &ts); 2131 return do_semtimedop(semid, tsems, nsops, &ts);
2132 } 2132 }