@@ -21,27 +21,33 @@ static struct tcase {
21
21
size_t size ;
22
22
uint64_t flags ;
23
23
int * * pidfd ;
24
- int * * child_tid ;
25
- int * * parent_tid ;
26
24
int exit_signal ;
27
25
unsigned long stack ;
28
26
unsigned long stack_size ;
29
27
unsigned long tls ;
30
28
int exp_errno ;
31
29
} tcases [] = {
32
- {"invalid args" , & invalid_args , sizeof (* valid_args ), 0 , NULL , NULL , NULL , SIGCHLD , 0 , 0 , 0 , EFAULT },
33
- {"zero size" , & valid_args , 0 , 0 , NULL , NULL , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
34
- {"short size" , & valid_args , sizeof (* valid_args ) - 1 , 0 , NULL , NULL , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
35
- {"extra size" , & valid_args , sizeof (* valid_args ) + 1 , 0 , NULL , NULL , NULL , SIGCHLD , 0 , 0 , 0 , EFAULT },
36
- {"sighand-no-VM" , & valid_args , sizeof (* valid_args ), CLONE_SIGHAND , NULL , NULL , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
37
- {"thread-no-sighand" , & valid_args , sizeof (* valid_args ), CLONE_THREAD , NULL , NULL , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
38
- {"fs-newns" , & valid_args , sizeof (* valid_args ), CLONE_FS | CLONE_NEWNS , NULL , NULL , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
39
- {"invalid pidfd" , & valid_args , sizeof (* valid_args ), CLONE_PARENT_SETTID | CLONE_CHILD_SETTID | CLONE_PIDFD , & invalid_address , NULL , NULL , SIGCHLD , 0 , 0 , 0 , EFAULT },
40
- {"invalid childtid" , & valid_args , sizeof (* valid_args ), CLONE_PARENT_SETTID | CLONE_CHILD_SETTID | CLONE_PIDFD , NULL , & invalid_address , NULL , SIGCHLD , 0 , 0 , 0 , EFAULT },
41
- {"invalid parenttid" , & valid_args , sizeof (* valid_args ), CLONE_PARENT_SETTID | CLONE_CHILD_SETTID | CLONE_PIDFD , NULL , NULL , & invalid_address , SIGCHLD , 0 , 0 , 0 , EFAULT },
42
- {"invalid signal" , & valid_args , sizeof (* valid_args ), 0 , NULL , NULL , NULL , CSIGNAL + 1 , 0 , 0 , 0 , EINVAL },
43
- {"zero-stack-size" , & valid_args , sizeof (* valid_args ), 0 , NULL , NULL , NULL , SIGCHLD , (unsigned long )& stack , 0 , 0 , EINVAL },
44
- {"invalid-stack" , & valid_args , sizeof (* valid_args ), 0 , NULL , NULL , NULL , SIGCHLD , 0 , 4 , 0 , EINVAL },
30
+ {"invalid args" , & invalid_args , sizeof (* valid_args ), 0 , NULL , SIGCHLD , 0 , 0 , 0 , EFAULT },
31
+ {"zero size" , & valid_args , 0 , 0 , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
32
+ {"short size" , & valid_args , sizeof (* valid_args ) - 1 , 0 , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
33
+ {"extra size" , & valid_args , sizeof (* valid_args ) + 1 , 0 , NULL , SIGCHLD , 0 , 0 , 0 , EFAULT },
34
+ {"sighand-no-VM" , & valid_args , sizeof (* valid_args ), CLONE_SIGHAND , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
35
+ {"thread-no-sighand" , & valid_args , sizeof (* valid_args ), CLONE_THREAD , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
36
+ {"fs-newns" , & valid_args , sizeof (* valid_args ), CLONE_FS | CLONE_NEWNS , NULL , SIGCHLD , 0 , 0 , 0 , EINVAL },
37
+ {"invalid pidfd" , & valid_args , sizeof (* valid_args ), CLONE_PIDFD , & invalid_address , SIGCHLD , 0 , 0 , 0 , EFAULT },
38
+ {"invalid signal" , & valid_args , sizeof (* valid_args ), 0 , NULL , CSIGNAL + 1 , 0 , 0 , 0 , EINVAL },
39
+ {"zero-stack-size" , & valid_args , sizeof (* valid_args ), 0 , NULL , SIGCHLD , (unsigned long )& stack , 0 , 0 , EINVAL },
40
+ {"invalid-stack" , & valid_args , sizeof (* valid_args ), 0 , NULL , SIGCHLD , 0 , 4 , 0 , EINVAL },
41
+ /*
42
+ * Don't test CLONE_CHILD_SETTID and CLONE_PARENT_SETTID:
43
+ * When the parent tid is written to the memory location for
44
+ * CLONE_PARENT_SETTID we're past the point of no return of process
45
+ * creation, i.e. the return value from put_user() isn't checked and
46
+ * can't be checked anymore so you'd never receive EFAULT for a bogus
47
+ * parent_tid memory address.
48
+ *
49
+ * https://lore.kernel.org/linux-m68k/20200627122332.ki2otaiw3v7wndbl@wittgenstein/T/#u
50
+ */
45
51
};
46
52
47
53
static void setup (void )
@@ -63,10 +69,8 @@ static void run(unsigned int n)
63
69
args -> flags = tc -> flags ;
64
70
if (tc -> pidfd )
65
71
args -> pidfd = (uint64_t )(* tc -> pidfd );
66
- if (tc -> child_tid )
67
- args -> child_tid = (uint64_t )(* tc -> child_tid );
68
- if (tc -> parent_tid )
69
- args -> parent_tid = (uint64_t )(* tc -> parent_tid );
72
+ else
73
+ args -> pidfd = 0 ;
70
74
args -> exit_signal = tc -> exit_signal ;
71
75
args -> stack = tc -> stack ;
72
76
args -> stack_size = tc -> stack_size ;
0 commit comments