[PATCH v8] Implement decoding of ustat syscall
Dmitry V. Levin
ldv at altlinux.org
Sat Jan 14 23:55:43 UTC 2017
On Sat, Jan 14, 2017 at 09:45:11PM +0800, JingPiao Chen wrote:
> * ustat.c: New file.
> * configure.ac (AC_CHECK_HEADERS): Add ustat.h.
> * Makefile.am (strace_SOURCES): Add it.
Add what?
> * linux/dummy.h: Remove.
> * tests/ustat.c: New file.
> * tests/ustat.test: New test.
> * tests/.gitignore: Add ustat.
> * tests/Makefile.am (check_PROGRAMS): Likewise.
> (DECODER_TESTS): Add ustat.test.
> ---
> Makefile.am | 1 +
> configure.ac | 1 +
> linux/dummy.h | 1 -
> tests/.gitignore | 1 +
> tests/Makefile.am | 2 ++
> tests/ustat.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/ustat.test | 6 ++++
> ustat.c | 55 ++++++++++++++++++++++++++++++++++++
> 8 files changed, 149 insertions(+), 1 deletion(-)
> create mode 100644 tests/ustat.c
> create mode 100755 tests/ustat.test
> create mode 100644 ustat.c
>
> diff --git a/Makefile.am b/Makefile.am
> index 3369e1e..f50e311 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -247,6 +247,7 @@ strace_SOURCES = \
> umount.c \
> uname.c \
> userfaultfd.c \
> + ustat.c \
> util.c \
> utime.c \
> utimes.c \
> diff --git a/configure.ac b/configure.ac
> index 8fc35a8..9b7ce19 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -396,6 +396,7 @@ AC_CHECK_HEADERS(m4_normalize([
> sys/shm.h
> sys/signalfd.h
> sys/xattr.h
> + ustat.h
> ]))
>
> AC_CHECK_HEADERS([asm/sigcontext.h],,, [#include <signal.h>])
> diff --git a/linux/dummy.h b/linux/dummy.h
> index 0aee35b..2758cfb 100644
> --- a/linux/dummy.h
> +++ b/linux/dummy.h
> @@ -156,7 +156,6 @@
> #define sys_timerfd printargs
> #define sys_tuxcall printargs
> #define sys_ulimit printargs
> -#define sys_ustat printargs
> #define sys_vserver printargs
>
> /* deprecated */
> diff --git a/tests/.gitignore b/tests/.gitignore
> index cec446e..f0c9e93 100644
> --- a/tests/.gitignore
> +++ b/tests/.gitignore
> @@ -357,6 +357,7 @@ unlink
> unlinkat
> unshare
> userfaultfd
> +ustat
> utime
> utimensat
> utimes
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 8c7cdd0..d1c13d8 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -414,6 +414,7 @@ check_PROGRAMS = \
> unlinkat \
> unshare \
> userfaultfd \
> + ustat \
> utime \
> utimensat \
> utimes \
> @@ -800,6 +801,7 @@ DECODER_TESTS = \
> unlinkat.test \
> unshare.test \
> userfaultfd.test \
> + ustat.test \
> utime.test \
> utimensat.test \
> utimes.test \
> diff --git a/tests/ustat.c b/tests/ustat.c
> new file mode 100644
> index 0000000..99f1f9d
> --- /dev/null
> +++ b/tests/ustat.c
> @@ -0,0 +1,83 @@
> +/*
> + * Copyright (c) 2017 JingPiao Chen <chenjingpiao at gmail.com>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. The name of the author may not be used to endorse or promote products
> + * derived from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include "tests.h"
> +#include <asm/unistd.h>
> +
> +#ifdef __NR_ustat
> +
> +# include <stdio.h>
> +# include <sys/stat.h>
> +# include <sys/sysmacros.h>
> +# include <unistd.h>
> +# ifdef HAVE_USTAT_H
> +# include <ustat.h>
> +# endif
> +
> +int
> +main(void)
> +{
> + kernel_ulong_t magic = (kernel_ulong_t) 0xfacefeedffffffff;
> + unsigned int dev;
> + long rc;
> +
> +#ifdef HAVE_USTAT_H
> + struct ustat *ust = tail_alloc(sizeof(*ust));
> + struct stat st;
> + if (stat(".", &st) == -1)
> + perror_msg_and_fail("stat");
> + dev = (unsigned int) st.st_dev;
> + rc = syscall(__NR_ustat, dev, ust);
> + if (rc == -1)
> + printf("ustat(makedev(%u, %u), %p) = %s\n",
> + major(dev), minor(dev), ust, sprintrc(rc));
> + else
> + printf("ustat(makedev(%u, %u)"
> + ", {f_tfree=%llu, f_tinode=%llu}) = %s\n",
> + major(dev), minor(dev),
> + zero_extend_signed_to_ull(ust->f_tfree),
> + zero_extend_signed_to_ull(ust->f_tinode), sprintrc(rc));
Let's check against 0 instead:
if (rc)
printf("ustat(makedev(%u, %u), %p) = %s\n",
major(dev), minor(dev), ust, sprintrc(rc));
else
printf("ustat(makedev(%u, %u)"
", {f_tfree=%llu, f_tinode=%llu}) = 0\n",
major(dev), minor(dev),
zero_extend_signed_to_ull(ust->f_tfree),
zero_extend_signed_to_ull(ust->f_tinode));
> +#endif /* HAVE_USTAT_H */
> +
> + dev = (unsigned int) magic;
> + rc = syscall(__NR_ustat, magic, 0);
> + printf("ustat(makedev(%u, %u), NULL) = %s\n",
> + major(dev), minor(dev), sprintrc(rc));
> +
> + rc = syscall(__NR_ustat, magic, (void *) magic);
> + printf("ustat(makedev(%u, %u), %p) = %s\n",
> + major(dev), minor(dev), (void *) magic, sprintrc(rc));
Why are you reusing magic as a pointer?
Let's provide a valid buffer instead, e.g.
unsigned long long buf[4];
btw, "(void *) magic" might be diagnosed as a cast to pointer from integer
of different size on some systems.
> +
> + puts("+++ exited with 0 +++");
> + return 0;
> +}
> +
> +#else
> +
> +SKIP_MAIN_UNDEFINED("__NR_ustat")
> +
> +#endif
> diff --git a/tests/ustat.test b/tests/ustat.test
> new file mode 100755
> index 0000000..e6c800d
> --- /dev/null
> +++ b/tests/ustat.test
> @@ -0,0 +1,6 @@
> +#!/bin/sh
> +
> +# Check ustat syscall decoding.
> +
> +. "${srcdir=.}/init.sh"
> +run_strace_match_diff -a36
> diff --git a/ustat.c b/ustat.c
> new file mode 100644
> index 0000000..19478dd
> --- /dev/null
> +++ b/ustat.c
> @@ -0,0 +1,55 @@
> +/*
> + * Copyright (c) 2017 JingPiao Chen <chenjingpiao at gmail.com>
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. The name of the author may not be used to endorse or promote products
> + * derived from this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#include "defs.h"
> +#ifdef HAVE_USTAT_H
> +# include DEF_MPERS_TYPE(struct_ustat)
> +# include <ustat.h>
> +typedef struct ustat struct_ustat;
> +# include MPERS_DEFS
> +#endif /* HAVE_USTAT_H */
Does it build for you at all? I see the following build error:
mpers-mx32/struct_ustat.c:29:0: error: unterminated #ifdef
#ifdef HAVE_USTAT_H
make: *** [mpers-mx32.stamp] Error 1
mpers-m32/struct_ustat.c:29:0: error: unterminated #ifdef
#ifdef HAVE_USTAT_H
make: *** [mpers-m32.stamp] Error 1
In short, you cannot have #include MPERS_DEFS inside an #ifdef condition.
> +
> +SYS_FUNC(ustat)
> +{
> + if (entering(tcp))
> + print_dev_t((unsigned int) tcp->u_arg[0]);
> + else {
> + tprints(", ");
> +#ifdef HAVE_USTAT_H
> + struct_ustat ust;
> +
> + if (!umove_or_printaddr(tcp, tcp->u_arg[1], &ust))
> + tprintf("{f_tfree=%llu, f_tinode=%llu}",
> + zero_extend_signed_to_ull(ust.f_tfree),
> + zero_extend_signed_to_ull(ust.f_tinode));
> +#else /* !HAVE_USTAT_H */
> + printaddr(tcp->u_arg[1]);
> +#endif /* HAVE_USTAT_H */
> + }
> +
> + return 0;
> +}
--
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20170115/143fd604/attachment.bin>
More information about the Strace-devel
mailing list