[LTP] [PATCH v3 1/3] fchownat01: Convert to new API
Shiyang Ruan
ruansy.fnst@fujitsu.com
Wed Jan 22 10:15:56 CET 2025
在 2025/1/22 17:08, Andrea Cervesato 写道:
> Hi Shiyang,
>
> we are now facing LTP code freeze for the next release, so we are pretty
> busy.
Got it. Sorry for bothering.
> I will review it and merge it after the release.
Thanks!
--
Ruan.
>
> Kind regards,
> Andrea
>
> On 1/22/25 06:51, Shiyang Ruan wrote:
>> ping~
>>
>> 在 2025/1/16 16:40, Shiyang Ruan 写道:
>>> 1. convert to new API
>>> 2. move error tests to fchownat03
>>> 3. check if uid/gid is correctly set
>>>
>>> Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com>
>>>
>>> ---
>>> V2:
>>> https://lore.kernel.org/ltp/20250115091218.2630891-1-ruansy.fnst@fujitsu.com/
>>>
>>> Changes:
>>> * Initialize fd to -1, and check fd != -1 when cleanup
>>> * Do not use TST_*_SILENT()
>>> * fchownat01: describe what this case does in DESCRIPTION
>>> * fchownat01: use TST_EXP_EQ_LI(); do not use test case struct
>>> * fchownat02: use TST_EXP_EXPR()
>>> * fchownat03: write a proper commit message, add more errnos to test
>>>
>>> ---
>>> .../kernel/syscalls/fchownat/fchownat01.c | 153 +++++-------------
>>> 1 file changed, 42 insertions(+), 111 deletions(-)
>>>
>>> diff --git a/testcases/kernel/syscalls/fchownat/fchownat01.c
>>> b/testcases/kernel/syscalls/fchownat/fchownat01.c
>>> index 7771c111a..fedcb8ab2 100644
>>> --- a/testcases/kernel/syscalls/fchownat/fchownat01.c
>>> +++ b/testcases/kernel/syscalls/fchownat/fchownat01.c
>>> @@ -1,133 +1,64 @@
>>> +// SPDX-License-Identifier: GPL-2.0-or-later
>>> /*
>>> - * Copyright (c) International Business Machines Corp., 2006
>>> - * AUTHOR: Yi Yang <yyangcdl@cn.ibm.com>
>>> - *
>>> - * This program is free software; you can redistribute it and/or
>>> modify
>>> - * it under the terms of the GNU General Public License as
>>> published by
>>> - * the Free Software Foundation; either version 2 of the License, or
>>> - * (at your option) any later version.
>>> - *
>>> - * This program is distributed in the hope that it will be useful,
>>> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
>>> - * the GNU General Public License for more details.
>>> - *
>>> - * You should have received a copy of the GNU General Public License
>>> - * along with this program; if not, write to the Free Software
>>> Foundation,
>>> - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>>> + * Copyright (c) International Business Machines Corp., 2006
>>> + * Copyright (c) Linux Test Project, 2007-2025
>>> */
>>> -/*
>>> - * DESCRIPTION
>>> - * This test case will verify basic function of fchownat
>>> - * added by kernel 2.6.16 or up.
>>> +
>>> +/*\
>>> + * [Description]
>>> + *
>>> + * Verify that fchownat() succeeds to change file's ownership if the
>>> file
>>> + * descriptor is AT_FDCWD or set by opening a directory.
>>> */
>>> #define _GNU_SOURCE
>>> +#include "tst_test.h"
>>> -#include <sys/types.h>
>>> -#include <sys/stat.h>
>>> -#include <unistd.h>
>>> -#include <stdlib.h>
>>> -#include <errno.h>
>>> -#include <string.h>
>>> -#include <signal.h>
>>> -
>>> -#include "test.h"
>>> -#include "safe_macros.h"
>>> -#include "lapi/fcntl.h"
>>> +#define TESTFILE1 "testfile1"
>>> +#define TESTFILE2 "testfile2"
>>> -#define TESTFILE "testfile"
>>> +static uid_t set_uid = 1000;
>>> +static gid_t set_gid = 1000;
>>> +static int dir_fd = -1;
>>> -static void setup(void);
>>> -static void cleanup(void);
>>> -
>>> -static int dir_fd;
>>> -static int fd;
>>> -static int no_fd = -1;
>>> -static int cu_fd = AT_FDCWD;
>>> -
>>> -static struct test_case_t {
>>> - int exp_ret;
>>> - int exp_errno;
>>> - int flag;
>>> - int *fds;
>>> - char *filenames;
>>> -} test_cases[] = {
>>> - {0, 0, 0, &dir_fd, TESTFILE},
>>> - {-1, ENOTDIR, 0, &fd, TESTFILE},
>>> - {-1, EBADF, 0, &no_fd, TESTFILE},
>>> - {-1, EINVAL, 9999, &dir_fd, TESTFILE},
>>> - {0, 0, 0, &cu_fd, TESTFILE},
>>> -};
>>> -
>>> -char *TCID = "fchownat01";
>>> -int TST_TOTAL = ARRAY_SIZE(test_cases);
>>> -static void fchownat_verify(const struct test_case_t *);
>>> -
>>> -int main(int ac, char **av)
>>> +static void fchownat_verify(void)
>>> {
>>> - int lc;
>>> - int i;
>>> + struct stat stat_buf;
>>> - tst_parse_opts(ac, av, NULL, NULL);
>>> + TST_EXP_PASS(fchownat(AT_FDCWD, TESTFILE1, set_uid, set_gid, 0),
>>> + "fchownat(%d, %s, %d, %d, 0)",
>>> + AT_FDCWD, TESTFILE1, set_uid, set_gid);
>>> - setup();
>>> + SAFE_STAT(TESTFILE1, &stat_buf);
>>> + TST_EXP_EQ_LI(stat_buf.st_uid, set_uid);
>>> + TST_EXP_EQ_LI(stat_buf.st_gid, set_gid);
>>> - for (lc = 0; TEST_LOOPING(lc); lc++) {
>>> - tst_count = 0;
>>> - for (i = 0; i < TST_TOTAL; i++)
>>> - fchownat_verify(&test_cases[i]);
>>> - }
>>> + TST_EXP_PASS(fchownat(dir_fd, TESTFILE2, set_uid, set_gid, 0),
>>> + "fchownat(%d, %s, %d, %d, 0)",
>>> + dir_fd, TESTFILE2, set_uid, set_gid);
>>> - cleanup();
>>> - tst_exit();
>>> + SAFE_STAT(TESTFILE2, &stat_buf);
>>> + TST_EXP_EQ_LI(stat_buf.st_uid, set_uid);
>>> + TST_EXP_EQ_LI(stat_buf.st_gid, set_gid);
>>> }
>>> static void setup(void)
>>> {
>>> - tst_sig(NOFORK, DEF_HANDLER, cleanup);
>>> -
>>> - TEST_PAUSE;
>>> -
>>> - tst_tmpdir();
>>> -
>>> - dir_fd = SAFE_OPEN(cleanup, "./", O_DIRECTORY);
>>> -
>>> - SAFE_TOUCH(cleanup, TESTFILE, 0600, NULL);
>>> -
>>> - fd = SAFE_OPEN(cleanup, "testfile2", O_CREAT | O_RDWR, 0600);
>>> -}
>>> -
>>> -static void fchownat_verify(const struct test_case_t *test)
>>> -{
>>> - TEST(fchownat(*(test->fds), test->filenames, geteuid(),
>>> - getegid(), test->flag));
>>> -
>>> - if (TEST_RETURN != test->exp_ret) {
>>> - tst_resm(TFAIL | TTERRNO,
>>> - "fchownat() returned %ld, expected %d, errno=%d",
>>> - TEST_RETURN, test->exp_ret, test->exp_errno);
>>> - return;
>>> - }
>>> -
>>> - if (TEST_ERRNO == test->exp_errno) {
>>> - tst_resm(TPASS | TTERRNO,
>>> - "fchownat() returned the expected errno %d: %s",
>>> - test->exp_ret, strerror(test->exp_errno));
>>> - } else {
>>> - tst_resm(TFAIL | TTERRNO,
>>> - "fchownat() failed unexpectedly; expected: %d - %s",
>>> - test->exp_errno, strerror(test->exp_errno));
>>> - }
>>> + dir_fd = SAFE_OPEN("./", O_DIRECTORY);
>>> + SAFE_TOUCH(TESTFILE1, 0600, NULL);
>>> + SAFE_TOUCH(TESTFILE2, 0600, NULL);
>>> }
>>> static void cleanup(void)
>>> {
>>> - if (fd > 0)
>>> - close(fd);
>>> -
>>> - if (dir_fd > 0)
>>> - close(dir_fd);
>>> -
>>> - tst_rmdir();
>>> + if (dir_fd != -1)
>>> + SAFE_CLOSE(dir_fd);
>>> }
>>> +
>>> +static struct tst_test test = {
>>> + .needs_tmpdir = 1,
>>> + .needs_root = 1,
>>> + .test_all = fchownat_verify,
>>> + .setup = setup,
>>> + .cleanup = cleanup,
>>> +};
More information about the ltp
mailing list