diff mbox series

[v2] waitid10: Set the core dump file location to temporary directory

Message ID 20240403051825.1545018-1-minachou@andestech.com
State Superseded
Headers show
Series [v2] waitid10: Set the core dump file location to temporary directory | expand

Commit Message

Hui Min Mina Chou April 3, 2024, 5:18 a.m. UTC
When testing via NFS mount LTP folder on the board, with the NFS server
configured using 'anonuid' and 'anongid' options to set specific
uid/gid, waitid10 fails. This is due to a uid mismatch during core dump
file creation, leading to an aborted dump, resulting in the child
process receiving the signal CLD_KILLED instead of CLD_DUMPED.

  # ./waitid10
  tst_buffers.c:56: TINFO: Test is using guarded buffers
  tst_test.c:1732: TINFO: LTP version: 20240129
  tst_test.c:1616: TINFO: Timeout per run is 0h 05m 00s
  waitid10.c:64: TINFO: Raising RLIMIT_CORE rlim_cur=0 -> 0
  [  296.482665] mnt_uid= 1036, curr_uid= 0
  [  296.483041] Core dump to core aborted: cannot preserve file owner
  waitid10.c:36: TPASS: waitid(P_ALL, 0, infop, WEXITED) passed
  waitid10.c:37: TPASS: infop->si_pid == pidchild (149)
  waitid10.c:38: TPASS: infop->si_status == SIGFPE (8)
  waitid10.c:39: TPASS: infop->si_signo == SIGCHLD (17)
  waitid10.c:42: TFAIL: infop->si_code (2) != CLD_DUMPED (3)

Therefore, referring to madvise08, during testing, set the core dump file
to the temporary directory instead of the current working directory. After
testing, restore the contents of /proc/sys/kernel/core_pattern and clear
all test temporary file.

  # ./waitid10
  tst_buffers.c:56: TINFO: Test is using guarded buffers
  tst_test.c:1709: TINFO: LTP version: 20240129-45-g69537563d16a
  tst_test.c:1593: TINFO: Timeout per run is 0h 05m 00s
  waitid10.c:60: TINFO: Temporary core pattern is '/tmp/LTP_waiSzyEv2/core'
  waitid10.c:73: TINFO: Raising RLIMIT_CORE rlim_cur=0 -> 0
  [68549.534126] mnt_uid= 0, curr_uid= 0
  waitid10.c:38: TPASS: waitid(P_ALL, 0, infop, WEXITED) passed
  waitid10.c:39: TPASS: infop->si_pid == pidchild (163)
  waitid10.c:40: TPASS: infop->si_status == SIGFPE (8)
  waitid10.c:41: TPASS: infop->si_signo == SIGCHLD (17)
  waitid10.c:44: TPASS: infop->si_code == CLD_DUMPED (3)

Signed-off-by: Hui Min Mina Chou <minachou@andestech.com>
---
 testcases/kernel/syscalls/waitid/waitid10.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Comments

Cyril Hrubis April 3, 2024, 10:59 a.m. UTC | #1
Hi!
> When testing via NFS mount LTP folder on the board, with the NFS server
> configured using 'anonuid' and 'anongid' options to set specific
> uid/gid, waitid10 fails. This is due to a uid mismatch during core dump
> file creation, leading to an aborted dump, resulting in the child
> process receiving the signal CLD_KILLED instead of CLD_DUMPED.
> 
>   # ./waitid10
>   tst_buffers.c:56: TINFO: Test is using guarded buffers
>   tst_test.c:1732: TINFO: LTP version: 20240129
>   tst_test.c:1616: TINFO: Timeout per run is 0h 05m 00s
>   waitid10.c:64: TINFO: Raising RLIMIT_CORE rlim_cur=0 -> 0
>   [  296.482665] mnt_uid= 1036, curr_uid= 0
>   [  296.483041] Core dump to core aborted: cannot preserve file owner
>   waitid10.c:36: TPASS: waitid(P_ALL, 0, infop, WEXITED) passed
>   waitid10.c:37: TPASS: infop->si_pid == pidchild (149)
>   waitid10.c:38: TPASS: infop->si_status == SIGFPE (8)
>   waitid10.c:39: TPASS: infop->si_signo == SIGCHLD (17)
>   waitid10.c:42: TFAIL: infop->si_code (2) != CLD_DUMPED (3)
> 
> Therefore, referring to madvise08, during testing, set the core dump file
> to the temporary directory instead of the current working directory. After
> testing, restore the contents of /proc/sys/kernel/core_pattern and clear
> all test temporary file.

