diff options
Diffstat (limited to 'fs/compat.c')
-rw-r--r-- | fs/compat.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/fs/compat.c b/fs/compat.c index 5216c3fd7517..69baca5ad608 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -2206,19 +2206,41 @@ asmlinkage long compat_sys_signalfd(int ufd, | |||
2206 | 2206 | ||
2207 | #ifdef CONFIG_TIMERFD | 2207 | #ifdef CONFIG_TIMERFD |
2208 | 2208 | ||
2209 | asmlinkage long compat_sys_timerfd(int ufd, int clockid, int flags, | 2209 | asmlinkage long compat_sys_timerfd_settime(int ufd, int flags, |
2210 | const struct compat_itimerspec __user *utmr) | 2210 | const struct compat_itimerspec __user *utmr, |
2211 | struct compat_itimerspec __user *otmr) | ||
2211 | { | 2212 | { |
2213 | int error; | ||
2212 | struct itimerspec t; | 2214 | struct itimerspec t; |
2213 | struct itimerspec __user *ut; | 2215 | struct itimerspec __user *ut; |
2214 | 2216 | ||
2215 | if (get_compat_itimerspec(&t, utmr)) | 2217 | if (get_compat_itimerspec(&t, utmr)) |
2216 | return -EFAULT; | 2218 | return -EFAULT; |
2217 | ut = compat_alloc_user_space(sizeof(*ut)); | 2219 | ut = compat_alloc_user_space(2 * sizeof(struct itimerspec)); |
2218 | if (copy_to_user(ut, &t, sizeof(t))) | 2220 | if (copy_to_user(&ut[0], &t, sizeof(t))) |
2219 | return -EFAULT; | 2221 | return -EFAULT; |
2222 | error = sys_timerfd_settime(ufd, flags, &ut[0], &ut[1]); | ||
2223 | if (!error && otmr) | ||
2224 | error = (copy_from_user(&t, &ut[1], sizeof(struct itimerspec)) || | ||
2225 | put_compat_itimerspec(otmr, &t)) ? -EFAULT: 0; | ||
2226 | |||
2227 | return error; | ||
2228 | } | ||
2229 | |||
2230 | asmlinkage long compat_sys_timerfd_gettime(int ufd, | ||
2231 | struct compat_itimerspec __user *otmr) | ||
2232 | { | ||
2233 | int error; | ||
2234 | struct itimerspec t; | ||
2235 | struct itimerspec __user *ut; | ||
2220 | 2236 | ||
2221 | return sys_timerfd(ufd, clockid, flags, ut); | 2237 | ut = compat_alloc_user_space(sizeof(struct itimerspec)); |
2238 | error = sys_timerfd_gettime(ufd, ut); | ||
2239 | if (!error) | ||
2240 | error = (copy_from_user(&t, ut, sizeof(struct itimerspec)) || | ||
2241 | put_compat_itimerspec(otmr, &t)) ? -EFAULT: 0; | ||
2242 | |||
2243 | return error; | ||
2222 | } | 2244 | } |
2223 | 2245 | ||
2224 | #endif /* CONFIG_TIMERFD */ | 2246 | #endif /* CONFIG_TIMERFD */ |