[LTP] [PATCH v2 2/2] flistxattr and listxattr: added tests

Cyril Hrubis chrubis@suse.cz
Tue Oct 11 12:38:39 CEST 2016


Hi!
> +#include "config.h"
> +#include <errno.h>
> +#include <sys/types.h>
> +#include <string.h>
> +
> +#ifdef HAVE_SYS_XATTR_H
> +# include <sys/xattr.h>
> +#endif
> +
> +#include "tst_test.h"
> +
> +#ifdef HAVE_SYS_XATTR_H
> +
> +#define SECURITY_KEY1	"security.ltptest1"
> +#define VALUE	"test"
> +#define VALUE_SIZE	4
                        ^
			(sizeof(VALUE) - 1)
> +#define KEY_SIZE    17
                       ^
		       (sizeof(SECURITY_KEY1) - 1)

Let's avoid hardcoded magic constants whenever possible.

> +
> +int fd;

This should be static int fd, but that is minor.

> +static void set_xattr(int fd, const char *key)
> +{
> +	int n;
> +
> +	n = fsetxattr(fd, key, VALUE, VALUE_SIZE, XATTR_CREATE);
> +	if (n == -1) {
> +		if (errno == ENOTSUP) {
> +			tst_brk(TCONF,
> +				 "no xattr support in fs or mounted "
> +				 "without user_xattr option");
> +		}
> +
> +		if (errno == EEXIST) {
> +			tst_brk(TBROK, "exist attribute %s", key);
> +		} else {
> +			tst_brk(TBROK | TERRNO,
> +				 "fsetxattr() failed");
> +		}

Hmm, why do we treat the EEXIST separately here?

Why not just tst_brk(TBROK | TERRNO, "fsetxattr(%s, ...)") ?

Maybe we should SAFE_FSETXATTR() and SAFE_SETXATTR() and use it in all
fooxattr() testcases.

> +	}
> +}
> +
> +static int has_attribute(const char *list, int llen, const char *attr)
> +{
> +	int i;
> +
> +	for (i = 0; i < llen; i += strlen(list + i) + 1) {
> +		if (!strcmp(list + i, attr))
> +			return 1;
> +	}
> +	return 0;
> +}
> +
> +static void verify_flistxattr(void)
> +{
> +	int size = 64;
> +	char buf[size];

Just do char buf[64]; here and pass the sizeof(buf) to the flistxattr()
instead.

> +
> +	TEST(flistxattr(fd, buf, size));
> +	if (TEST_RETURN == -1) {
> +		tst_res(TFAIL | TERRNO, "flistxattr() failed");
                                ^
				TTERRNO would be better here, since we
				use the TEST() macro.

> +		return;
> +	}
> +
> +	if (!has_attribute(buf, size, SECURITY_KEY1)) {
> +		tst_res(TFAIL, "missing attribute %s",
> +			 SECURITY_KEY1);
> +		return;
> +	}
> +
> +	tst_res(TPASS, "flistxattr() succeeded");
> +}
> +
> +static void setup(void)
> +{
> +	fd = SAFE_OPEN("testfile", O_RDWR | O_CREAT, 0644);
> +
> +	set_xattr(fd, SECURITY_KEY1);
> +}
> +
> +static void cleanup(void)
> +{
> +	if (fd > 0 && close(fd))
> +		tst_res(TWARN | TERRNO, "failed to close file");
> +}
> +
> +static struct tst_test test = {
> +	.tid = "flistxattr01",
> +	.needs_tmpdir = 1,
> +	.needs_root = 1,
> +	.test_all = verify_flistxattr,
> +	.setup = setup,
> +	.cleanup = cleanup,
> +};
> +
> +#else
> +	TST_TEST_TCONF("<sys/xattr.h> does not exist.");
> +#endif /* HAVE_SYS_XATTR_H */
> +
> diff --git a/testcases/kernel/syscalls/flistxattr/flistxattr02.c b/testcases/kernel/syscalls/flistxattr/flistxattr02.c
> new file mode 100644
> index 0000000..8402290
> --- /dev/null
> +++ b/testcases/kernel/syscalls/flistxattr/flistxattr02.c
> @@ -0,0 +1,116 @@
> +/*
> +* Copyright (c) 2016 Fujitsu Ltd.
> +* Author: Xiao Yang <yangx.jy@cn.fujitsu.com>
     ^
     You should update the copyright as well.

> +* This program is free software; you can redistribute it and/or modify it
> +* under the terms of version 2 of the GNU General Public License as
> +* published by the Free Software Foundation.
> +*
> +* This program is distributed in the hope that it would be useful, but
> +* WITHOUT ANY WARRANTY; without even the implied warranty of
> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> +*
> +* You should have received a copy of the GNU General Public License
> +* alone with this program.
> +*/
> +
> +/*
> +* Test Name: flistxattr02
> +*
> +* Description:
> +* 1) flistxattr(2) fails if the size of the list buffer is too small
> +* to hold the result.
> +* 2) flistxattr(2) fails if fd is an invalid file descriptor.
> +*
> +* Expected Result:
> +* 1) flistxattr(2) should return -1 and set errno to ERANGE.
> +* 2) flistxattr(2) should return -1 and set errno to EBADF.
> +*/
> +
> +#include "config.h"
> +#include <errno.h>
> +#include <sys/types.h>
> +
> +#ifdef HAVE_SYS_XATTR_H
> +# include <sys/xattr.h>
> +#endif
> +
> +#include "tst_test.h"
> +
> +#ifdef HAVE_SYS_XATTR_H
> +
> +#define SECURITY_KEY	"security.ltptest"
> +#define VALUE	"test"
> +#define VALUE_SIZE	4
                        ^
			(sizeof(VALUE) - 1)