Thanks for the detailed description, now it's clear what happens on your
system.

>   # ./waitid10
>   tst_buffers.c:56: TINFO: Test is using guarded buffers
>   tst_test.c:1709: TINFO: LTP version: 20240129-45-g69537563d16a
>   tst_test.c:1593: TINFO: Timeout per run is 0h 05m 00s
>   waitid10.c:60: TINFO: Temporary core pattern is '/tmp/LTP_waiSzyEv2/core'
>   waitid10.c:73: TINFO: Raising RLIMIT_CORE rlim_cur=0 -> 0
>   [68549.534126] mnt_uid= 0, curr_uid= 0
>   waitid10.c:38: TPASS: waitid(P_ALL, 0, infop, WEXITED) passed
>   waitid10.c:39: TPASS: infop->si_pid == pidchild (163)
>   waitid10.c:40: TPASS: infop->si_status == SIGFPE (8)
>   waitid10.c:41: TPASS: infop->si_signo == SIGCHLD (17)
>   waitid10.c:44: TPASS: infop->si_code == CLD_DUMPED (3)
> 
> Signed-off-by: Hui Min Mina Chou <minachou@andestech.com>
> ---
>  testcases/kernel/syscalls/waitid/waitid10.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/testcases/kernel/syscalls/waitid/waitid10.c b/testcases/kernel/syscalls/waitid/waitid10.c
> index e55e88c2325e..3e48f52d0ea8 100644
> --- a/testcases/kernel/syscalls/waitid/waitid10.c
> +++ b/testcases/kernel/syscalls/waitid/waitid10.c
> @@ -16,6 +16,8 @@
>  #include <sys/prctl.h>
>  #include "tst_test.h"
>  
> +#define CORE_PATTERN "/proc/sys/kernel/core_pattern"
> +
>  static siginfo_t *infop;
>  static int core_dumps = 1;
>  
> @@ -48,9 +50,16 @@ static void setup(void)
>  {
>  	struct rlimit rlim;
>  	char c;
> +	char cwd[1024];
> +	char tmpcpattern[1048];
>  
>  	SAFE_GETRLIMIT(RLIMIT_CORE, &rlim);
> -	SAFE_FILE_SCANF("/proc/sys/kernel/core_pattern", "%c", &c);
> +
> +	SAFE_GETCWD(cwd, sizeof(cwd));
> +	snprintf(tmpcpattern, sizeof(tmpcpattern), "%s/core", cwd);
> +	tst_res(TINFO, "Temporary core pattern is '%s'", tmpcpattern);
> +	SAFE_FILE_PRINTF(CORE_PATTERN, "%s", tmpcpattern);
> +	SAFE_FILE_SCANF(CORE_PATTERN, "%c", &c);

Given the description do we really need to change the core pattern?

I guess that just adding .needs_tmpdir = 1 would fix the test since the
test $CWD would point to the test temporary directory.

>  	if (rlim.rlim_cur)
>  		return;
> @@ -76,4 +85,9 @@ static struct tst_test test = {
>  		{&infop, .size = sizeof(*infop)},
>  		{},
>  	},
> +	.needs_tmpdir = 1,
> +	.save_restore = (const struct tst_path_val[]) {
> +		{CORE_PATTERN, NULL, TST_SR_TCONF},
> +		{}
> +	},
>  };
> -- 
> 2.34.1
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp
Hui Min Mina Chou April 8, 2024, 3:15 a.m. UTC | #2
On Wed, Apr 03, 2024 at 12:59:37PM +0200, Cyril Hrubis wrote:
> [EXTERNAL MAIL]
> 
> Hi!
> > When testing via NFS mount LTP folder on the board, with the NFS server
> > configured using 'anonuid' and 'anongid' options to set specific
> > uid/gid, waitid10 fails. This is due to a uid mismatch during core dump
> > file creation, leading to an aborted dump, resulting in the child
> > process receiving the signal CLD_KILLED instead of CLD_DUMPED.
> >
> >   # ./waitid10
> >   tst_buffers.c:56: TINFO: Test is using guarded buffers
> >   tst_test.c:1732: TINFO: LTP version: 20240129
> >   tst_test.c:1616: TINFO: Timeout per run is 0h 05m 00s
> >   waitid10.c:64: TINFO: Raising RLIMIT_CORE rlim_cur=0 -> 0
> >   [  296.482665] mnt_uid= 1036, curr_uid= 0
> >   [  296.483041] Core dump to core aborted: cannot preserve file owner
> >   waitid10.c:36: TPASS: waitid(P_ALL, 0, infop, WEXITED) passed
> >   waitid10.c:37: TPASS: infop->si_pid == pidchild (149)
> >   waitid10.c:38: TPASS: infop->si_status == SIGFPE (8)
> >   waitid10.c:39: TPASS: infop->si_signo == SIGCHLD (17)
> >   waitid10.c:42: TFAIL: infop->si_code (2) != CLD_DUMPED (3)
> >
> > Therefore, referring to madvise08, during testing, set the core dump file
> > to the temporary directory instead of the current working directory. After
> > testing, restore the contents of /proc/sys/kernel/core_pattern and clear
> > all test temporary file.
> 
> Thanks for the detailed description, now it's clear what happens on your
> system.
> 
> >   # ./waitid10
> >   tst_buffers.c:56: TINFO: Test is using guarded buffers
> >   tst_test.c:1709: TINFO: LTP version: 20240129-45-g69537563d16a
> >   tst_test.c:1593: TINFO: Timeout per run is 0h 05m 00s
> >   waitid10.c:60: TINFO: Temporary core pattern is '/tmp/LTP_waiSzyEv2/core'
> >   waitid10.c:73: TINFO: Raising RLIMIT_CORE rlim_cur=0 -> 0
> >   [68549.534126] mnt_uid= 0, curr_uid= 0
> >   waitid10.c:38: TPASS: waitid(P_ALL, 0, infop, WEXITED) passed
> >   waitid10.c:39: TPASS: infop->si_pid == pidchild (163)
> >   waitid10.c:40: TPASS: infop->si_status == SIGFPE (8)
> >   waitid10.c:41: TPASS: infop->si_signo == SIGCHLD (17)
> >   waitid10.c:44: TPASS: infop->si_code == CLD_DUMPED (3)
> >
> > Signed-off-by: Hui Min Mina Chou <minachou@andestech.com>
> > ---
> >  testcases/kernel/syscalls/waitid/waitid10.c | 16 +++++++++++++++-
> >  1 file changed, 15 insertions(+), 1 deletion(-)
> >
> > diff --git a/testcases/kernel/syscalls/waitid/waitid10.c b/testcases/kernel/syscalls/waitid/waitid10.c
> > index e55e88c2325e..3e48f52d0ea8 100644
> > --- a/testcases/kernel/syscalls/waitid/waitid10.c
> > +++ b/testcases/kernel/syscalls/waitid/waitid10.c
> > @@ -16,6 +16,8 @@
> >  #include <sys/prctl.h>
> >  #include "tst_test.h"
> >
> > +#define CORE_PATTERN "/proc/sys/kernel/core_pattern"
> > +
> >  static siginfo_t *infop;
> >  static int core_dumps = 1;
> >
> > @@ -48,9 +50,16 @@ static void setup(void)
> >  {
> >       struct rlimit rlim;
> >       char c;
> > +     char cwd[1024];
> > +     char tmpcpattern[1048];
> >
> >       SAFE_GETRLIMIT(RLIMIT_CORE, &rlim);
> > -     SAFE_FILE_SCANF("/proc/sys/kernel/core_pattern", "%c", &c);
> > +
> > +     SAFE_GETCWD(cwd, sizeof(cwd));
> > +     snprintf(tmpcpattern, sizeof(tmpcpattern), "%s/core", cwd);
> > +     tst_res(TINFO, "Temporary core pattern is '%s'", tmpcpattern);
> > +     SAFE_FILE_PRINTF(CORE_PATTERN, "%s", tmpcpattern);
> > +     SAFE_FILE_SCANF(CORE_PATTERN, "%c", &c);
> 
> Given the description do we really need to change the core pattern?
> 
> I guess that just adding .needs_tmpdir = 1 would fix the test since the
> test $CWD would point to the test temporary directory.
>

Yes, you're right! Simply adding .needs_tmpdir = 1 can solve the issue.
Thanks, I'll revise another version.

> >       if (rlim.rlim_cur)
> >               return;
> > @@ -76,4 +85,9 @@ static struct tst_test test = {
> >               {&infop, .size = sizeof(*infop)},
> >               {},
> >       },
> > +     .needs_tmpdir = 1,
> > +     .save_restore = (const struct tst_path_val[]) {
> > +             {CORE_PATTERN, NULL, TST_SR_TCONF},
> > +             {}
> > +     },
> >  };
> > --
> > 2.34.1
> >
> >
> > --
> > Mailing list info: https://lists.linux.it/listinfo/ltp
> 
> --
> Cyril Hrubis
> chrubis@suse.cz

