parisc: compat Fix siginfo_t -> compat_siginfo_t conversion on big endian
Helge Deller
maintainerPATCH 1/1 parisc: compat Fix siginfo_t -> compat_siginfo_t conversion on big endian
This patch is basically the same as commit 9d42d48 from Catalin Marinas but adopted to the parisc architecture.
The native (64-bit) sigval_t union contains sival_int (32-bit) and sival_ptr (64-bit). When a compat application invokes a syscall that takes a sigval_t value (as part of a larger structure, e.g. compat_sys_mq_notify, compat_sys_timer_create), the compat_sigval_t union is converted to the native sigval_t with sival_int overlapping with either the least or the most significant half of sival_ptr, depending on endianness. When the corresponding signal is delivered to a compat application, on big endian the current (compat_uptr_t)sival_ptr cast always returns 0 since sival_int corresponds to the top part of sival_ptr. This patch fixes copy_siginfo_to_user32() so that sival_int is copied to the compat_siginfo_t structure.
arch/parisc/kernel/signal32.c +2 -5
@@ -322,7 +322,6 @@ int copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from) {compat_uptr_t addr; -compat_int_t val;int err;if (!access_ok (VERIFY_WRITE , to,sizeof (compat_siginfo_t)))
@@ -361,15 +360,13 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from)case __SI_TIMER >>16 : err |=__put_user (from->si_tid, &to->si_tid); err |=__put_user (from->si_overrun, &to->si_overrun); - val = (compat_int_t )from->si_int; - err |=__put_user (val, &to->si_int); + err |=__put_user (from->si_int, &to->si_int);break ;case __SI_RT >>16 :/* Not generated by the kernel as of now. */ case __SI_MESGQ >>16 : err |=__put_user (from->si_uid, &to->si_uid); err |=__put_user (from->si_pid, &to->si_pid); - val = (compat_int_t )from->si_int; - err |=__put_user (val, &to->si_int); + err |=__put_user (from->si_int, &to->si_int);break ; } }
Quoted 13 lines · Helge Deller
This patch is basically the same as commit 9d42d48 from Catalin Marinas but adopted to the parisc architecture.
The native (64-bit)
sigval_tunion containssival_int(32-bit) andsival_ptr(64-bit). When a compat application invokes a syscall that takes asigval_tvalue (as part of a larger structure, e.g.compat_sys_mq_notify,compat_sys_timer_create), thecompat_sigval_tunion is converted to the nativesigval_twithsival_intoverlapping with either the least or the most significant half ofsival_ptr, depending on endianness. When the corresponding signal is delivered to a compat application, on big endian the current (compat_uptr_t)sival_ptr cast always returns 0 sincesival_intcorresponds to the top part ofsival_ptr. This patch fixescopy_siginfo_to_user32()so thatsival_intis copied to thecompat_siginfo_tstructure.
Se below, I don't think this patch is needed.
Quoted 13 lines
arch/parisc/kernel/signal32.c +0
-1@@ -322,7 +322,6 @@ int copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from) {compat_uptr_t addr; -compat_int_t val;int err;if (!access_ok (VERIFY_WRITE , to,sizeof (compat_siginfo_t)))
arch/parisc/kernel/signal32.c copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from) · line 363
Quoted 6 lines
arch/parisc/kernel/signal32.c +1
-2@@ -361,15 +360,13 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from)case __SI_TIMER >>16 : err |=__put_user (from->si_tid, &to->si_tid); err |=__put_user (from->si_overrun, &to->si_overrun); - val = (compat_int_t )from->si_int; - err |=__put_user (val, &to->si_int); + err |=__put_user (from->si_int, &to->si_int);
Is there any actual change here? The native si_int is 32-bit already, same as compat_int_t. I didn't think parisc needed fixing (only if it was using si_ptr which is 64-bit on a 64-bit architecture).
arch/parisc/kernel/signal32.c copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from) · line 369
Quoted 8 lines
arch/parisc/kernel/signal32.c +1
-2break ;case __SI_RT >>16 :/* Not generated by the kernel as of now. */ case __SI_MESGQ >>16 : err |=__put_user (from->si_uid, &to->si_uid); err |=__put_user (from->si_pid, &to->si_pid); - val = (compat_int_t )from->si_int; - err |=__put_user (val, &to->si_int); + err |=__put_user (from->si_int, &to->si_int);
Same here.
Signature · 1 line
Catalin