> +static int fd1;
> +static int fd2;
> +
> +static struct test_case {
> +	int *fd;
> +	size_t size;
> +	int exp_err;
> +} tc[] = {
> +	/* test1 */
           ^
	   These comments seem useless to me, I would have removed them.

> +	{&fd1, 1, ERANGE},
> +	/* test2 */
> +	{&fd2, 20, EBADF}
> +};
> +
> +static void verify_flistxattr(unsigned int n)
> +{
> +	struct test_case *t = tc + n;
> +	char buf[t->size];
> +
> +	TEST(flistxattr(*t->fd, buf, t->size));
> +	if (TEST_RETURN != -1) {
             ^
	     TEST_RETURN == 0 is a bit more robust, that would catch if
	     we got any garbage out of the call.

> +		tst_res(TFAIL, "flistxattr() succeeded unexpectedly");

I would add return; here so that the rest of the code does not need to
be in the else branch (that saves a bit of indentation and the result is
IMHO easier to read).

> +	} else {
> +		if (t->exp_err != TEST_ERRNO) {
> +			tst_res(TFAIL | TTERRNO, "flistxattr() failed "
> +				 "unexpectedlly, expected %s",
> +				 tst_strerrno(t->exp_err));
> +		} else {
> +			tst_res(TPASS | TTERRNO,
> +				 "flistxattr() failed as expected");
> +		}
> +	}
> +}
> +
> +static void setup(void)
> +{
> +	int n;
> +
> +	fd1 = SAFE_OPEN("testfile", O_RDWR | O_CREAT, 0644);
> +	fd2 = -1;
         ^
	 This should be initialized statically when the variable is
	 declared.

> +	n = fsetxattr(fd1, SECURITY_KEY, VALUE, VALUE_SIZE, XATTR_CREATE);
> +	if (n == -1) {
> +		if (errno == ENOTSUP) {
> +			tst_brk(TCONF, "no xattr support in fs or "
> +				 "mounted without user_xattr option");
> +		} else {
> +			tst_brk(TBROK | TERRNO, "fsetxattr() failed");
> +		}

No need for the else branch here. The tst_brk() exits the test and hence
the call never returns.

> +	}
> +}
> +
> +static void cleanup(void)
> +{
> +	if (fd1 > 0 && close(fd1))
> +		tst_res(TWARN | TERRNO, "failed to close file");
> +}
> +
> +static struct tst_test test = {
> +	.tid = "flistxattr02",
> +	.needs_tmpdir = 1,
> +	.needs_root = 1,
> +	.test = verify_flistxattr,
> +	.tcnt = ARRAY_SIZE(tc),
> +	.setup = setup,
> +	.cleanup = cleanup,
> +};
> +
> +#else /* HAVE_SYS_XATTR_H */
> +	TST_TEST_TCONF("<sys/xattr.h> does not exist.");
> +#endif
> diff --git a/testcases/kernel/syscalls/flistxattr/flistxattr03.c b/testcases/kernel/syscalls/flistxattr/flistxattr03.c
> new file mode 100644
> index 0000000..691f869
> --- /dev/null
> +++ b/testcases/kernel/syscalls/flistxattr/flistxattr03.c
> @@ -0,0 +1,111 @@
> +/*
> +* Copyright (c) 2016 Fujitsu Ltd.
> +* Author: Xiao Yang <yangx.jy@cn.fujitsu.com>
> +*
> +* This program is free software; you can redistribute it and/or modify it
> +* under the terms of version 2 of the GNU General Public License as
> +* published by the Free Software Foundation.
> +*
> +* This program is distributed in the hope that it would be useful, but
> +* WITHOUT ANY WARRANTY; without even the implied warranty of
> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> +*
> +* You should have received a copy of the GNU General Public License
> +* alone with this program.
> +*/
> +
> +/*
> +* Test Name: flistxattr03
> +*
> +* Description:
> +* flistxattr is identical to listxattr. an empty buffer of size zero
> +* can return the current size of the list of extended attribute names,
> +* which can be used to estimate a suitable buffer.
> +*/
> +
> +#include "config.h"
> +#include <errno.h>
> +#include <sys/types.h>
> +
> +#ifdef HAVE_SYS_XATTR_H
> +#include <sys/xattr.h>
> +#endif
> +
> +#include "tst_test.h"
> +
> +#ifdef HAVE_SYS_XATTR_H
> +
> +#define SECURITY_KEY	"security.ltptest"
> +#define VALUE	"test"
> +#define VALUE_SIZE	4
                        ^
			(sizeof(VALUE) - 1)
