lib: add tst_no_corefile()
PATCH v3 1/1 lib: add tst_no_corefile()
Adds a simple helper to avoid corefile dump.
If crash is expected in a testcase, we can avoid dumping core file in calling this function.
--- doc/test-writing-guidelines.txt | 12 +++++- include/tst_coredump.h | 18 +++++++++ include/tst_test.h | 1 + lib/tst_coredump.c | 40 +++++++++++++++++++ .../kernel/security/umip/umip_basic_test.c | 2 + testcases/kernel/syscalls/ipc/shmat/shmat01.c | 16 ++------ 6 files changed, 74 insertions(+), 15 deletions(-) create mode 100644 include/tst_coredump.h create mode 100644 lib/tst_coredump.c
doc/test-writing-guidelines.txt +10 -2
@@ -826,8 +826,8 @@ The 'TST_PROCESS_STATE_WAIT()' waits until process 'pid' is in requested It's mostly used with state 'S' which means that process is sleeping in kernel for example in 'pause()' or any other blocking syscall. -2.2.10 Signal handlers -^^^^^^^^^^^^^^^^^^^^^^ +2.2.10 Signals and signal handlers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you need to use signal handlers, keep the code short and simple. Don't forget that the signal handler is called asynchronously and can interrupt the
@@ -859,6 +859,14 @@ type defined in C99 but this one *DOES NOT* imply 'volatile' (it's just a 'typedef' to 'int'). So the correct type for a flag that is changed from a signal handler is either 'volatile int' or 'volatile sig_atomic_t'. +If a crash (e.g. triggered by signal SIGSEGV) is expected in testing, you +can avoid creation of core files by calling tst_no_corefile() function. +This takes effect for process (and its children) which invoked it, unless +they subsequently modify RLIMIT_CORE. + +Note that LTP library will reap any processes that test didn't reap itself, +and report any non-zero exit code as failure. + 2.2.11 Kernel Modules ^^^^^^^^^^^^^^^^^^^^^
include/tst_coredump.h new file +18 -0
@@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Copyright (c) 2019 Red Hat, Inc. +*/ + +#ifndef TST_COREDUMP__ +#define TST_COREDUMP__ + +/* +* If crash is expected, avoid dumping corefile. +* 1 is a special value, that disables core-to-pipe. +* At the same time it is small enough value for +* core-to-file, so it skips creating cores as well. +*/ +void tst_no_corefile (int verbose); + +#endif /* TST_COREDUMP_H */ +
include/tst_test.h +1 -0
@@ -33,6 +33,7 @@#include "tst_get_bad_addr.h" #include "tst_path_has_mnt_flags.h" #include "tst_sys_conf.h" +#include "tst_coredump.h" /* * Reports testcase result.
lib/tst_coredump.c new file +40 -0
@@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Copyright (c) 2019 Red Hat, Inc. +*/ + +#define TST_NO_DEFAULT_MAIN + +#include <sys/time.h> +#include <sys/resource.h> + +#include "tst_test.h" +#include "tst_coredump.h" + +void tst_no_corefile (int verbose) +{ +struct rlimit new_r, old_r; + + new_r.rlim_cur =1 ; + new_r.rlim_max =1 ; + +if (setrlimit (RLIMIT_CORE , &new_r) ==-1 ) { +if (getrlimit (RLIMIT_CORE , &old_r) ==-1 ) { +tst_res (TWARN |TERRNO , +"Failed to disable core dump, " +"getrlimit failed in process(%d)" , +getpid ()); +return ; + } + +tst_res (TWARN , +"Failed to disable core dump in process(pid=%d), " +"current limits: soft=%lld; hard=%lld" ,getpid (), + (long long ) old_r.rlim_cur, + (long long ) old_r.rlim_max); +return ; + } + +if (verbose) +tst_res (TINFO ,"Avoid dumping corefile for process(pid=%d)" ,getpid ()); +}
testcases/kernel/security/umip/umip_basic_test.c +2 -0
@@ -86,6 +86,8 @@ static void verify_umip_instruction(unsigned int n) pid =SAFE_FORK ();if (pid ==0 ) { +tst_no_corefile (0 ); +switch (n) {case 0 :asm_sgdt ();
testcases/kernel/syscalls/ipc/shmat/shmat01.c +3 -13
@@ -59,19 +59,9 @@ static void *expected_addr(void *in_addr, void *out_addr)static void do_child (int *in_addr,int expect_crash) { -if (expect_crash) { -/* -* Crash is expected, avoid dumping corefile. -* 1 is a special value, that disables core-to-pipe. -* At the same time it is small enough value for -* core-to-file, so it skips creating cores as well. -*/ -struct rlimit r; - - r.rlim_cur =1 ; - r.rlim_max =1 ; -SAFE_SETRLIMIT (RLIMIT_CORE , &r); - } +if (expect_crash) +tst_no_corefile (1 ); + *in_addr =10 ;exit (0 );
Signature · 1 line
2.20.1
PATCH 1/1 lib: add tst_no_corefile()
From: Li Wang <[email protected]>
Adds a simple helper to avoid corefile dump.
If crash is expected in a testcase, we can avoid dumping core file in calling this function.
---
Li,
I'd like to avoid generating TWARN when user has done nothing wrong. What would you tell on this version? Only tst_no_corefile() is changed compared to your v3.
doc/test-writing-guidelines.txt | 12 +++++++-- include/tst_coredump.h | 18 +++++++++++++ include/tst_test.h | 1 + lib/tst_coredump.c | 32 ++++++++++++++++++++++++ testcases/kernel/security/umip/umip_basic_test.c | 2 ++ testcases/kernel/syscalls/ipc/shmat/shmat01.c | 16 +++--------- 6 files changed, 66 insertions(+), 15 deletions(-) create mode 100644 include/tst_coredump.h create mode 100644 lib/tst_coredump.c
doc/test-writing-guidelines.txt +10 -2
@@ -826,8 +826,8 @@ The 'TST_PROCESS_STATE_WAIT()' waits until process 'pid' is in requested It's mostly used with state 'S' which means that process is sleeping in kernel for example in 'pause()' or any other blocking syscall. -2.2.10 Signal handlers -^^^^^^^^^^^^^^^^^^^^^^ +2.2.10 Signals and signal handlers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you need to use signal handlers, keep the code short and simple. Don't forget that the signal handler is called asynchronously and can interrupt the
@@ -859,6 +859,14 @@ type defined in C99 but this one *DOES NOT* imply 'volatile' (it's just a 'typedef' to 'int'). So the correct type for a flag that is changed from a signal handler is either 'volatile int' or 'volatile sig_atomic_t'. +If a crash (e.g. triggered by signal SIGSEGV) is expected in testing, you +can avoid creation of core files by calling tst_no_corefile() function. +This takes effect for process (and its children) which invoked it, unless +they subsequently modify RLIMIT_CORE. + +Note that LTP library will reap any processes that test didn't reap itself, +and report any non-zero exit code as failure. + 2.2.11 Kernel Modules ^^^^^^^^^^^^^^^^^^^^^
include/tst_coredump.h new file +18 -0
@@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Copyright (c) 2019 Red Hat, Inc. +*/ + +#ifndef TST_COREDUMP__ +#define TST_COREDUMP__ + +/* +* If crash is expected, avoid dumping corefile. +* 1 is a special value, that disables core-to-pipe. +* At the same time it is small enough value for +* core-to-file, so it skips creating cores as well. +*/ +void tst_no_corefile (int verbose); + +#endif /* TST_COREDUMP_H */ +
include/tst_test.h +1 -0
@@ -33,6 +33,7 @@#include "tst_get_bad_addr.h" #include "tst_path_has_mnt_flags.h" #include "tst_sys_conf.h" +#include "tst_coredump.h" /* * Reports testcase result.
lib/tst_coredump.c new file +32 -0
@@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Copyright (c) 2019 Red Hat, Inc. +*/ + +#define TST_NO_DEFAULT_MAIN + +#include <sys/time.h> +#include <sys/resource.h> + +#include "tst_test.h" +#include "tst_coredump.h" + +void tst_no_corefile (int verbose) +{ +struct rlimit new_r, old_r; + +SAFE_GETRLIMIT (RLIMIT_CORE , &old_r); +if (old_r.rlim_max >=1 ||geteuid () ==0 ) { +/* +* 1 is a special value, that disables core-to-pipe. +* At the same time it is small enough value for +* core-to-file, so it skips creating cores as well. +*/ + new_r.rlim_cur =1 ; + new_r.rlim_max =1 ; +SAFE_SETRLIMIT (RLIMIT_CORE , &new_r); + } + +if (verbose) +tst_res (TINFO ,"Avoid dumping corefile for process(pid=%d)" ,getpid ()); +}
testcases/kernel/security/umip/umip_basic_test.c +2 -0
@@ -86,6 +86,8 @@ static void verify_umip_instruction(unsigned int n) pid =SAFE_FORK ();if (pid ==0 ) { +tst_no_corefile (0 ); +switch (n) {case 0 :asm_sgdt ();
testcases/kernel/syscalls/ipc/shmat/shmat01.c +3 -13
@@ -59,19 +59,9 @@ static void *expected_addr(void *in_addr, void *out_addr)static void do_child (int *in_addr,int expect_crash) { -if (expect_crash) { -/* -* Crash is expected, avoid dumping corefile. -* 1 is a special value, that disables core-to-pipe. -* At the same time it is small enough value for -* core-to-file, so it skips creating cores as well. -*/ -struct rlimit r; - - r.rlim_cur =1 ; - r.rlim_max =1 ; -SAFE_SETRLIMIT (RLIMIT_CORE , &r); - } +if (expect_crash) +tst_no_corefile (1 ); + *in_addr =10 ;exit (0 );
Signature · 1 line
1.8.3.1
PATCH 1/1 lib: add tst_no_corefile()
Hi!
Quoted 8 lines
lib/tst_coredump.c new file +8
-0+void tst_no_corefile (int verbose) +{ +struct rlimit new_r, old_r; + +SAFE_GETRLIMIT (RLIMIT_CORE , &old_r); +if (old_r.rlim_max >=1 ||geteuid () ==0 ) { +/* +* 1 is a special value, that disables core-to-pipe.
lib/tst_coredump.c line 31
Quoted 10 lines
lib/tst_coredump.c new file +10
-0+* At the same time it is small enough value for +* core-to-file, so it skips creating cores as well. +*/ + new_r.rlim_cur =1 ; + new_r.rlim_max =1 ; +SAFE_SETRLIMIT (RLIMIT_CORE , &new_r); + } + +if (verbose) +tst_res (TINFO ,"Avoid dumping corefile for process(pid=%d)" ,getpid ());
Should we print the message here only
if (old_r.rlim_max <= 1 || geteuid() == 0)
because otherwise we will print the mesasge even in cases that the corefile is not in fact limited.
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH 1/1 lib: add tst_no_corefile()
----- Original Message -----
Quoted 22 lines
Hi!
Quoted 8 lines
lib/tst_coredump.c new file +8
-0+void tst_no_corefile (int verbose) +{ +struct rlimit new_r, old_r; + +SAFE_GETRLIMIT (RLIMIT_CORE , &old_r); +if (old_r.rlim_max >=1 ||geteuid () ==0 ) { +/* +* 1 is a special value, that disables core-to-pipe. lib/tst_coredump.c line 31
Quoted 10 lines
lib/tst_coredump.c new file +10
-0+* At the same time it is small enough value for +* core-to-file, so it skips creating cores as well. +*/ + new_r.rlim_cur =1 ; + new_r.rlim_max =1 ; +SAFE_SETRLIMIT (RLIMIT_CORE , &new_r); + } + +if (verbose) +tst_res (TINFO ,"Avoid dumping corefile for process(pid=%d)" ,getpid ());Should we print the message here only
Quoted 4 lines
if (old_r.rlim_max <= 1 || geteuid() == 0)because otherwise we will print the mesasge even in cases that the corefile is not in fact limited.
Depends on setup of core_pattern, if it's core-to-file it's already limited. If it's core-to-pipe, then it's no limit, so I agree, we can move it above.
Quoted 5 lines
--
Cyril Hrubis
[email protected]
PATCH 1/1 lib: add tst_no_corefile()
Hi Jan,
Quoted 10 lines · Jan Stancek
...
Quoted 3 lines
because otherwise we will print the mesasge even in cases that the corefile is not in fact limited.
Depends on setup of
core_pattern, if it's core-to-file it's already limited.
If it's core-to-pipe, then it's no limit, so I agree, we can move it above.
I helped to push the v3.1 base on Cyril's suggestion. Since I'm going to apply the pkey testcase. Thanks.
Signature · 5 lines
Regards, Li Wang -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.linux.it/pipermail/ltp/attachments/20190717/b8f431f3/attachment.htm>
PATCH 1/1 lib: add tst_no_corefile()
----- Original Message -----
Quoted 9 lines
Hi Jan,
Quoted 5 lines · Jan Stancek
...
Quoted 3 lines
because otherwise we will print the mesasge even in cases that the corefile is not in fact limited.
Quoted 7 lines
Quoted 5 lines
Depends on setup of
core_pattern, if it's core-to-file it's already limited.
If it's core-to-pipe, then it's no limit, so I agree, we can move it above.I helped to push the v3.1 base on Cyril's suggestion. Since I'm going to apply the pkey testcase. Thanks.
Thanks Li.
Quoted 5 lines
--
Regards,
Li Wang
PATCH 1/1 lib: add tst_no_corefile()
In reply to Jan StancekQuoted 6 lines · Jan Stancek
Li,
I'd like to avoid generating TWARN when user has done nothing wrong. What would you tell on this version? Only
tst_no_corefile()is changed compared to your v3.
Agree on this, TWARN seems unnecessary. Feel free to modify&push v3.1 as Cyril suggested.
Thank you, Jan!
Signature · 5 lines
Regards, Li Wang -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.linux.it/pipermail/ltp/attachments/20190715/f85b4a14/attachment.htm>