]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Check the fields of the new structure passed to sigaction individually
authorTom Hughes <tom@compton.nu>
Sun, 7 Aug 2005 15:16:59 +0000 (15:16 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 7 Aug 2005 15:16:59 +0000 (15:16 +0000)
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
coregrind/m_syswrap/syswrap-x86-linux.c

index b0d2f1080e54e6dfad75fe95f07aa646c8b84267..ae9c9cb2c13a7ec77e77780d4a567b83903ed662 100644 (file)
@@ -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));
 
index d1dc1ec38c1acb2b09162a828cbad5bd452378ea..8518da16691fac5a7875c622d2ea8a59df9a86e5 100644 (file)
@@ -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));