[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