[LTP] [PATCH v2 2/2] syscalls/faccessat202: Add new testcase
Yang Xu (Fujitsu)
xuyang2018.jy@fujitsu.com
Wed Aug 23 05:52:03 CEST 2023
Hi Cyril
> Hi!
>> +static struct passwd *ltpuser;
>> +
>> +static struct tcase {
>> + int *fd;
>> + char **filename;
>> + int mode;
>> + int flags;
>> + int exp_errno;
>> +} tcases[] = {
>> + {&atcwd_fd, &bad_path, R_OK, 0, EFAULT},
>> + {&atcwd_fd, &rel_path, R_OK, -1, EINVAL},
>> + {&atcwd_fd, &rel_path, -1, 0, EINVAL},
>> + {&bad_fd, &rel_path, R_OK, 0, EBADF},
>> + {&fd, &rel_path, R_OK, 0, ENOTDIR},
>> + {&atcwd_fd, &rel_path, R_OK, AT_EACCESS, EACCES},
>> +};
>> +
>> +static void verify_faccessat2(unsigned int i)
>> +{
>> + struct tcase *tc = &tcases[i];
>> +
>> + if (tc->exp_errno == EACCES) {
>> + if (SAFE_FORK() == 0) {
>> + SAFE_SETUID(ltpuser->pw_uid);
> ^
> Should be SAFE_SETEUID() right?
>
> Because the AT_EACESS causes the call to use EUID instead of UID so we
> have to change only the EUID and keep the UID to root UID.
>
> And with that we can drop the SAFE_FORK() since we can change EUID back
> as long as UID is priviledged, so the code should be:
>
>
> if (tc->exp_errno == EACESS)
> SAFE_SETEUID(ltpuser->pw_uid);
>
> TST_EXP_FAIL(...);
>
> if (tc->exp_errno == EACESS)
> SAFE_SETEUID(ltpuser->pw_uid);
Thank you for your suggestion, but i think " SAFE_SETEUID(ltpuser->pw_uid)"
should be changed to "SAFE_SETEUID(0)" to change EUID back.
>> + TST_EXP_FAIL(faccessat2(*tc->fd, *tc->filename,
>> + tc->mode, tc->flags), tc->exp_errno);
>> + }
>> +
>> + tst_reap_children();
>> + } else {
>> + TST_EXP_FAIL(faccessat2(*tc->fd, *tc->filename,
>> + tc->mode, tc->flags), tc->exp_errno);
> Can we get a better message here? As it is it prints
> "faccessat2(*tc->fd, *tc->filename, tc->mode, tc->flags) ..."
>
> Which is a bit ugly.
Because i used tst_get_bad_addr to test a bad pathname point ,
so if i output relevant information, the test will be killed by SIGSEGV.
In the v3 version, I will change it to this:
"TST_EXP_FAIL(faccessat2(*tc->fd, *tc->filename, tc->mode, tc->flags),
tc->exp_errno, "faccessat2()")"
How about this?
>> + }
>> +}
>> +
>> +static void setup(void)
>> +{
>> + SAFE_MKDIR(TESTDIR, 0666);
>> + SAFE_TOUCH(RELPATH, 0444, NULL);
>> +
>> + fd = SAFE_OPEN(RELPATH, O_RDONLY);
>> + bad_path = tst_get_bad_addr(NULL);
>> +
>> + ltpuser = SAFE_GETPWNAM(TESTUSER);
>> +}
>> +
>> +static void cleanup(void)
>> +{
>> + if (fd > -1)
>> + SAFE_CLOSE(fd);
>> +}
>> +
>> +static struct tst_test test = {
>> + .test = verify_faccessat2,
>> + .tcnt = ARRAY_SIZE(tcases),
>> + .setup = setup,
>> + .cleanup = cleanup,
>> + .bufs = (struct tst_buffers []) {
>> + {&rel_path, .str = RELPATH},
>> + {},
>> + },
>> + .needs_tmpdir = 1,
>> + .needs_root = 1,
>> + .forks_child = 1,
>> +};
>> --
>> 2.39.1
>>
>>
>> --
>> Mailing list info: https://lists.linux.it/listinfo/ltp
Thanks for your review.
Best Regards
Yang Xu
More information about the ltp
mailing list