diff mbox series

[v3] syscalls/prctl04: Fix false positive report when SECCOMP_MODE_FILTER is not supported

Message ID 20221122081142.2433326-1-zhe.he@windriver.com
State Changes Requested
Headers show
Series [v3] syscalls/prctl04: Fix false positive report when SECCOMP_MODE_FILTER is not supported | expand

Commit Message

He Zhe Nov. 22, 2022, 8:11 a.m. UTC
The child process really should not receive the expected siganl, SIGSYS, when
kernel doesn't support SECCOMP_MODE_FILTER.

This patch tests if SECCOMP_MODE_FILTER is supported in setup and adds a
variable to record it.

Before this patch:
root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
---- snip ----
prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
prctl04.c:204: TFAIL: SECCOMP_MODE_FILTER permits exit() unexpectedly
prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER

After this patch:
root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
---- snip ----
prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER

Signed-off-by: He Zhe <zhe.he@windriver.com>
---
v2: Add a variable to record the support status instead of exit(1)
v3: Move mode_filter_not_supported check a bit upper to save a prctl call

 testcases/kernel/syscalls/prctl/prctl04.c | 30 +++++++++++++++++------
 1 file changed, 22 insertions(+), 8 deletions(-)

Comments

Yang Xu Nov. 23, 2022, 5:38 a.m. UTC | #1
Hi He

> The child process really should not receive the expected siganl, SIGSYS, when
> kernel doesn't support SECCOMP_MODE_FILTER.
I still feel confused, so which subtestcase has problem since we have do 
check whether support SECCOMP_MODE_FILTER in check_filter_mode.
> 
> This patch tests if SECCOMP_MODE_FILTER is supported in setup and adds a
> variable to record it.
> 
> Before this patch:
> root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
> tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
> ---- snip ----
> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
> prctl04.c:204: TFAIL: SECCOMP_MODE_FILTER permits exit() unexpectedly
> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
> 
> After this patch:
> root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
> tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
> ---- snip ----
> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER


The line 154 and 204 is refer to origin case[1], so do you use the 
lastest ltp?

[1] 
https://github.com/linux-test-project/ltp/commit/3ddc217d7b466f16782c257e29e18b251969edec#diff-6ae2f0e9ae152457424103cc20b7885e242f33f58b2e543b7941671f418d9485R154

Best Regards
Yang Xu
> 
> Signed-off-by: He Zhe <zhe.he@windriver.com>
> ---
> v2: Add a variable to record the support status instead of exit(1)
> v3: Move mode_filter_not_supported check a bit upper to save a prctl call
> 
>   testcases/kernel/syscalls/prctl/prctl04.c | 30 +++++++++++++++++------
>   1 file changed, 22 insertions(+), 8 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/prctl/prctl04.c b/testcases/kernel/syscalls/prctl/prctl04.c
> index b9f4c2a10..d3de4b0d6 100644
> --- a/testcases/kernel/syscalls/prctl/prctl04.c
> +++ b/testcases/kernel/syscalls/prctl/prctl04.c
> @@ -93,6 +93,9 @@ static struct tcase {
>   	"SECCOMP_MODE_FILTER doesn't permit exit()"}
>   };
>   
> +
> +static int mode_filter_not_supported;
> +
>   static void check_filter_mode_inherit(void)
>   {
>   	int childpid;
> @@ -154,16 +157,17 @@ static void check_filter_mode(int val)
>   {
>   	int fd;
>   
> +	if (mode_filter_not_supported == 1) {
> +		tst_res(TCONF, "kernel doesn't support SECCOMP_MODE_FILTER");
> +		return;
> +	}
> +
>   	fd = SAFE_OPEN(FNAME, O_RDWR | O_CREAT, 0666);
>   
>   	TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &strict));
>   	if (TST_RET == -1) {
> -		if (TST_ERR == EINVAL)
> -			tst_res(TCONF,
> -				"kernel doesn't support SECCOMP_MODE_FILTER");
> -		else
> -			tst_res(TFAIL | TERRNO,
> -				"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
> +		tst_res(TFAIL | TERRNO,
> +			"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
>   		return;
>   	}
>   
> @@ -208,7 +212,7 @@ static void verify_prctl(unsigned int n)
>   			return;
>   		}
>   
> -		if (tc->pass_flag == 2)
> +		if (mode_filter_not_supported == 0 && tc->pass_flag == 2)
>   			tst_res(TFAIL,
>   				"SECCOMP_MODE_FILTER permits exit() unexpectedly");
>   	}
> @@ -218,7 +222,17 @@ static void setup(void)
>   {
>   	TEST(prctl(PR_GET_SECCOMP));
>   	if (TST_RET == 0) {
> -		tst_res(TINFO, "kernel support PR_GET/SET_SECCOMP");
> +		tst_res(TINFO, "kernel supports PR_GET/SET_SECCOMP");
> +
> +		TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL));
> +		if (TST_RET == -1)
> +			if (TST_ERR == EINVAL) {
> +				mode_filter_not_supported = 1;
> +				return;
> +			}
> +
> +		tst_res(TINFO, "kernel supports SECCOMP_MODE_FILTER");
> +
>   		return;
>   	}
>
Yang Xu Nov. 23, 2022, 6:17 a.m. UTC | #2
Hi he
> Hi He
> 
>> The child process really should not receive the expected siganl, SIGSYS, when
>> kernel doesn't support SECCOMP_MODE_FILTER.
> I still feel confused, so which subtestcase has problem since we have do
> check whether support SECCOMP_MODE_FILTER in check_filter_mode.


