@@ -54,12 +54,14 @@ static inline void reload_segments(struct sigcontext_32 *sc)
5454}
5555
5656#define sigset32_t compat_sigset_t
57+ #define siginfo32_t compat_siginfo_t
5758#define restore_altstack32 compat_restore_altstack
5859#define unsafe_save_altstack32 unsafe_compat_save_altstack
5960
6061#else
6162
6263#define sigset32_t sigset_t
64+ #define siginfo32_t siginfo_t
6365#define __NR_ia32_sigreturn __NR_sigreturn
6466#define __NR_ia32_rt_sigreturn __NR_rt_sigreturn
6567#define restore_altstack32 restore_altstack
@@ -377,3 +379,128 @@ int ia32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
377379 user_access_end ();
378380 return - EFAULT ;
379381}
382+
383+ /*
384+ * The siginfo_t structure and handing code is very easy
385+ * to break in several ways. It must always be updated when new
386+ * updates are made to the main siginfo_t, and
387+ * copy_siginfo_to_user32() must be updated when the
388+ * (arch-independent) copy_siginfo_to_user() is updated.
389+ *
390+ * It is also easy to put a new member in the siginfo_t
391+ * which has implicit alignment which can move internal structure
392+ * alignment around breaking the ABI. This can happen if you,
393+ * for instance, put a plain 64-bit value in there.
394+ */
395+
396+ /*
397+ * If adding a new si_code, there is probably new data in
398+ * the siginfo. Make sure folks bumping the si_code
399+ * limits also have to look at this code. Make sure any
400+ * new fields are handled in copy_siginfo_to_user32()!
401+ */
402+ static_assert (NSIGILL == 11 );
403+ static_assert (NSIGFPE == 15 );
404+ static_assert (NSIGSEGV == 9 );
405+ static_assert (NSIGBUS == 5 );
406+ static_assert (NSIGTRAP == 6 );
407+ static_assert (NSIGCHLD == 6 );
408+ static_assert (NSIGSYS == 2 );
409+
410+ /* This is part of the ABI and can never change in size: */
411+ static_assert (sizeof (siginfo32_t ) == 128 );
412+
413+ /* This is a part of the ABI and can never change in alignment */
414+ static_assert (__alignof__(siginfo32_t ) == 4 );
415+
416+ /*
417+ * The offsets of all the (unioned) si_fields are fixed
418+ * in the ABI, of course. Make sure none of them ever
419+ * move and are always at the beginning:
420+ */
421+ static_assert (offsetof(siginfo32_t , _sifields ) == 3 * sizeof (int ));
422+
423+ static_assert (offsetof(siginfo32_t , si_signo ) == 0 );
424+ static_assert (offsetof(siginfo32_t , si_errno ) == 4 );
425+ static_assert (offsetof(siginfo32_t , si_code ) == 8 );
426+
427+ /*
428+ * Ensure that the size of each si_field never changes.
429+ * If it does, it is a sign that the
430+ * copy_siginfo_to_user32() code below needs to updated
431+ * along with the size in the CHECK_SI_SIZE().
432+ *
433+ * We repeat this check for both the generic and compat
434+ * siginfos.
435+ *
436+ * Note: it is OK for these to grow as long as the whole
437+ * structure stays within the padding size (checked
438+ * above).
439+ */
440+
441+ #define CHECK_SI_OFFSET (name ) \
442+ static_assert(offsetof(siginfo32_t, _sifields) == \
443+ offsetof(siginfo32_t, _sifields.name))
444+
445+ #define CHECK_SI_SIZE (name , size ) \
446+ static_assert(sizeof_field(siginfo32_t, _sifields.name) == size)
447+
448+ CHECK_SI_OFFSET (_kill );
449+ CHECK_SI_SIZE (_kill , 2 * sizeof (int ));
450+ static_assert (offsetof(siginfo32_t , si_pid ) == 0xC );
451+ static_assert (offsetof(siginfo32_t , si_uid ) == 0x10 );
452+
453+ CHECK_SI_OFFSET (_timer );
454+ #ifdef CONFIG_COMPAT
455+ /* compat_siginfo_t doesn't have si_sys_private */
456+ CHECK_SI_SIZE (_timer , 3 * sizeof (int ));
457+ #else
458+ CHECK_SI_SIZE (_timer , 4 * sizeof (int ));
459+ #endif
460+ static_assert (offsetof(siginfo32_t , si_tid ) == 0x0C );
461+ static_assert (offsetof(siginfo32_t , si_overrun ) == 0x10 );
462+ static_assert (offsetof(siginfo32_t , si_value ) == 0x14 );
463+
464+ CHECK_SI_OFFSET (_rt );
465+ CHECK_SI_SIZE (_rt , 3 * sizeof (int ));
466+ static_assert (offsetof(siginfo32_t , si_pid ) == 0x0C );
467+ static_assert (offsetof(siginfo32_t , si_uid ) == 0x10 );
468+ static_assert (offsetof(siginfo32_t , si_value ) == 0x14 );
469+
470+ CHECK_SI_OFFSET (_sigchld );
471+ CHECK_SI_SIZE (_sigchld , 5 * sizeof (int ));
472+ static_assert (offsetof(siginfo32_t , si_pid ) == 0x0C );
473+ static_assert (offsetof(siginfo32_t , si_uid ) == 0x10 );
474+ static_assert (offsetof(siginfo32_t , si_status ) == 0x14 );
475+ static_assert (offsetof(siginfo32_t , si_utime ) == 0x18 );
476+ static_assert (offsetof(siginfo32_t , si_stime ) == 0x1C );
477+
478+ CHECK_SI_OFFSET (_sigfault );
479+ CHECK_SI_SIZE (_sigfault , 4 * sizeof (int ));
480+ static_assert (offsetof(siginfo32_t , si_addr ) == 0x0C );
481+
482+ static_assert (offsetof(siginfo32_t , si_trapno ) == 0x10 );
483+
484+ static_assert (offsetof(siginfo32_t , si_addr_lsb ) == 0x10 );
485+
486+ static_assert (offsetof(siginfo32_t , si_lower ) == 0x14 );
487+ static_assert (offsetof(siginfo32_t , si_upper ) == 0x18 );
488+
489+ static_assert (offsetof(siginfo32_t , si_pkey ) == 0x14 );
490+
491+ static_assert (offsetof(siginfo32_t , si_perf_data ) == 0x10 );
492+ static_assert (offsetof(siginfo32_t , si_perf_type ) == 0x14 );
493+ static_assert (offsetof(siginfo32_t , si_perf_flags ) == 0x18 );
494+
495+ CHECK_SI_OFFSET (_sigpoll );
496+ CHECK_SI_SIZE (_sigpoll , 2 * sizeof (int ));
497+ static_assert (offsetof(siginfo32_t , si_band ) == 0x0C );
498+ static_assert (offsetof(siginfo32_t , si_fd ) == 0x10 );
499+
500+ CHECK_SI_OFFSET (_sigsys );
501+ CHECK_SI_SIZE (_sigsys , 3 * sizeof (int ));
502+ static_assert (offsetof(siginfo32_t , si_call_addr ) == 0x0C );
503+ static_assert (offsetof(siginfo32_t , si_syscall ) == 0x10 );
504+ static_assert (offsetof(siginfo32_t , si_arch ) == 0x14 );
505+
506+ /* any new si_fields should be added here */
0 commit comments