Re: [LTP] [PATCH] syscalls: fix some failure on arch X86_64

liubo
2009-11-11T01:28:15Z

Hi,
On 11/10/2009 05:38 PM, liubo wrote:
> 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.
>
>

I am sure signal 32 and 33 cannot be used in rt_sigprocmask test
on arch x86_64, but I'm not sure which signal else should be used
here, Is there anyone can provide suggestions?

> This patch fixed these failures.
>
> Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com>
>
> ---
> .../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();
>

------------------------------------------------------------------------------
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