]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fixed bug #93328, by using the right sized types in sigprocmask(), and
authorNicholas Nethercote <n.nethercote@gmail.com>
Mon, 15 Nov 2004 19:07:14 +0000 (19:07 +0000)
committerNicholas Nethercote <n.nethercote@gmail.com>
Mon, 15 Nov 2004 19:07:14 +0000 (19:07 +0000)
converting them as necessary.

Fixed some compiler warnings by renaming two variables, too.

(partly) MERGED FROM HEAD

git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_2_2_0_BRANCH@3014

coregrind/vg_syscalls.c
include/vg_kerneliface.h

index aa44342f8331d895dce62ab076eee1c832f10cb4..c5f46d36492fae89f76c6bb847a42ab717f7cfaf 100644 (file)
@@ -119,7 +119,7 @@ static void do_atfork_child(ThreadId tid)
 
 /* return true if address range entirely contained within client
    address space */
-static Bool valid_client_addr(Addr start, UInt size, ThreadId tid, const Char *syscall)
+static Bool valid_client_addr(Addr start, UInt size, ThreadId tid, const Char *syscallname)
 {
    Addr end = start+size;
    Addr cl_base = VG_(client_base);
@@ -138,11 +138,11 @@ static Bool valid_client_addr(Addr start, UInt size, ThreadId tid, const Char *s
 
    if (0)
       VG_(printf)("%s: test=%p-%p client=%p-%p ret=%d\n",
-                 syscall, start, end, cl_base, VG_(client_end), ret);
+                 syscallname, start, end, cl_base, VG_(client_end), ret);
 
-   if (!ret && syscall != NULL) {
+   if (!ret && syscallname != NULL) {
       VG_(message)(Vg_UserMsg, "Warning: client syscall %s tried to modify addresses %p-%p",
-                  syscall, start, end);
+                  syscallname, start, end);
 
       if (VG_(clo_verbosity) > 1) {
         ExeContext *ec = VG_(get_ExeContext)(tid);
@@ -971,12 +971,12 @@ static Addr do_brk(Addr newbrk)
    ------------------------------------------------------------------ */
 
 /* Return true if we're allowed to use or create this fd */
-static Bool fd_allowed(Int fd, const Char *syscall, ThreadId tid, Bool soft)
+static Bool fd_allowed(Int fd, const Char *syscallname, ThreadId tid, Bool soft)
 {
    if (fd < 0 || fd >= VG_(fd_hard_limit) || fd == VG_(clo_log_fd)) {
       VG_(message)(Vg_UserMsg, 
          "Warning: invalid file descriptor %d in syscall %s()",
-         fd, syscall);
+         fd, syscallname);
       if (fd == VG_(clo_log_fd))
         VG_(message)(Vg_UserMsg, 
             "   Use --log-fd=<number> to select an alternative log fd.");
@@ -5490,6 +5490,44 @@ PRE(sigprocmask)
       SYSCALL_TRACK( pre_mem_write, tid, "sigprocmask(oldset)", 
                     arg3, sizeof(vki_ksigset_t));
 
+   if (SIGNAL_SIMULATION) {
+      // Nb: We must convert the smaller vki_old_ksigset_t params into bigger
+      // vki_ksigset_t params.
+      vki_old_ksigset_t* set    = (vki_old_ksigset_t*)arg2;
+      vki_old_ksigset_t* oldset = (vki_old_ksigset_t*)arg3;
+      vki_ksigset_t bigger_set;
+      vki_ksigset_t bigger_oldset;
+
+      VG_(memset)(&bigger_set, 0, sizeof(vki_ksigset_t));
+      bigger_set.ws[0] = *(vki_old_ksigset_t*)set;
+
+      VG_(do__NR_sigprocmask) ( tid, 
+                                arg1 /*how*/,
+                                &bigger_set,
+                                &bigger_oldset );
+
+      *oldset = bigger_oldset.ws[0];
+   }
+}
+
+POST(sigprocmask)
+{
+   if (res == 0 && arg3 != (UInt)NULL)
+      VG_TRACK( post_mem_write, arg3, sizeof(vki_old_ksigset_t));
+}
+
+PRE(rt_sigprocmask)
+{
+   /* int rt_sigprocmask(int how, k_sigset_t *set, 
+      k_sigset_t *oldset, size_t sigsetsize); */
+   MAYBE_PRINTF("rt_sigprocmask ( %d, %p, %p )\n",arg1,arg2,arg3);
+   if (arg2 != (UInt)NULL)
+      SYSCALL_TRACK( pre_mem_read, tid, "rt_sigprocmask(set)", 
+                    arg2, sizeof(vki_ksigset_t));
+   if (arg3 != (UInt)NULL)
+      SYSCALL_TRACK( pre_mem_write, tid, "rt_sigprocmask(oldset)", 
+                    arg3, sizeof(vki_ksigset_t));
+
    if (SIGNAL_SIMULATION)
       VG_(do__NR_sigprocmask) ( tid, 
                                arg1 /*how*/, 
@@ -5497,15 +5535,12 @@ PRE(sigprocmask)
                                (vki_ksigset_t*) arg3 );
 }
 
-POST(sigprocmask)
+POST(rt_sigprocmask)
 {
    if (res == 0 && arg3 != (UInt)NULL)
       VG_TRACK( post_mem_write, arg3, sizeof(vki_ksigset_t));
 }
 
-PREALIAS(rt_sigprocmask, sigprocmask);
-POSTALIAS(rt_sigprocmask, sigprocmask);
-
 PRE(sigpending)
 {
    /* int sigpending( sigset_t *set ) ; */
index 04e42c09d37aed7eda7b29aa2cea33b28aed2b6b..e8adaa8171b764ee6e40b098d6ad7a0f5348b761 100644 (file)
@@ -62,6 +62,8 @@
 #define VKI_KNSIG_BPW   32  /* since we're using UInts */
 #define VKI_KNSIG_WORDS (VKI_KNSIG / VKI_KNSIG_BPW)
 
+typedef unsigned long vki_old_ksigset_t;
+
 typedef 
    struct { 
       UInt ws[VKI_KNSIG_WORDS];