It seems kernel without CONFIG_SECCOMP doesn't report errror when set 
filter, so the previous check doesn't work.

>>
>> This patch tests if SECCOMP_MODE_FILTER is supported in setup and adds a
>> variable to record it.
>>
>> Before this patch:
>> root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
>> tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
>> ---- snip ----
>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>> prctl04.c:204: TFAIL: SECCOMP_MODE_FILTER permits exit() unexpectedly
>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>
>> After this patch:
>> root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
>> tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
>> ---- snip ----
>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
> 
> 
> The line 154 and 204 is refer to origin case[1], so do you use the
> lastest ltp?
> 
> [1]
> https://github.com/linux-test-project/ltp/commit/3ddc217d7b466f16782c257e29e18b251969edec#diff-6ae2f0e9ae152457424103cc20b7885e242f33f58b2e543b7941671f418d9485R154
> 
> Best Regards
> Yang Xu
>>
>> Signed-off-by: He Zhe <zhe.he@windriver.com>
>> ---
>> v2: Add a variable to record the support status instead of exit(1)
>> v3: Move mode_filter_not_supported check a bit upper to save a prctl call
>>
>>    testcases/kernel/syscalls/prctl/prctl04.c | 30 +++++++++++++++++------
>>    1 file changed, 22 insertions(+), 8 deletions(-)
>>
>> diff --git a/testcases/kernel/syscalls/prctl/prctl04.c b/testcases/kernel/syscalls/prctl/prctl04.c
>> index b9f4c2a10..d3de4b0d6 100644
>> --- a/testcases/kernel/syscalls/prctl/prctl04.c
>> +++ b/testcases/kernel/syscalls/prctl/prctl04.c
>> @@ -93,6 +93,9 @@ static struct tcase {
>>    	"SECCOMP_MODE_FILTER doesn't permit exit()"}
>>    };
>>    
>> +
>> +static int mode_filter_not_supported;
>> +
>>    static void check_filter_mode_inherit(void)
>>    {
>>    	int childpid;
>> @@ -154,16 +157,17 @@ static void check_filter_mode(int val)
>>    {
>>    	int fd;
>>    
>> +	if (mode_filter_not_supported == 1) {
>> +		tst_res(TCONF, "kernel doesn't support SECCOMP_MODE_FILTER");
>> +		return;
>> +	}
>> +
>>    	fd = SAFE_OPEN(FNAME, O_RDWR | O_CREAT, 0666);
>>    
>>    	TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &strict));
>>    	if (TST_RET == -1) {
>> -		if (TST_ERR == EINVAL)
>> -			tst_res(TCONF,
>> -				"kernel doesn't support SECCOMP_MODE_FILTER");
>> -		else
>> -			tst_res(TFAIL | TERRNO,
>> -				"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
>> +		tst_res(TFAIL | TERRNO,
>> +			"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
>>    		return;
>>    	}
>>    
>> @@ -208,7 +212,7 @@ static void verify_prctl(unsigned int n)
>>    			return;
>>    		}
>>    
>> -		if (tc->pass_flag == 2)
>> +		if (mode_filter_not_supported == 0 && tc->pass_flag == 2)
I prefer to use "tc->pass_flag == 2 && mode_filter_not_supported == 
0"because only one case's pass_flag value is 2, so we don't need to run 
the latter to many times when kernel without CONFIG_SECCOMP_FILTER.


with commit message fix and this fix,

Reviewed-by: Yang Xu <xuyang2018.jy@fujitsu.com>


ps:BTW, I think split this case into two cases by checking strict mode 
and filter_mode is more clear ie prctl04_1.c prctl04_2.c, so we can add 
these kernel checks by using tst_test struct's need_kconfig member.

Best Regards
Yang Xu
>>    			tst_res(TFAIL,
>>    				"SECCOMP_MODE_FILTER permits exit() unexpectedly");
>>    	}
>> @@ -218,7 +222,17 @@ static void setup(void)
>>    {
>>    	TEST(prctl(PR_GET_SECCOMP));
>>    	if (TST_RET == 0) {
>> -		tst_res(TINFO, "kernel support PR_GET/SET_SECCOMP");
>> +		tst_res(TINFO, "kernel supports PR_GET/SET_SECCOMP");
>> +
>> +		TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL));
>> +		if (TST_RET == -1)
>> +			if (TST_ERR == EINVAL) {
>> +				mode_filter_not_supported = 1;
>> +				return;
>> +			}
>> +
>> +		tst_res(TINFO, "kernel supports SECCOMP_MODE_FILTER");
>> +
>>    		return;
>>    	}
>>    
>
He Zhe Nov. 23, 2022, 10:42 a.m. UTC | #3
On 11/23/22 14:17, xuyang2018.jy@fujitsu.com wrote:
> Hi he
>> Hi He
>>
>>> The child process really should not receive the expected siganl, SIGSYS, when
>>> kernel doesn't support SECCOMP_MODE_FILTER.
>> I still feel confused, so which subtestcase has problem since we have do
>> check whether support SECCOMP_MODE_FILTER in check_filter_mode.
>
> It seems kernel without CONFIG_SECCOMP doesn't report errror when set 
> filter, so the previous check doesn't work.

