1) rt_sigaction
    "sigaction" has the structure:
 
 struct sigaction {
         __sighandler_t sa_handler;
         unsigned long sa_flags;
  #ifdef SA_RESTORER
          __sigrestore_t sa_restorer;
  #endif
          sigset_t sa_mask;               /* mask last for extensibility */
 };

    However, on arch x86_64, if we directly get to call rt_sigaction,
the argument "sa_restorer" will not be fulfilled, and this will lead
 to segment fault.
    on arch x86_64, if sa_restorer is not set, kernel will lead to segment 
fault. 
In other arch, if sa_restorer is not set, kernel can do the correct work.
    To avoid this segment fault, we use glibc function
"int sigaction(...);" instead, which can fulfill the argument "sa_restorer".

2) rt_sigprocmask
    This failure contains two aspects,
the first is the segment fault as described in 1),
the second is that testcase uses a unknown signal 33 for test,
and this will lead sigaction cannot bind signal 33 to the action.

    So, we attempt to use a known signal instead, such as 34.

This patch fixed these failures.

Signed-off-by: Liu Bo <[email protected]>

---
 .../kernel/syscalls/rt_sigaction/rt_sigaction01.c  |    4 ++++
 .../syscalls/rt_sigprocmask/rt_sigprocmask01.c     |   12 ++++++++----
 .../syscalls/rt_sigsuspend/rt_sigsuspend01.c       |    4 ++++
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c 
b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c
index 27af970..1522ac4 100644
--- a/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c
+++ b/testcases/kernel/syscalls/rt_sigaction/rt_sigaction01.c
@@ -154,7 +154,11 @@ set_handler(int sig, int sig_to_mask, int mask_flags)
                 sa.sa_flags = mask_flags;
                 sigemptyset(&sa.sa_mask);
                 sigaddset(&sa.sa_mask, sig_to_mask);
+               #ifndef __x86_64__
                 TEST(syscall(__NR_rt_sigaction,sig, &sa, 
&oldaction,SIGSETSIZE));
+               #else
+               TEST(sigaction(sig, &sa, &oldaction));
+               #endif
         if (TEST_RETURN == 0) {
                 return 0;
         } else {
diff --git a/testcases/kernel/syscalls/rt_sigprocmask/rt_sigprocmask01.c 
b/testcases/kernel/syscalls/rt_sigprocmask/rt_sigprocmask01.c
index 6398a28..31258e9 100644
--- a/testcases/kernel/syscalls/rt_sigprocmask/rt_sigprocmask01.c
+++ b/testcases/kernel/syscalls/rt_sigprocmask/rt_sigprocmask01.c
@@ -154,7 +154,7 @@ int main(int ac, char **av) {
                                cleanup();
                                tst_exit();
                        }
-                       TEST(sigaddset(&set, 33));
+                       TEST(sigaddset(&set, 34));
                        if(TEST_RETURN == -1){
                                tst_resm(TFAIL,"Call to sigaddset() Failed, 
errno=%d : %s",TEST_ERRNO, strerror(TEST_ERRNO));
                                cleanup();
@@ -163,7 +163,11 @@ int main(int ac, char **av) {
                        
                        /* call rt_sigaction() */
                        act.sa_handler = sig_handler;
-                        TEST(syscall(__NR_rt_sigaction, 33, &act, &oact, 8));
+                       #ifndef __x86_64__
+                        TEST(syscall(__NR_rt_sigaction, 34, &act, &oact, 8));
+                       #else
+                       TEST(sigaction(34, &act, &oact));
+                       #endif
                        if(TEST_RETURN != 0){
                                tst_resm(TFAIL,"Call to rt_sigaction() Failed, 
errno=%d : %s",TEST_ERRNO, strerror(TEST_ERRNO));
                                cleanup();
@@ -178,7 +182,7 @@ int main(int ac, char **av) {
                        }
                        
                        else {
-                               TEST(kill(getpid(), 33));
+                               TEST(kill(getpid(), 34));
                                if(TEST_RETURN != 0){
                                        tst_resm(TFAIL,"Call to kill() Failed, 
errno=%d : %s",TEST_ERRNO, strerror(TEST_ERRNO));
                                        cleanup();
@@ -198,7 +202,7 @@ int main(int ac, char **av) {
                                                cleanup();
                                                tst_exit();
                                        }
-                                       TEST(sigismember(&oset, 33));
+                                       TEST(sigismember(&oset, 34));
                                        if(TEST_RETURN == 0 ){
                                                tst_resm(TFAIL,"call 
sigismember() Failed, errno=%d : %s",TEST_ERRNO, strerror(TEST_ERRNO));
                                                cleanup();
diff --git a/testcases/kernel/syscalls/rt_sigsuspend/rt_sigsuspend01.c 
b/testcases/kernel/syscalls/rt_sigsuspend/rt_sigsuspend01.c
index 416a7c9..6132622 100644
--- a/testcases/kernel/syscalls/rt_sigsuspend/rt_sigsuspend01.c
+++ b/testcases/kernel/syscalls/rt_sigsuspend/rt_sigsuspend01.c
@@ -142,7 +142,11 @@ int main(int ac, char **av) {
                        struct sigaction act, oact;
                        act.sa_handler = sig_handler;
                        
+                       #ifndef __x86_64__
                        TEST(syscall(__NR_rt_sigaction, SIGALRM, &act, &oact, 
8));
+                       #else
+                       TEST(sigaction(SIGALRM, &act, &oact));
+                       #endif
                        if(TEST_RETURN == -1){
                                tst_resm(TFAIL,"rt_sigaction() Failed, errno=%d 
: %s",TEST_ERRNO, strerror(TEST_ERRNO));
                                cleanup();
-- 
1.6.2.2

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to