[LTP] [PATCH v3 1/3] fchownat01: Convert to new API

Andrea Cervesato andrea.cervesato@suse.com
Wed Jan 22 10:08:14 CET 2025


Hi Shiyang,

we are now facing LTP code freeze for the next release, so we are pretty 
busy.
I will review it and merge it after the release.

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