kernel does report EINVAL as we can see 4 lines of "doesn't support",
corresponding to 4 filter cases, in the commit log. But later verify_prctl
doesn't realize it's not supported and gives a FAIL for not receiving the
related signal. So we add mode_filter_not_supported to inform it.

>
>>> This patch tests if SECCOMP_MODE_FILTER is supported in setup and adds a
>>> variable to record it.
>>>
>>> Before this patch:
>>> root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
>>> tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
>>> ---- snip ----
>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>> prctl04.c:204: TFAIL: SECCOMP_MODE_FILTER permits exit() unexpectedly
>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>>
>>> After this patch:
>>> root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
>>> tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
>>> ---- snip ----
>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>
>> The line 154 and 204 is refer to origin case[1], so do you use the
>> lastest ltp?
>>
>> [1]
>> https://github.com/linux-test-project/ltp/commit/3ddc217d7b466f16782c257e29e18b251969edec#diff-6ae2f0e9ae152457424103cc20b7885e242f33f58b2e543b7941671f418d9485R154
>>
>> Best Regards
>> Yang Xu
>>> Signed-off-by: He Zhe <zhe.he@windriver.com>
>>> ---
>>> v2: Add a variable to record the support status instead of exit(1)
>>> v3: Move mode_filter_not_supported check a bit upper to save a prctl call
>>>
>>>    testcases/kernel/syscalls/prctl/prctl04.c | 30 +++++++++++++++++------
>>>    1 file changed, 22 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/testcases/kernel/syscalls/prctl/prctl04.c b/testcases/kernel/syscalls/prctl/prctl04.c
>>> index b9f4c2a10..d3de4b0d6 100644
>>> --- a/testcases/kernel/syscalls/prctl/prctl04.c
>>> +++ b/testcases/kernel/syscalls/prctl/prctl04.c
>>> @@ -93,6 +93,9 @@ static struct tcase {
>>>    	"SECCOMP_MODE_FILTER doesn't permit exit()"}
>>>    };
>>>    
>>> +
>>> +static int mode_filter_not_supported;
>>> +
>>>    static void check_filter_mode_inherit(void)
>>>    {
>>>    	int childpid;
>>> @@ -154,16 +157,17 @@ static void check_filter_mode(int val)
>>>    {
>>>    	int fd;
>>>    
>>> +	if (mode_filter_not_supported == 1) {
>>> +		tst_res(TCONF, "kernel doesn't support SECCOMP_MODE_FILTER");
>>> +		return;
>>> +	}
>>> +
>>>    	fd = SAFE_OPEN(FNAME, O_RDWR | O_CREAT, 0666);
>>>    
>>>    	TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &strict));
>>>    	if (TST_RET == -1) {
>>> -		if (TST_ERR == EINVAL)
>>> -			tst_res(TCONF,
>>> -				"kernel doesn't support SECCOMP_MODE_FILTER");
>>> -		else
>>> -			tst_res(TFAIL | TERRNO,
>>> -				"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
>>> +		tst_res(TFAIL | TERRNO,
>>> +			"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
>>>    		return;
>>>    	}
>>>    
>>> @@ -208,7 +212,7 @@ static void verify_prctl(unsigned int n)
>>>    			return;
>>>    		}
>>>    
>>> -		if (tc->pass_flag == 2)
>>> +		if (mode_filter_not_supported == 0 && tc->pass_flag == 2)
> I prefer to use "tc->pass_flag == 2 && mode_filter_not_supported == 
> 0"because only one case's pass_flag value is 2, so we don't need to run 
> the latter to many times when kernel without CONFIG_SECCOMP_FILTER.

I'm OK with this.

>
>
> with commit message fix and this fix,

What does "commit message fix" mean please?


Regards,
Zhe

>
> Reviewed-by: Yang Xu <xuyang2018.jy@fujitsu.com>
>
>
> ps:BTW, I think split this case into two cases by checking strict mode 
> and filter_mode is more clear ie prctl04_1.c prctl04_2.c, so we can add 
> these kernel checks by using tst_test struct's need_kconfig member.
>
> Best Regards
> Yang Xu
>>>    			tst_res(TFAIL,
>>>    				"SECCOMP_MODE_FILTER permits exit() unexpectedly");
>>>    	}
>>> @@ -218,7 +222,17 @@ static void setup(void)
>>>    {
>>>    	TEST(prctl(PR_GET_SECCOMP));
>>>    	if (TST_RET == 0) {
>>> -		tst_res(TINFO, "kernel support PR_GET/SET_SECCOMP");
>>> +		tst_res(TINFO, "kernel supports PR_GET/SET_SECCOMP");
>>> +
>>> +		TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL));
>>> +		if (TST_RET == -1)
>>> +			if (TST_ERR == EINVAL) {
>>> +				mode_filter_not_supported = 1;
>>> +				return;
>>> +			}
>>> +
>>> +		tst_res(TINFO, "kernel supports SECCOMP_MODE_FILTER");
>>> +
>>>    		return;
>>>    	}
>>>
Yang Xu Nov. 23, 2022, 11:16 a.m. UTC | #4
Hi He
> 
> 
> On 11/23/22 14:17, xuyang2018.jy@fujitsu.com wrote:
>> Hi he
>>> Hi He
>>>
>>>> The child process really should not receive the expected siganl, SIGSYS, when
>>>> kernel doesn't support SECCOMP_MODE_FILTER.
>>> I still feel confused, so which subtestcase has problem since we have do
>>> check whether support SECCOMP_MODE_FILTER in check_filter_mode.
>>
>> It seems kernel without CONFIG_SECCOMP doesn't report errror when set
>> filter, so the previous check doesn't work.
> 
> kernel does report EINVAL as we can see 4 lines of "doesn't support",
> corresponding to 4 filter cases, in the commit log. But later verify_prctl
> doesn't realize it's not supported and gives a FAIL for not receiving the
> related signal. So we add mode_filter_not_supported to inform it.

