From ebe67e6134b1a6227aa4c8b2eb6a24af759a2b4f Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 7 Aug 2005 15:16:59 +0000 Subject: [PATCH] Check the fields of the new structure passed to sigaction individually and only check sa_restorer if the SA_RESTORER flag is set. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@4338 --- coregrind/m_syswrap/syswrap-generic.c | 10 ++++++++-- coregrind/m_syswrap/syswrap-x86-linux.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index b0d2f1080e..ae9c9cb2c1 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -5374,8 +5374,14 @@ PRE(sys_rt_sigaction) 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)); diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index d1dc1ec38c..8518da1669 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1871,8 +1871,14 @@ PRE(sys_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)); -- 2.47.3