> +
> +static int fd[] = {0, 0};
> +
> +static int check_suitable_buf(const int file, long size)
> +{
> +	int n;
> +	char buf[size];
> +
> +	n = flistxattr(file, buf, size);
                                   ^
				   sizeof(buf) is a bit safe
				   (will stay correct even if somebody
				   changes the code around)
> +	if (n == -1)
> +		return 0;
> +	else
> +		return 1;

return n != -1;

> +}
> +
> +static void verify_flistxattr(unsigned int n)
> +{
> +	const int file = fd[n];

Hmm, why don't you pass the fd[n] directly? It's not that file is that
shorter or easier to read.

> +	TEST(flistxattr(file, NULL, 0));
> +	if (TEST_RETURN == -1) {
> +		tst_res(TFAIL | TERRNO, "flistxattr() failed");
> +		return;
> +	}
> +
> +	if (check_suitable_buf(file, TEST_RETURN))
> +		tst_res(TPASS, "flistxattr() succeed with suitable buffer");
> +	else
> +		tst_res(TFAIL, "flistxattr() failed with small buffer");
> +}
> +
> +static void setup(void)
> +{
> +	int ret;
> +
> +	fd[0] = SAFE_OPEN("testfile1", O_RDWR | O_CREAT, 0644);
> +
> +	fd[1] = SAFE_OPEN("testfile2", O_RDWR | O_CREAT, 0644);
> +
> +	ret = fsetxattr(fd[1], SECURITY_KEY, VALUE, VALUE_SIZE, XATTR_CREATE);
> +	if (ret == -1) {
> +		if (errno == ENOTSUP) {
> +			tst_brk(TCONF, "no xattr support in fs or "
> +				 "mounted without user_xattr option");
> +		} else {
> +			tst_brk(TBROK | TERRNO, "fsetxattr() failed");

Again no need for the else branch.

> +		}
> +	}
> +}
> +
> +static void cleanup(void)
> +{
> +	if (fd[0] > 0 && close(fd[0]))
> +		tst_res(TWARN | TERRNO, "failed to close file");
> +	if (fd[1] > 0 && close(fd[1]))
> +		tst_res(TWARN | TERRNO, "failed to close file");
> +}
> +
> +static struct tst_test test = {
> +	.tid = "flistxattr03",
> +	.needs_tmpdir = 1,
> +	.needs_root = 1,
> +	.test = verify_flistxattr,
> +	.tcnt = ARRAY_SIZE(fd),
> +	.setup = setup,
> +	.cleanup = cleanup,
> +};
> +
> +#else /* HAVE_SYS_XATTR_H */
> +	TST_TEST_TCONF("<sys/xattr.h> does not exist.");
> +#endif
> diff --git a/testcases/kernel/syscalls/listxattr/Makefile b/testcases/kernel/syscalls/listxattr/Makefile
> new file mode 100644
> index 0000000..ed05a48
> --- /dev/null
> +++ b/testcases/kernel/syscalls/listxattr/Makefile
> @@ -0,0 +1,23 @@
> +#
> +#  Copyright (c) 2016 Fujitsu Ltd.
> +#  Author: Xiao Yang <yangx.jy@cn.fujitsu.com>