Thanks,
Mina
diff mbox series

Patch

diff --git a/testcases/kernel/syscalls/waitid/waitid10.c b/testcases/kernel/syscalls/waitid/waitid10.c
index e55e88c2325e..3e48f52d0ea8 100644
--- a/testcases/kernel/syscalls/waitid/waitid10.c
+++ b/testcases/kernel/syscalls/waitid/waitid10.c
@@ -16,6 +16,8 @@ 
 #include <sys/prctl.h>
 #include "tst_test.h"
 
+#define CORE_PATTERN "/proc/sys/kernel/core_pattern"
+
 static siginfo_t *infop;
 static int core_dumps = 1;
 
@@ -48,9 +50,16 @@  static void setup(void)
 {
 	struct rlimit rlim;
 	char c;
+	char cwd[1024];
+	char tmpcpattern[1048];
 
 	SAFE_GETRLIMIT(RLIMIT_CORE, &rlim);
-	SAFE_FILE_SCANF("/proc/sys/kernel/core_pattern", "%c", &c);
+
+	SAFE_GETCWD(cwd, sizeof(cwd));
+	snprintf(tmpcpattern, sizeof(tmpcpattern), "%s/core", cwd);
+	tst_res(TINFO, "Temporary core pattern is '%s'", tmpcpattern);
+	SAFE_FILE_PRINTF(CORE_PATTERN, "%s", tmpcpattern);
+	SAFE_FILE_SCANF(CORE_PATTERN, "%c", &c);
 
 	if (rlim.rlim_cur)
 		return;
@@ -76,4 +85,9 @@  static struct tst_test test = {
 		{&infop, .size = sizeof(*infop)},
 		{},
 	},
+	.needs_tmpdir = 1,
+	.save_restore = (const struct tst_path_val[]) {
+		{CORE_PATTERN, NULL, TST_SR_TCONF},
+		{}
+	},
 };