From: Dmitry V. Levin Date: Tue, 10 May 2016 18:18:32 +0000 (+0000) Subject: tests: extend test coverage of xattr family syscalls X-Git-Tag: v4.12~190 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ea7b9dbcbdc5b23f3db12a50c3456502fbed5138;p=strace tests: extend test coverage of xattr family syscalls * tests/xattr.c: Check decoding of all xattr family syscalls. * tests/xattr.test: Use run_strace_match_diff. * tests/xattr.expected: Remove. * tests/Makefile.am (EXTRA_DIST): Remove it. --- diff --git a/tests/Makefile.am b/tests/Makefile.am index ff86d794..9362cda7 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -668,7 +668,6 @@ EXTRA_DIST = init.sh run.sh match.awk \ uio.expected \ umovestr.expected \ wait.expected \ - xattr.expected \ xchownx.c \ xselect.c \ xstatfs.c \ diff --git a/tests/xattr.c b/tests/xattr.c index 7ae13c0d..c7a33423 100644 --- a/tests/xattr.c +++ b/tests/xattr.c @@ -29,17 +29,117 @@ #ifdef HAVE_SYS_XATTR_H +# include +# include # include +# ifndef XATTR_SIZE_MAX +# define XATTR_SIZE_MAX 65536 +# endif + int main(void) { -#define NAME "strace.test" -#define VALUE "foo\0bar" - if (!removexattr(".", NAME)) - error_msg_and_skip("removexattr: error expected"); - if (!setxattr(".", NAME, VALUE, sizeof(VALUE), XATTR_CREATE)) - error_msg_and_skip("setxattr: error expected"); + static const char name[] = "strace.test"; + static const char c_value[] = "foo\0bar"; + static const char q_value[] = "foo\\0bar"; + + tail_alloc(1); + const char *const z_value = tail_memdup(c_value, sizeof(c_value)); + char *const efault = tail_alloc(1) + 1; + const char *const value = tail_memdup(c_value, sizeof(c_value) - 1); + char *const big = tail_alloc(XATTR_SIZE_MAX + 1); + tail_alloc(1); + + assert(fsetxattr(-1, 0, 0, 0, XATTR_CREATE) == -1); + printf("fsetxattr(-1, NULL, NULL, 0, XATTR_CREATE) = -1 %s (%m)\n", + errno2name()); + + assert(fsetxattr(-1, 0, z_value, 0, XATTR_CREATE) == -1); + printf("fsetxattr(-1, NULL, \"\", 0, XATTR_CREATE) = -1 %s (%m)\n", + errno2name()); + + assert(fsetxattr(-1, name, big, XATTR_SIZE_MAX + 1, XATTR_CREATE) == -1); + printf("fsetxattr(-1, \"%s\", %p, %u, XATTR_CREATE)" + " = -1 %s (%m)\n", + name, big, XATTR_SIZE_MAX + 1, errno2name()); + + assert(fsetxattr(-1, name, value, sizeof(c_value), XATTR_CREATE) == -1); + printf("fsetxattr(-1, \"%s\", %p, %u, XATTR_CREATE)" + " = -1 %s (%m)\n", + name, value, (unsigned) sizeof(c_value), errno2name()); + + assert(fsetxattr(-1, name, z_value, sizeof(c_value), XATTR_REPLACE) == -1); + printf("fsetxattr(-1, \"%s\", \"%s\", %u, XATTR_REPLACE)" + " = -1 %s (%m)\n", + name, q_value, (unsigned) sizeof(c_value), errno2name()); + + assert(fsetxattr(-1, name, value, sizeof(c_value) - 1, XATTR_CREATE|XATTR_REPLACE) == -1); + printf("fsetxattr(-1, \"%s\", \"%s\", %u, XATTR_CREATE|XATTR_REPLACE)" + " = -1 %s (%m)\n", + name, q_value, (unsigned) sizeof(c_value) - 1, errno2name()); + + assert(setxattr(".", name, z_value, sizeof(c_value), XATTR_CREATE) == -1); + printf("setxattr(\".\", \"%s\", \"%s\", %u, XATTR_CREATE)" + " = -1 %s (%m)\n", + name, q_value, (unsigned) sizeof(c_value), errno2name()); + + assert(lsetxattr(".", name, value, sizeof(c_value) - 1, XATTR_CREATE) == -1); + printf("lsetxattr(\".\", \"%s\", \"%s\", %u, XATTR_CREATE)" + " = -1 %s (%m)\n", + name, q_value, (unsigned) sizeof(c_value) - 1, errno2name()); + + assert(fgetxattr(-1, name, efault, 4) == -1); + printf("fgetxattr(-1, \"%s\", %p, 4) = -1 %s (%m)\n", + name, efault, errno2name()); + + assert(getxattr(".", name, big, XATTR_SIZE_MAX + 1) == -1); + printf("getxattr(\".\", \"%s\", %p, %u) = -1 %s (%m)\n", + name, big, XATTR_SIZE_MAX + 1, errno2name()); + + assert(lgetxattr(".", name, big + 1, XATTR_SIZE_MAX) == -1); + printf("lgetxattr(\".\", \"%s\", %p, %u) = -1 %s (%m)\n", + name, big + 1, XATTR_SIZE_MAX, errno2name()); + + assert(flistxattr(-1, efault, 4) == -1); + printf("flistxattr(-1, %p, 4) = -1 %s (%m)\n", + efault, errno2name()); + + assert(llistxattr("", efault + 1, 4) == -1); + printf("llistxattr(\"\", %p, 4) = -1 %s (%m)\n", + efault + 1, errno2name()); + + ssize_t rc = listxattr(".", big, 0); + if (rc < 0) + printf("listxattr(\".\", %p, 0) = -1 %s (%m)\n", + big, errno2name()); + else + printf("listxattr(\".\", %p, 0) = %ld\n", + big, (long) rc); + + rc = listxattr(".", big, XATTR_SIZE_MAX + 1); + if (rc < 0) + printf("listxattr(\".\", %p, %u) = -1 %s (%m)\n", + big, XATTR_SIZE_MAX + 1, errno2name()); + else { + printf("listxattr(\".\", \""); + print_quoted_memory(big, rc); + printf("\", %u) = %ld\n", XATTR_SIZE_MAX + 1, (long) rc); + } + + assert(fremovexattr(-1, name) == -1); + printf("fremovexattr(-1, \"%s\") = -1 %s (%m)\n", + name, errno2name()); + + assert(removexattr(".", name) == -1); + printf("removexattr(\".\", \"%s\") = -1 %s (%m)\n", + name, errno2name()); + + assert(lremovexattr(".", name) == -1); + printf("lremovexattr(\".\", \"%s\") = -1 %s (%m)\n", + name, errno2name()); + + puts("+++ exited with 0 +++"); return 0; } diff --git a/tests/xattr.expected b/tests/xattr.expected deleted file mode 100644 index 0179a17d..00000000 --- a/tests/xattr.expected +++ /dev/null @@ -1,2 +0,0 @@ -removexattr\("\.", "strace\.test"\) += -1 .* -setxattr\("\.", "strace\.test", "foo\\0bar", 8, XATTR_CREATE\) += -1 .* diff --git a/tests/xattr.test b/tests/xattr.test index 613352b6..8c7a87b9 100755 --- a/tests/xattr.test +++ b/tests/xattr.test @@ -4,8 +4,9 @@ . "${srcdir=.}/init.sh" -run_prog -run_strace -e removexattr,setxattr $args -match_grep +syscalls= +for n in getxattr setxattr listxattr removexattr; do + syscalls="$syscalls,${n},f${n},l${n}" +done -exit 0 +run_strace_match_diff -a22 -e trace=$syscalls