[LTP] [PATCH v3] syscalls/prctl04: Fix false positive report when SECCOMP_MODE_FILTER is not supported
He Zhe
zhe.he@windriver.com
Wed Nov 23 11:42:31 CET 2022
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;
>>> }
>>>
More information about the ltp
mailing list