mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-07 13:43:51 +00:00
y2038: signal: Add sys_rt_sigtimedwait_time32
Once sys_rt_sigtimedwait() gets changed to a 64-bit time_t, we have to provide compatibility support for existing binaries. An earlier version of this patch reused the compat_sys_rt_sigtimedwait entry point to avoid code duplication, but this newer approach duplicates the existing native entry point instead, which seems a bit cleaner. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
parent
e11d4284e2
commit
df8522a340
@ -649,6 +649,10 @@ asmlinkage long sys_rt_sigtimedwait(const sigset_t __user *uthese,
|
||||
siginfo_t __user *uinfo,
|
||||
const struct __kernel_timespec __user *uts,
|
||||
size_t sigsetsize);
|
||||
asmlinkage long sys_rt_sigtimedwait_time32(const sigset_t __user *uthese,
|
||||
siginfo_t __user *uinfo,
|
||||
const struct old_timespec32 __user *uts,
|
||||
size_t sigsetsize);
|
||||
asmlinkage long sys_rt_sigqueueinfo(pid_t pid, int sig, siginfo_t __user *uinfo);
|
||||
|
||||
/* kernel/sys.c */
|
||||
|
@ -3332,6 +3332,39 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
SYSCALL_DEFINE4(rt_sigtimedwait_time32, const sigset_t __user *, uthese,
|
||||
siginfo_t __user *, uinfo,
|
||||
const struct old_timespec32 __user *, uts,
|
||||
size_t, sigsetsize)
|
||||
{
|
||||
sigset_t these;
|
||||
struct timespec64 ts;
|
||||
kernel_siginfo_t info;
|
||||
int ret;
|
||||
|
||||
if (sigsetsize != sizeof(sigset_t))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&these, uthese, sizeof(these)))
|
||||
return -EFAULT;
|
||||
|
||||
if (uts) {
|
||||
if (get_old_timespec32(&ts, uts))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
ret = do_sigtimedwait(&these, &info, uts ? &ts : NULL);
|
||||
|
||||
if (ret > 0 && uinfo) {
|
||||
if (copy_siginfo_to_user(uinfo, &info))
|
||||
ret = -EFAULT;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
|
||||
struct compat_siginfo __user *, uinfo,
|
||||
|
Loading…
Reference in New Issue
Block a user