yes.
> 
>>
>>>> This patch tests if SECCOMP_MODE_FILTER is supported in setup and adds a
>>>> variable to record it.
>>>>
>>>> Before this patch:
>>>> root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
>>>> tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
>>>> ---- snip ----
>>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>>> prctl04.c:204: TFAIL: SECCOMP_MODE_FILTER permits exit() unexpectedly
>>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>>>
>>>> After this patch:
>>>> root@xilinx-zynq:~# /opt/ltp/testcases/bin/prctl04
>>>> tst_test.c:1431: TINFO: Timeout per run is 0h 05m 00s
>>>> ---- snip ----
>>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>>> prctl04.c:154: TCONF: kernel doesn't support SECCOMP_MODE_FILTER
>>>
>>> The line 154 and 204 is refer to origin case[1], so do you use the
>>> lastest ltp?
>>>
>>> [1]
>>> https://github.com/linux-test-project/ltp/commit/3ddc217d7b466f16782c257e29e18b251969edec#diff-6ae2f0e9ae152457424103cc20b7885e242f33f58b2e543b7941671f418d9485R154
>>>
>>> Best Regards
>>> Yang Xu
>>>> Signed-off-by: He Zhe <zhe.he@windriver.com>
>>>> ---
>>>> v2: Add a variable to record the support status instead of exit(1)
>>>> v3: Move mode_filter_not_supported check a bit upper to save a prctl call
>>>>
>>>>     testcases/kernel/syscalls/prctl/prctl04.c | 30 +++++++++++++++++------
>>>>     1 file changed, 22 insertions(+), 8 deletions(-)
>>>>
>>>> diff --git a/testcases/kernel/syscalls/prctl/prctl04.c b/testcases/kernel/syscalls/prctl/prctl04.c
>>>> index b9f4c2a10..d3de4b0d6 100644
>>>> --- a/testcases/kernel/syscalls/prctl/prctl04.c
>>>> +++ b/testcases/kernel/syscalls/prctl/prctl04.c
>>>> @@ -93,6 +93,9 @@ static struct tcase {
>>>>     	"SECCOMP_MODE_FILTER doesn't permit exit()"}
>>>>     };
>>>>     
>>>> +
>>>> +static int mode_filter_not_supported;
>>>> +
>>>>     static void check_filter_mode_inherit(void)
>>>>     {
>>>>     	int childpid;
>>>> @@ -154,16 +157,17 @@ static void check_filter_mode(int val)
>>>>     {
>>>>     	int fd;
>>>>     
>>>> +	if (mode_filter_not_supported == 1) {
>>>> +		tst_res(TCONF, "kernel doesn't support SECCOMP_MODE_FILTER");
>>>> +		return;
>>>> +	}
>>>> +
>>>>     	fd = SAFE_OPEN(FNAME, O_RDWR | O_CREAT, 0666);
>>>>     
>>>>     	TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &strict));
>>>>     	if (TST_RET == -1) {
>>>> -		if (TST_ERR == EINVAL)
>>>> -			tst_res(TCONF,
>>>> -				"kernel doesn't support SECCOMP_MODE_FILTER");
>>>> -		else
>>>> -			tst_res(TFAIL | TERRNO,
>>>> -				"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
>>>> +		tst_res(TFAIL | TERRNO,
>>>> +			"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
>>>>     		return;
>>>>     	}
>>>>     
>>>> @@ -208,7 +212,7 @@ static void verify_prctl(unsigned int n)
>>>>     			return;
>>>>     		}
>>>>     
>>>> -		if (tc->pass_flag == 2)
>>>> +		if (mode_filter_not_supported == 0 && tc->pass_flag == 2)
>> I prefer to use "tc->pass_flag == 2 && mode_filter_not_supported ==
>> 0"because only one case's pass_flag value is 2, so we don't need to run
>> the latter to many times when kernel without CONFIG_SECCOMP_FILTER.
> 
> I'm OK with this.
> 
>>
>>
>> with commit message fix and this fix,
> 
> What does "commit message fix" mean please?

https://github.com/linux-test-project/ltp/blob/master/testcases/kernel/syscalls/prctl/prctl04.c#L154

Your commit message log use wrong line number,  prctl04.c line154 
doesn't print not supported info. Please use lastest ltp code to run.

Best Regards
Yang Xu
> 
> 
> Regards,
> Zhe
> 
>>
>> Reviewed-by: Yang Xu <xuyang2018.jy@fujitsu.com>
>>
>>
>> ps:BTW, I think split this case into two cases by checking strict mode
>> and filter_mode is more clear ie prctl04_1.c prctl04_2.c, so we can add
>> these kernel checks by using tst_test struct's need_kconfig member.
>>
>> Best Regards
>> Yang Xu
>>>>     			tst_res(TFAIL,
>>>>     				"SECCOMP_MODE_FILTER permits exit() unexpectedly");
>>>>     	}
>>>> @@ -218,7 +222,17 @@ static void setup(void)
>>>>     {
>>>>     	TEST(prctl(PR_GET_SECCOMP));
>>>>     	if (TST_RET == 0) {
>>>> -		tst_res(TINFO, "kernel support PR_GET/SET_SECCOMP");
>>>> +		tst_res(TINFO, "kernel supports PR_GET/SET_SECCOMP");
>>>> +
>>>> +		TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL));
>>>> +		if (TST_RET == -1)
>>>> +			if (TST_ERR == EINVAL) {
>>>> +				mode_filter_not_supported = 1;
>>>> +				return;
>>>> +			}
>>>> +
>>>> +		tst_res(TINFO, "kernel supports SECCOMP_MODE_FILTER");
>>>> +
>>>>     		return;
>>>>     	}
>>>>     
>
diff mbox series

Patch

diff --git a/testcases/kernel/syscalls/prctl/prctl04.c b/testcases/kernel/syscalls/prctl/prctl04.c
index b9f4c2a10..d3de4b0d6 100644
--- a/testcases/kernel/syscalls/prctl/prctl04.c
+++ b/testcases/kernel/syscalls/prctl/prctl04.c
@@ -93,6 +93,9 @@  static struct tcase {
 	"SECCOMP_MODE_FILTER doesn't permit exit()"}
 };
 
+
+static int mode_filter_not_supported;
+
 static void check_filter_mode_inherit(void)
 {
 	int childpid;
@@ -154,16 +157,17 @@  static void check_filter_mode(int val)
 {
 	int fd;
 
+	if (mode_filter_not_supported == 1) {
+		tst_res(TCONF, "kernel doesn't support SECCOMP_MODE_FILTER");
+		return;
+	}
+
 	fd = SAFE_OPEN(FNAME, O_RDWR | O_CREAT, 0666);
 
 	TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &strict));
 	if (TST_RET == -1) {
-		if (TST_ERR == EINVAL)
-			tst_res(TCONF,
-				"kernel doesn't support SECCOMP_MODE_FILTER");
-		else
-			tst_res(TFAIL | TERRNO,
-				"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
+		tst_res(TFAIL | TERRNO,
+			"prctl(PR_SET_SECCOMP) sets SECCOMP_MODE_FILTER failed");
 		return;
 	}
 
@@ -208,7 +212,7 @@  static void verify_prctl(unsigned int n)
 			return;
 		}
 
-		if (tc->pass_flag == 2)
+		if (mode_filter_not_supported == 0 && tc->pass_flag == 2)
 			tst_res(TFAIL,
 				"SECCOMP_MODE_FILTER permits exit() unexpectedly");
 	}
@@ -218,7 +222,17 @@  static void setup(void)
 {
 	TEST(prctl(PR_GET_SECCOMP));
 	if (TST_RET == 0) {
-		tst_res(TINFO, "kernel support PR_GET/SET_SECCOMP");
+		tst_res(TINFO, "kernel supports PR_GET/SET_SECCOMP");
+
+		TEST(prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL));
+		if (TST_RET == -1)
+			if (TST_ERR == EINVAL) {
+				mode_filter_not_supported = 1;
+				return;
+			}
+
+		tst_res(TINFO, "kernel supports SECCOMP_MODE_FILTER");
+
 		return;
 	}