Skip to contentSkip to conversation

lib: add tst_no_corefile()

PATCH New Li Wang 4 participants 7 messages Jul 5, 2019 – Jul 17, 2019 Library code

lore
Share & tools
lore

Li Wang

author
#0 lore raw

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.

Cc Jan Stancek <[email protected]>
---
 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
index c6d4e001d..a0f9cea71 100644
@@ -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
new file mode 100644
index 000000000..e1f892544
@@ -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
index 2e8e36352..b50e88b60 100644
@@ -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
new file mode 100644
index 000000000..907c06dca
@@ -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
index c34d4a1f6..37850ef9f 100644
@@ -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
index aa9dfd4e5..f75914799 100644
@@ -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
#1 lore raw

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.

Cc Jan Stancek <[email protected]>

---
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
index 4b1e7d25b53f..d9d25c659b34 100644
@@ -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
new file mode 100644
index 000000000000..e1f892544aa8
@@ -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
index 2e8e3635204e..b50e88b60666 100644
@@ -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
new file mode 100644
index 000000000000..2cae5771fb8e
@@ -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
index c34d4a1f618d..37850ef9ff71 100644
@@ -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
index aa9dfd4e5baa..f759147994a2 100644
@@ -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
#2 lore raw

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]
#3 lore raw

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]

#4 lore raw

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>
#5 lore raw

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

#6 lore raw

PATCH 1/1 lib: add tst_no_corefile()

In reply to Jan Stancek
Quoted 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>