Here again, update the copyright line.

> +#  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.
> +#
> +
> +top_srcdir		?= ../../../..
> +
> +include $(top_srcdir)/include/mk/testcases.mk
> +
> +include $(top_srcdir)/include/mk/generic_leaf_target.mk
> diff --git a/testcases/kernel/syscalls/listxattr/listxattr01.c b/testcases/kernel/syscalls/listxattr/listxattr01.c
> new file mode 100644
> index 0000000..3159a7b
> --- /dev/null
> +++ b/testcases/kernel/syscalls/listxattr/listxattr01.c
> @@ -0,0 +1,115 @@
> +/*
> +* Copyright (c) 2016 Fujitsu Ltd.
> +* Author: Xiao Yang <yangx.jy@cn.fujitsu.com>
> +*
> +* This program is free software; you can redistribute it and/or modify it
> +* under the terms of version 2 of the GNU General Public License as
> +* published by the Free Software Foundation.
> +*
> +* This program is distributed in the hope that it would be useful, but
> +* WITHOUT ANY WARRANTY; without even the implied warranty of
> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> +*
> +* You should have received a copy of the GNU General Public License
> +* alone with this program.
> +*/
> +
> +/*
> +* Test Name: listxattr01
> +*
> +* Description:
> +* The testcase checks the basic functionality of the listxattr(2).
> +* listxattr(2) retrieves the list of extended attribute names
> +* associated with the file itself in the filesystem.
> +*
> +*/
> +
> +#include "config.h"
> +#include <errno.h>
> +#include <sys/types.h>
> +#include <string.h>
> +
> +#ifdef HAVE_SYS_XATTR_H
> +# include <sys/xattr.h>
> +#endif
> +
> +#include "tst_test.h"
> +
> +#ifdef HAVE_SYS_XATTR_H
> +
> +#define SECURITY_KEY1	"security.ltptest1"
> +#define VALUE	"test"
> +#define VALUE_SIZE	4
                        ^
			(sizeof(VALUE) - 1)

> +#define KEY_SIZE    17
                       (sizeof(SECURITY_KEY1) - 1)
> +
> +static void set_xattr(const char *path, const char *key)
> +{
> +	int n;
> +
> +	n = setxattr(path, key, VALUE, VALUE_SIZE, XATTR_CREATE);
> +	if (n == -1) {
> +		if (errno == ENOTSUP) {
> +			tst_brk(TCONF,
> +				 "no xattr support in fs or mounted "
> +				 "without user_xattr option");
> +		}
> +
> +		if (errno == EEXIST) {
> +			tst_brk(TBROK, "exist attribute %s", key);
> +		} else {
> +			tst_brk(TBROK | TERRNO,
> +				 "setxattr() failed");
> +		}

Here again, why do we treat EEXIST differently?

> +	}
> +}
> +
> +static int has_attribute(const char *list, int llen, const char *attr)
> +{
> +	int i;
> +
> +	for (i = 0; i < llen; i += strlen(list + i) + 1) {
> +		if (!strcmp(list + i, attr))
> +			return 1;
> +	}
> +	return 0;
> +}
> +
> +static void verify_listxattr(void)
> +{
> +	int size = 64;
> +	char buf[size];
> +
> +	TEST(listxattr("testfile", buf, size));
> +	if (TEST_RETURN == -1) {
> +		tst_res(TFAIL | TERRNO, "listxattr() failed");
> +		return;
> +	}
> +
> +	if (!has_attribute(buf, size, SECURITY_KEY1)) {
> +		tst_res(TFAIL, "missing attribute %s",
> +			 SECURITY_KEY1);
> +		return;
> +	}
> +
> +	tst_res(TPASS, "listxattr() succeeded");
> +}
> +
> +static void setup(void)
> +{
> +	SAFE_TOUCH("testfile", 0644, NULL);
> +
> +	set_xattr("testfile", SECURITY_KEY1);
                    ^
		    This should proabaly be macro:

		    #define TESTFILE "testfile"

> +}
> +
> +static struct tst_test test = {
> +	.tid = "listxattr01",
> +	.needs_tmpdir = 1,
> +	.needs_root = 1,
> +	.test_all = verify_listxattr,
> +	.setup = setup,
> +};
> +
> +#else
> +	TST_TEST_TCONF("<sys/xattr.h> does not exist.");
> +#endif /* HAVE_SYS_XATTR_H */
> +
> diff --git a/testcases/kernel/syscalls/listxattr/listxattr02.c b/testcases/kernel/syscalls/listxattr/listxattr02.c
> new file mode 100644
> index 0000000..328a08e
> --- /dev/null
> +++ b/testcases/kernel/syscalls/listxattr/listxattr02.c
> @@ -0,0 +1,119 @@
> +/*
> +* Copyright (c) 2016 Fujitsu Ltd.
> +* Author: Xiao Yang <yangx.jy@cn.fujitsu.com>

Here again, copyright.

> +* This program is free software; you can redistribute it and/or modify it
> +* under the terms of version 2 of the GNU General Public License as
> +* published by the Free Software Foundation.
> +*
> +* This program is distributed in the hope that it would be useful, but
> +* WITHOUT ANY WARRANTY; without even the implied warranty of
> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> +*
> +* You should have received a copy of the GNU General Public License
> +* alone with this program.
> +*/
> +
> +/*
> +* Test Name: listxattr02
> +*
> +* Description:
> +* 1) listxattr(2) fails if the size of the list buffer is too small
> +* to hold the result.
> +* 2) listxattr(2) fails if path is an empty string.
> +* 3) listxattr(2) fails when attempted to read from a invalid address.
> +* 4) listxattr(2) fails if path is longer than allowed.
> +*
> +* Expected Result:
> +* 1) listxattr(2) should return -1 and set errno to ERANGE.
> +* 2) listxattr(2) should return -1 and set errno to ENOENT.
> +* 3) listxattr(2) should return -1 and set errno to EFAULT.
> +* 4) listxattr(2) should return -1 and set errno to ENAMETOOLONG.
> +*/
> +
> +#include "config.h"
> +#include <errno.h>
> +#include <sys/types.h>
> +
> +#ifdef HAVE_SYS_XATTR_H
> +# include <sys/xattr.h>
> +#endif
> +
> +#include "tst_test.h"
> +
> +#ifdef HAVE_SYS_XATTR_H
> +
> +#define SECURITY_KEY	"security.ltptest"
> +#define VALUE	"test"
> +#define VALUE_SIZE	4
                        ^
			(sizeof(VALUE) - 1)

> +char longpathname[PATH_MAX + 2];
> +
> +static struct test_case {
> +	const char *path;
> +	size_t size;
> +	int exp_err;
> +} tc[] = {
> +	/* test1 */
> +	{"testfile", 1, ERANGE},
> +	/* test2 */
> +	{"", 20, ENOENT},
> +	/* test3 */
> +	{(char *)-1, 20, EFAULT},
> +	/* test4 */

Useless comments.

> +	{longpathname, 20, ENAMETOOLONG}
> +};
> +
> +static void verify_listxattr(unsigned int n)
> +{
> +	struct test_case *t = tc + n;
> +	char buf[t->size];
> +
> +	TEST(listxattr(t->path, buf, t->size));
                                       ^
				       sizeof(buf)
> +	if (TEST_RETURN != -1) {
> +		tst_res(TFAIL, "listxattr() succeeded unexpectedly");

Again do a return; here and the rest of the code does not need to be
inside of an else block.

> +	} else {
> +		if (t->exp_err != TEST_ERRNO) {
> +			tst_res(TFAIL | TTERRNO, "listxattr() failed "
> +				 "unexpectedlly, expected %s",
> +				 tst_strerrno(t->exp_err));
> +		} else {
> +			tst_res(TPASS | TTERRNO,
> +				 "listxattr() failed as expected");
> +		}
> +	}
> +}
> +
> +static void setup(void)
> +{
> +	int n;
> +
> +	SAFE_TOUCH("testfile", 0644, NULL);
> +
> +
> +	n = setxattr("testfile", SECURITY_KEY, VALUE, VALUE_SIZE, XATTR_CREATE);
> +	if (n == -1) {
> +		if (errno == ENOTSUP) {
> +			tst_brk(TCONF, "no xattr support in fs or "
> +				 "mounted without user_xattr option");
> +		} else {
> +			tst_brk(TBROK | TERRNO, "setxattr() failed");
> +		}

Again, no need for the else branch.

> +	}
> +
> +	memset(&longpathname, 'a', sizeof(longpathname) - 1);
> +	longpathname[sizeof(longpathname)] = '\0';

Again off-by-one and no needed.

> +}
> +
> +static struct tst_test test = {
> +	.tid = "listxattr02",
> +	.needs_tmpdir = 1,
> +	.needs_root = 1,
> +	.test = verify_listxattr,
> +	.tcnt = ARRAY_SIZE(tc),
> +	.setup = setup,
> +};
> +
> +#else /* HAVE_SYS_XATTR_H */
> +	TST_TEST_TCONF("<sys/xattr.h> does not exist.");
> +#endif
> diff --git a/testcases/kernel/syscalls/listxattr/listxattr03.c b/testcases/kernel/syscalls/listxattr/listxattr03.c
> new file mode 100644
> index 0000000..91c4876
> --- /dev/null
> +++ b/testcases/kernel/syscalls/listxattr/listxattr03.c
> @@ -0,0 +1,101 @@
> +/*
> +* Copyright (c) 2016 Fujitsu Ltd.
> +* Author: Xiao Yang <yangx.jy@cn.fujitsu.com>

Again, the copyright.

> +* This program is free software; you can redistribute it and/or modify it
> +* under the terms of version 2 of the GNU General Public License as
> +* published by the Free Software Foundation.
> +*
> +* This program is distributed in the hope that it would be useful, but
> +* WITHOUT ANY WARRANTY; without even the implied warranty of
> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> +*
> +* You should have received a copy of the GNU General Public License
> +* alone with this program.
> +*/
> +
> +/*
> +* Test Name: listxattr03
> +*
> +* Description:
> +* An empty buffer of size zero can return the current size of the list
> +* of extended attribute names, which can be used to estimate a suitable buffer.
> +*/
> +
> +#include "config.h"
> +#include <errno.h>
> +#include <sys/types.h>
> +
> +#ifdef HAVE_SYS_XATTR_H
> +#include <sys/xattr.h>
    ^
    should ideally be indented by single space after the #
> +#endif
> +
> +#include "tst_test.h"
> +
> +#ifdef HAVE_SYS_XATTR_H
> +
> +#define SECURITY_KEY	"security.ltptest"
> +#define VALUE	"test"
> +#define VALUE_SIZE	4
                        ^
			(sizeof(VALUE)-1)

> +static const char * const filename[] = {"testfile1", "testfile2"};
> +
> +static int check_suitable_buf(const char *name, long size)
> +{
> +	int n;
> +	char buf[size];
> +
> +	n = listxattr(name, buf, size);
                                  ^
				  sizeof(buf)
> +	if (n == -1)
> +		return 0;
> +	else
> +		return 1;

return n != -1;

> +}
> +
> +static void verify_listxattr(unsigned int n)
> +{
> +	const char *name = filename[n];
> +
> +	TEST(listxattr(name, NULL, 0));
> +	if (TEST_RETURN == -1) {
> +		tst_res(TFAIL | TERRNO, "listxattr() failed");
> +		return;
> +	}
> +
> +	if (check_suitable_buf(name, TEST_RETURN))
> +		tst_res(TPASS, "listxattr() succeed with suitable buffer");
> +	else
> +		tst_res(TFAIL, "listxattr() failed with small buffer");
> +}
> +
> +static void setup(void)
> +{
> +	int ret;
> +
> +	SAFE_TOUCH(filename[0], 0644, NULL);
> +
> +	SAFE_TOUCH(filename[1], 0644, NULL);
> +
> +	ret = setxattr(filename[1], SECURITY_KEY, VALUE, VALUE_SIZE, XATTR_CREATE);
> +	if (ret == -1) {
> +		if (errno == ENOTSUP) {
> +			tst_brk(TCONF, "no xattr support in fs or "
> +				 "mounted without user_xattr option");
> +		} else {
> +			tst_brk(TBROK | TERRNO, "setxattr() failed");

Again no need for the else block.

> +		}
> +	}
> +}
> +
> +static struct tst_test test = {
> +	.tid = "listxattr03",
> +	.needs_tmpdir = 1,
> +	.needs_root = 1,
> +	.test = verify_listxattr,
> +	.tcnt = ARRAY_SIZE(filename),
> +	.setup = setup,
> +};
> +
> +#else /* HAVE_SYS_XATTR_H */
> +	TST_TEST_TCONF("<sys/xattr.h> does not exist.");
> +#endif
> -- 
> 1.9.1
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list