Converted sigprocmask and rt_sigprocmask.

While doing so, fixed bug #93328, by using the right sized types in
sigprocmask(), and converting them as necessary.  Added a regression test for
it too.

(partly) MERGE TO STABLE


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3013 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/memcheck/tests/sigprocmask.c b/memcheck/tests/sigprocmask.c
new file mode 100644
index 0000000..dc00102
--- /dev/null
+++ b/memcheck/tests/sigprocmask.c
@@ -0,0 +1,47 @@
+
+#include <signal.h>
+#include <stdio.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+// Reg test for bug #93328: we were using too-big sigset types, and thus
+// trashing memory when we wrote out the 'oldset' param from sigprocmask().
+
+int main(void)
+{
+   int x[6], *s, *os, i;
+
+   x[0] = 0x11111111;
+   x[1] = 0x89abcdef;
+   x[2] = 0x22222222;
+   x[3] = 0x33333333;
+   x[4] = 0x0;
+   x[5] = 0x44444444;
+
+   s  = &x[1];
+   os = &x[4];
+
+   fprintf(stderr, "before\n");
+   for (i = 0; i < 6; i++) {
+      fprintf(stderr, "%x ", x[i]);
+   }
+   fprintf(stderr, "\n");
+
+   syscall(__NR_sigprocmask, SIG_BLOCK, s, os);
+
+   fprintf(stderr, "after1\n");
+   for (i = 0; i < 6; i++) {
+      fprintf(stderr, "%x ", x[i]);
+   }
+   fprintf(stderr, "\n");
+   
+   syscall(__NR_sigprocmask, SIG_BLOCK, s, os);
+
+   fprintf(stderr, "after2\n");
+   for (i = 0; i < 6; i++) {
+      fprintf(stderr, "%x ", x[i]);
+   }
+   fprintf(stderr, "\n");
+   
+   return(0);
+}