int, signum, const struct sigaction *, act,
struct sigaction *, oldact, vki_size_t, sigsetsize);
- if (ARG2 != 0)
- PRE_MEM_READ( "rt_sigaction(act)", ARG2, sizeof(struct vki_sigaction));
+ if (ARG2 != 0) {
+ struct vki_sigaction *sa = (struct vki_sigaction *)ARG2;
+ PRE_MEM_READ( "rt_sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
+ PRE_MEM_READ( "rt_sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
+ PRE_MEM_READ( "rt_sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
+ if (sa->sa_flags & VKI_SA_RESTORER)
+ PRE_MEM_READ( "rt_sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
+ }
if (ARG3 != 0)
PRE_MEM_WRITE( "rt_sigaction(oldact)", ARG3, sizeof(struct vki_sigaction));
newp = oldp = NULL;
- if (ARG2 != 0)
- PRE_MEM_READ( "sigaction(act)", ARG2, sizeof(struct vki_old_sigaction));
+ if (ARG2 != 0) {
+ struct vki_old_sigaction *sa = (struct vki_old_sigaction *)ARG2;
+ PRE_MEM_READ( "rt_sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
+ PRE_MEM_READ( "rt_sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
+ PRE_MEM_READ( "rt_sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
+ if (sa->sa_flags & VKI_SA_RESTORER)
+ PRE_MEM_READ( "rt_sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
+ }
if (ARG3 != 0) {
PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction));