* [LTP] [PATCH v2 0/2] Listxattr related calls: new tests and testcase
@ 2016-10-10 15:39 Dejan Jovicevic
2016-10-10 15:40 ` [LTP] [PATCH v2 1/2] llistxattr: added a new test case to llistxattr02 Dejan Jovicevic
2016-10-10 15:40 ` [LTP] [PATCH v2 2/2] flistxattr and listxattr: added tests Dejan Jovicevic
0 siblings, 2 replies; 5+ messages in thread
From: Dejan Jovicevic @ 2016-10-10 15:39 UTC (permalink / raw)
To: ltp
v1 -> v2:
- Modified the setup for the new testcase in llistxattr02 and
a testcase in listxattr02.
- Modified commit messages.
In this series, there is a new testcase added in the existing llistxattr02
test. Also, new tests are added for system calls flistxattr(), and listxattr()
which are based on the existing tests for llistxattr.
Dejan Jovicevic (2):
llistxattr: added a new test case to llistxattr02
flistxattr and listxattr: added tests
runtest/syscalls | 8 ++
testcases/kernel/syscalls/.gitignore | 6 +
testcases/kernel/syscalls/flistxattr/Makefile | 23 ++++
.../kernel/syscalls/flistxattr/flistxattr01.c | 124 +++++++++++++++++++++
.../kernel/syscalls/flistxattr/flistxattr02.c | 116 +++++++++++++++++++
.../kernel/syscalls/flistxattr/flistxattr03.c | 111 ++++++++++++++++++
testcases/kernel/syscalls/listxattr/Makefile | 23 ++++
testcases/kernel/syscalls/listxattr/listxattr01.c | 115 +++++++++++++++++++
testcases/kernel/syscalls/listxattr/listxattr02.c | 119 ++++++++++++++++++++
testcases/kernel/syscalls/listxattr/listxattr03.c | 101 +++++++++++++++++
.../kernel/syscalls/llistxattr/llistxattr02.c | 11 +-
11 files changed, 756 insertions(+), 1 deletion(-)
create mode 100644 testcases/kernel/syscalls/flistxattr/Makefile
create mode 100644 testcases/kernel/syscalls/flistxattr/flistxattr01.c
create mode 100644 testcases/kernel/syscalls/flistxattr/flistxattr02.c
create mode 100644 testcases/kernel/syscalls/flistxattr/flistxattr03.c
create mode 100644 testcases/kernel/syscalls/listxattr/Makefile
create mode 100644 testcases/kernel/syscalls/listxattr/listxattr01.c
create mode 100644 testcases/kernel/syscalls/listxattr/listxattr02.c
create mode 100644 testcases/kernel/syscalls/listxattr/listxattr03.c
--
1.9.1
^ permalink raw reply [flat|nested] 5+ messages in thread* [LTP] [PATCH v2 1/2] llistxattr: added a new test case to llistxattr02 2016-10-10 15:39 [LTP] [PATCH v2 0/2] Listxattr related calls: new tests and testcase Dejan Jovicevic @ 2016-10-10 15:40 ` Dejan Jovicevic 2016-10-11 9:51 ` Cyril Hrubis 2016-10-10 15:40 ` [LTP] [PATCH v2 2/2] flistxattr and listxattr: added tests Dejan Jovicevic 1 sibling, 1 reply; 5+ messages in thread From: Dejan Jovicevic @ 2016-10-10 15:40 UTC (permalink / raw) To: ltp v1 -> v2: - Using memset() for initializing the longpathname buffer. - Modified commit message. Added a test case that checks if the path name, given by the first argument of the function, is too long. If that is the case, the function should return -1 and errno should be set to ENAMETOOLONG. Signed-off-by: Dejan Jovicevic <dejan.jovicevic@rt-rk.com> --- testcases/kernel/syscalls/llistxattr/llistxattr02.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/testcases/kernel/syscalls/llistxattr/llistxattr02.c b/testcases/kernel/syscalls/llistxattr/llistxattr02.c index ec4ba6e..98f0d7b 100644 --- a/testcases/kernel/syscalls/llistxattr/llistxattr02.c +++ b/testcases/kernel/syscalls/llistxattr/llistxattr02.c @@ -22,11 +22,13 @@ * to hold the result. * 2) llistxattr(2) fails if path is an empty string. * 3) llistxattr(2) fails when attempted to read from a invalid address. +* 4) llistxattr(2) fails if path is longer than allowed. * * Expected Result: * 1) llistxattr(2) should return -1 and set errno to ERANGE. * 2) llistxattr(2) should return -1 and set errno to ENOENT. * 3) llistxattr(2) should return -1 and set errno to EFAULT. +* 4) llistxattr(2) should return -1 and set errno to ENAMETOOLONG. */ #include "config.h" @@ -45,6 +47,8 @@ #define VALUE "test" #define VALUE_SIZE 4 +char longpathname[PATH_MAX + 2]; + static struct test_case { const char *path; size_t size; @@ -55,7 +59,9 @@ static struct test_case { /* test2 */ {"", 20, ENOENT}, /* test3 */ - {(char *)-1, 20, EFAULT} + {(char *)-1, 20, EFAULT}, + /* test4 */ + {longpathname, 20, ENAMETOOLONG} }; static void verify_llistxattr(unsigned int n) @@ -95,6 +101,9 @@ static void setup(void) tst_brk(TBROK | TERRNO, "lsetxattr() failed"); } } + + memset(&longpathname, 'a', sizeof(longpathname) - 1); + longpathname[sizeof(longpathname)] = '\0'; } static struct tst_test test = { -- 1.9.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [LTP] [PATCH v2 1/2] llistxattr: added a new test case to llistxattr02 2016-10-10 15:40 ` [LTP] [PATCH v2 1/2] llistxattr: added a new test case to llistxattr02 Dejan Jovicevic @ 2016-10-11 9:51 ` Cyril Hrubis 0 siblings, 0 replies; 5+ messages in thread From: Cyril Hrubis @ 2016-10-11 9:51 UTC (permalink / raw) To: ltp Hi! > static void verify_llistxattr(unsigned int n) > @@ -95,6 +101,9 @@ static void setup(void) > tst_brk(TBROK | TERRNO, "lsetxattr() failed"); > } > } > + > + memset(&longpathname, 'a', sizeof(longpathname) - 1); > + longpathname[sizeof(longpathname)] = '\0'; This is off-by-one, the last array element is at sizeof(longpathname)-1. Also this is not needed since the array is global, hence initialized to 0 and we fill first n-1 elements with the memset() leaving the last one to be the '\0'. > } > > static struct tst_test test = { > -- > 1.9.1 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp -- Cyril Hrubis chrubis@suse.cz ^ permalink raw reply [flat|nested] 5+ messages in thread
* [LTP] [PATCH v2 2/2] flistxattr and listxattr: added tests 2016-10-10 15:39 [LTP] [PATCH v2 0/2] Listxattr related calls: new tests and testcase Dejan Jovicevic 2016-10-10 15:40 ` [LTP] [PATCH v2 1/2] llistxattr: added a new test case to llistxattr02 Dejan Jovicevic @ 2016-10-10 15:40 ` Dejan Jovicevic 2016-10-11 10:38 ` Cyril Hrubis 1 sibling, 1 reply; 5+ messages in thread From: Dejan Jovicevic @ 2016-10-10 15:40 UTC (permalink / raw) To: ltp v1 -> v2: - Using memset() for initializing the longpathname buffer in listxattr02. - Modified commit message. Tests for these two system calls were not present. flistxattr(), listxattr() and llistxattr() are identical, the only difference is in the first argument: - in listxattr() it refers to the file in the path. - in llistxattr() in the case of a symbolic link, the list of names of extended attributes associated with the link itself is retrieved, not the file that it refers to. - in flistxattr() the open file referred to by fd is interrogated in place of path. Because of these similarities, implemented tests for flistxattr() and listxattr() are based on the existing tests for llistxattr(), with some adjustments to fit the appropriate system call. Signed-off-by: Dejan Jovicevic <dejan.jovicevic@rt-rk.com> --- runtest/syscalls | 8 ++ testcases/kernel/syscalls/.gitignore | 6 + testcases/kernel/syscalls/flistxattr/Makefile | 23 ++++ .../kernel/syscalls/flistxattr/flistxattr01.c | 124 +++++++++++++++++++++ .../kernel/syscalls/flistxattr/flistxattr02.c | 116 +++++++++++++++++++ .../kernel/syscalls/flistxattr/flistxattr03.c | 111 ++++++++++++++++++ testcases/kernel/syscalls/listxattr/Makefile | 23 ++++ testcases/kernel/syscalls/listxattr/listxattr01.c | 115 +++++++++++++++++++ testcases/kernel/syscalls/listxattr/listxattr02.c | 119 ++++++++++++++++++++ testcases/kernel/syscalls/listxattr/listxattr03.c | 101 +++++++++++++++++ 10 files changed, 746 insertions(+) create mode 100644 testcases/kernel/syscalls/flistxattr/Makefile create mode 100644 testcases/kernel/syscalls/flistxattr/flistxattr01.c create mode 100644 testcases/kernel/syscalls/flistxattr/flistxattr02.c create mode 100644 testcases/kernel/syscalls/flistxattr/flistxattr03.c create mode 100644 testcases/kernel/syscalls/listxattr/Makefile create mode 100644 testcases/kernel/syscalls/listxattr/listxattr01.c create mode 100644 testcases/kernel/syscalls/listxattr/listxattr02.c create mode 100644 testcases/kernel/syscalls/listxattr/listxattr03.c diff --git a/runtest/syscalls b/runtest/syscalls index 01839e8..009c2db 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -272,6 +272,10 @@ fcntl34_64 fcntl34_64 fdatasync01 fdatasync01 fdatasync02 fdatasync02 +flistxattr01 flistxattr01 +flistxattr02 flistxattr02 +flistxattr03 flistxattr03 + flock01 flock01 flock02 flock02 flock03 flock03 @@ -523,6 +527,10 @@ linkat02 linkat02 listen01 listen01 +listxattr01 listxattr01 +listxattr02 listxattr02 +listxattr03 listxattr03 + llistxattr01 llistxattr01 llistxattr02 llistxattr02 llistxattr03 llistxattr03 diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore index a13dbb3..408dc88 100644 --- a/testcases/kernel/syscalls/.gitignore +++ b/testcases/kernel/syscalls/.gitignore @@ -233,6 +233,9 @@ /fcntl/fcntl34_64 /fdatasync/fdatasync01 /fdatasync/fdatasync02 +/flistxattr/flistxattr01 +/flistxattr/flistxattr02 +/flistxattr/flistxattr03 /flock/flock01 /flock/flock02 /flock/flock03 @@ -482,6 +485,9 @@ /linkat/linkat01 /linkat/linkat02 /listen/listen01 +/listxattr/listxattr01 +/listxattr/listxattr02 +/listxattr/listxattr03 /llistxattr/llistxattr01 /llistxattr/llistxattr02 /llistxattr/llistxattr03 diff --git a/testcases/kernel/syscalls/flistxattr/Makefile b/testcases/kernel/syscalls/flistxattr/Makefile new file mode 100644 index 0000000..ed05a48 --- /dev/null +++ b/testcases/kernel/syscalls/flistxattr/Makefile @@ -0,0 +1,23 @@ +# +# 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 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/flistxattr/flistxattr01.c b/testcases/kernel/syscalls/flistxattr/flistxattr01.c new file mode 100644 index 0000000..75eb4db --- /dev/null +++ b/testcases/kernel/syscalls/flistxattr/flistxattr01.c @@ -0,0 +1,124 @@ +/* +* 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: verify_flistxattr01 +* +* Description: +* The testcase checks the basic functionality of the flistxattr(2). +* flistxattr(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 +#define KEY_SIZE 17 + +int fd; + +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"); + } + } +} + +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]; + + TEST(flistxattr(fd, buf, size)); + if (TEST_RETURN == -1) { + tst_res(TFAIL | TERRNO, "flistxattr() failed"); + 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> +* +* 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 + +static int fd1; +static int fd2; + +static struct test_case { + int *fd; + size_t size; + int exp_err; +} tc[] = { + /* test1 */ + {&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) { + tst_res(TFAIL, "flistxattr() succeeded unexpectedly"); + } 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; + + 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"); + } + } +} + +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 + +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); + if (n == -1) + return 0; + else + return 1; +} + +static void verify_flistxattr(unsigned int n) +{ + const int file = fd[n]; + + 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"); + } + } +} + +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> +# +# 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 +#define KEY_SIZE 17 + +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"); + } + } +} + +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); +} + +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> +* +* 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 + +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 */ + {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)); + if (TEST_RETURN != -1) { + tst_res(TFAIL, "listxattr() succeeded unexpectedly"); + } 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"); + } + } + + memset(&longpathname, 'a', sizeof(longpathname) - 1); + longpathname[sizeof(longpathname)] = '\0'; +} + +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> +* +* 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> +#endif + +#include "tst_test.h" + +#ifdef HAVE_SYS_XATTR_H + +#define SECURITY_KEY "security.ltptest" +#define VALUE "test" +#define VALUE_SIZE 4 + +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); + if (n == -1) + return 0; + else + return 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"); + } + } +} + +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 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [LTP] [PATCH v2 2/2] flistxattr and listxattr: added tests 2016-10-10 15:40 ` [LTP] [PATCH v2 2/2] flistxattr and listxattr: added tests Dejan Jovicevic @ 2016-10-11 10:38 ` Cyril Hrubis 0 siblings, 0 replies; 5+ messages in thread From: Cyril Hrubis @ 2016-10-11 10:38 UTC (permalink / raw) To: ltp 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 ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-10-11 10:38 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-10-10 15:39 [LTP] [PATCH v2 0/2] Listxattr related calls: new tests and testcase Dejan Jovicevic 2016-10-10 15:40 ` [LTP] [PATCH v2 1/2] llistxattr: added a new test case to llistxattr02 Dejan Jovicevic 2016-10-11 9:51 ` Cyril Hrubis 2016-10-10 15:40 ` [LTP] [PATCH v2 2/2] flistxattr and listxattr: added tests Dejan Jovicevic 2016-10-11 10:38 ` Cyril Hrubis
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox