[PARISC] Compat signal fixes for 64-bit parisc
In copy_siginfo_from_user32: Use compat_uptr_t. Use compat_ptr(). In copy_siginfo_to_user32: Use compat_int_t. Use ptr_to_compat(). The sigevent_t structure has a 64-bit si_ptr field that when copied to a 32-bit si_ptr will copy the wrong word. For the compat copy use the si_int field instead. Signed-off-by: Carlos O'Donell <carlos@systemhalted.org> Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
This commit is contained in:
Родитель
1e67685b1b
Коммит
f6744bdd73
|
@ -403,7 +403,7 @@ setup_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __
|
||||||
int
|
int
|
||||||
copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
|
copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
|
||||||
{
|
{
|
||||||
unsigned long tmp;
|
compat_uptr_t addr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
|
if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
|
||||||
|
@ -426,8 +426,8 @@ copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
|
||||||
err |= __get_user(to->si_uid, &from->si_uid);
|
err |= __get_user(to->si_uid, &from->si_uid);
|
||||||
break;
|
break;
|
||||||
case __SI_FAULT >> 16:
|
case __SI_FAULT >> 16:
|
||||||
err |= __get_user(tmp, &from->si_addr);
|
err |= __get_user(addr, &from->si_addr);
|
||||||
to->si_addr = (void __user *) tmp;
|
to->si_addr = compat_ptr(addr);
|
||||||
break;
|
break;
|
||||||
case __SI_POLL >> 16:
|
case __SI_POLL >> 16:
|
||||||
err |= __get_user(to->si_band, &from->si_band);
|
err |= __get_user(to->si_band, &from->si_band);
|
||||||
|
@ -447,7 +447,8 @@ copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
|
||||||
int
|
int
|
||||||
copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
|
copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
|
||||||
{
|
{
|
||||||
unsigned int addr;
|
compat_uptr_t addr;
|
||||||
|
compat_int_t val;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
|
if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
|
||||||
|
@ -476,8 +477,8 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
|
||||||
err |= __put_user(from->si_uid, &to->si_uid);
|
err |= __put_user(from->si_uid, &to->si_uid);
|
||||||
break;
|
break;
|
||||||
case __SI_FAULT >> 16:
|
case __SI_FAULT >> 16:
|
||||||
/* avoid type-checking warnings by copying _pad[0] in lieu of si_addr... */
|
addr = ptr_to_compat(from->si_addr);
|
||||||
err |= __put_user(from->_sifields._pad[0], &to->si_addr);
|
err |= __put_user(addr, &to->si_addr);
|
||||||
break;
|
break;
|
||||||
case __SI_POLL >> 16:
|
case __SI_POLL >> 16:
|
||||||
err |= __put_user(from->si_band, &to->si_band);
|
err |= __put_user(from->si_band, &to->si_band);
|
||||||
|
@ -486,15 +487,15 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
|
||||||
case __SI_TIMER >> 16:
|
case __SI_TIMER >> 16:
|
||||||
err |= __put_user(from->si_tid, &to->si_tid);
|
err |= __put_user(from->si_tid, &to->si_tid);
|
||||||
err |= __put_user(from->si_overrun, &to->si_overrun);
|
err |= __put_user(from->si_overrun, &to->si_overrun);
|
||||||
addr = (unsigned long) from->si_ptr;
|
val = (compat_int_t)from->si_int;
|
||||||
err |= __put_user(addr, &to->si_ptr);
|
err |= __put_user(val, &to->si_int);
|
||||||
break;
|
break;
|
||||||
case __SI_RT >> 16: /* Not generated by the kernel as of now. */
|
case __SI_RT >> 16: /* Not generated by the kernel as of now. */
|
||||||
case __SI_MESGQ >> 16:
|
case __SI_MESGQ >> 16:
|
||||||
err |= __put_user(from->si_uid, &to->si_uid);
|
err |= __put_user(from->si_uid, &to->si_uid);
|
||||||
err |= __put_user(from->si_pid, &to->si_pid);
|
err |= __put_user(from->si_pid, &to->si_pid);
|
||||||
addr = (unsigned long) from->si_ptr;
|
val = (compat_int_t)from->si_int;
|
||||||
err |= __put_user(addr, &to->si_ptr);
|
err |= __put_user(val, &to->si_int);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче