[PATCH] tests: check decoding of LOOP_* ioctls

Dmitry V. Levin ldv at altlinux.org
Mon Dec 26 23:03:27 UTC 2016


On Fri, Dec 23, 2016 at 08:16:16AM +0800, JingPiao Chen wrote:
> >No, the formatting is broken all the same.
> Sorry, my mistake.
> >From e6bfa146fdd5c5eef9d317dffec93023889bd697 Mon Sep 17 00:00:00 2001
> From: JingPiao Chen <chenjingpiao at gmail.com>
> Date: Fri, 23 Dec 2016 08:10:43 +0800
> Subject: [PATCH] tests: check decoding of LOOP_* ioctls
> 
> * tests/ioctl_loop.c: New file.
> * tests/ioctl_loop-v.c: Likewise.
> * tests/ioctl_loop.test: New test.
> * tests/ioctl_loop-v.test: Likewise.
> * tests/.gitignore: Add ioctl_loop and ioctl_loop-v.
> * tests/Makefile.am (check_PROGRAMS): Likewise.
> (DECODER_TESTS): Add ioctl_loop.test and ioctl_loop-v.test.
> ---
>  tests/.gitignore        |   2 +
>  tests/Makefile.am       |   4 ++
>  tests/ioctl_loop-v.c    |   2 +
>  tests/ioctl_loop-v.test |  12 ++++
>  tests/ioctl_loop.c      | 184
> ++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/ioctl_loop.test   |  12 ++++
>  6 files changed, 216 insertions(+)
>  create mode 100644 tests/ioctl_loop-v.c
>  create mode 100755 tests/ioctl_loop-v.test
>  create mode 100644 tests/ioctl_loop.c
>  create mode 100755 tests/ioctl_loop.test
> 
> diff --git a/tests/.gitignore b/tests/.gitignore
> index 3b04590..9bae964 100644
> --- a/tests/.gitignore
> +++ b/tests/.gitignore
> @@ -116,6 +116,8 @@ ioctl
>  ioctl_block
>  ioctl_dm
>  ioctl_dm-v
> +ioctl_loop
> +ioctl_loop
>  ioctl_evdev
>  ioctl_evdev-v
>  ioctl_mtd
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 7a8b411..6db35aa 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -176,6 +176,8 @@ check_PROGRAMS = \
>   inotify_init1 \
>   ioctl \
>   ioctl_block \
> + ioctl_loop \
> + ioctl_loop-v \
>   ioctl_dm \
>   ioctl_dm-v \
>   ioctl_evdev \
> @@ -568,6 +570,8 @@ DECODER_TESTS = \
>   ioctl_block.test \
>   ioctl_dm.test \
>   ioctl_dm-v.test \
> + ioctl_loop.test \
> + ioctl_loop-v.test \
>   ioctl_evdev.test \
>   ioctl_evdev-v.test \
>   ioctl_mtd.test \
> diff --git a/tests/ioctl_loop-v.c b/tests/ioctl_loop-v.c
> new file mode 100644
> index 0000000..22e7572
> --- /dev/null
> +++ b/tests/ioctl_loop-v.c
> @@ -0,0 +1,2 @@
> +#define VERBOSE 1
> +#include "ioctl_loop.c"
> diff --git a/tests/ioctl_loop-v.test b/tests/ioctl_loop-v.test
> new file mode 100755
> index 0000000..7faa859
> --- /dev/null
> +++ b/tests/ioctl_loop-v.test
> @@ -0,0 +1,12 @@
> +#!/bin/sh
> +
> +# Check verbose decoding LOOP_* ioctls.
> +
> +. "${srcdir=.}/init.sh"
> +
> +run_prog > /dev/null
> +run_strace -a22 -veioctl $args > "$EXP"
> +check_prog grep
> +grep -v '^ioctl([012],' < "$LOG" > "$OUT"
> +match_diff "$OUT" "$EXP"
> +rm -f "$EXP" "$OUT"
> diff --git a/tests/ioctl_loop.c b/tests/ioctl_loop.c
> new file mode 100644
> index 0000000..323468a
> --- /dev/null
> +++ b/tests/ioctl_loop.c
> @@ -0,0 +1,184 @@
> +/*
> + * This file is part of ioctl_loop strace test.
> + *
> + * Copyright (c) 2016 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 <stdio.h>
> +#include <string.h>
> +#include <inttypes.h>
> +#include <sys/ioctl.h>
> +#include <linux/loop.h>
> +
> +# ifndef VERBOSE
> +#  define VERBOSE 0
> +# endif
> +
> +static const unsigned int magic = 0xdeadbeef;
> +static const unsigned long lmagic = (unsigned long) 0xdeadbeefbadc0dedULL;
> +
> +static void
> +init_magic(void *addr, const unsigned int size)
> +{
> + unsigned int *p = addr;
> + const unsigned int *end = addr + size - sizeof(int);
> +
> + for (; p <= end; ++p)
> + *(unsigned int *) p = magic;
> +}
> +
> +int
> +main(void)
> +{
> + ioctl(-1, LOOP_SET_FD, magic);
> + printf("ioctl(-1, LOOP_SET_FD, %d) = -1 EBADF (%m)\n", magic);
> +
> + ioctl(-1, LOOP_CLR_FD, 0);
> + printf("ioctl(-1, LOOP_CLR_FD) = -1 EBADF (%m)\n");
> +
> + struct loop_info *const info = tail_alloc(sizeof(*info));
> + init_magic(info, sizeof(*info));
> + info->lo_encrypt_type = LO_CRYPT_NONE;
> + info->lo_flags = LO_FLAGS_READ_ONLY;
> + memset(info->lo_name, 'A', sizeof(info->lo_name));
> + memset(info->lo_encrypt_key, 'B', sizeof(info->lo_encrypt_key));
> + ioctl(-1, LOOP_SET_STATUS, info);
> + printf("ioctl(-1, LOOP_SET_STATUS, {lo_number=%d", info->lo_number);
> +# if VERBOSE
> + printf(", lo_device=%#lx, lo_inode=%lu, lo_rdevice=%#lx",
> + (unsigned long) info->lo_device,
> + info->lo_inode,
> + (unsigned long) info->lo_rdevice);
> +# endif /* VERBOSE */
> +
> + printf(", lo_offset=%#x", info->lo_offset);
> +
> +# if VERBOSE
> + printf(", lo_encrypt_type=LO_CRYPT_NONE, lo_encrypt_key_size=%d",
> + info->lo_encrypt_key_size);
> +#endif /* VERBOSE */
> +
> + printf(", lo_flags=LO_FLAGS_READ_ONLY, lo_name=\"%.*s\"",
> + (int) sizeof(info->lo_name) - 1, info->lo_name);
> +
> +# if VERBOSE
> + printf(", lo_encrypt_key=\"%.*s\"",
> + (int) sizeof(info->lo_encrypt_key),
> + info->lo_encrypt_key);
> +#endif /* VERBOSE */
> +# if VERBOSE
> + printf(", lo_init=[%#lx, %#lx]"
> +       ", reserved=[%#x, %#x, %#x, %#x]}",
> +       info->lo_init[0], info->lo_init[1],
> +       info->reserved[0], info->reserved[1],
> +       info->reserved[2], info->reserved[3]);
> +# else /* !VERBOSE */
> + printf(", ...}");
> +#endif /* VERBOSE */
> + printf(") = -1 EBADF (%m)\n");
> +
> + ioctl(-1, LOOP_GET_STATUS, info);
> + printf("ioctl(-1, LOOP_GET_STATUS, %#llx) = -1 EBADF (%m)\n",
> + (long long) info);
> +
> + struct loop_info64 *const info64 = tail_alloc(sizeof(*info64));
> + init_magic(info64, sizeof(*info64));
> + info64->lo_flags = LO_FLAGS_READ_ONLY;
> + info64->lo_encrypt_type = LO_CRYPT_NONE;
> + memset(info64->lo_file_name, 'C', sizeof(info64->lo_file_name));
> + memset(info64->lo_crypt_name, 'D', sizeof(info64->lo_crypt_name));
> + memset(info64->lo_encrypt_key, 'E', sizeof(info64->lo_encrypt_key));
> + ioctl(-1, LOOP_SET_STATUS64, info64);
> + printf("ioctl(-1, LOOP_SET_STATUS64, ");
> +# if VERBOSE
> + printf("{lo_device=%" PRIu64 ", lo_inode=%" PRIu64
> +       ", lo_rdevice=%" PRIu64 ", lo_offset=%#" PRIx64
> +       ", lo_sizelimit=%" PRIu64 ", lo_number=%" PRIu32,
> +       (uint64_t) info64->lo_device,
> +       (uint64_t) info64->lo_inode,
> +       (uint64_t) info64->lo_rdevice,
> +       (uint64_t) info64->lo_offset,
> +       (uint64_t) info64->lo_sizelimit,
> +       (uint32_t) info64->lo_number);
> +#else /* !VERBOSE */
> + printf("{lo_offset=%#" PRIx64 ", lo_number=%" PRIu32,
> + (uint64_t) info64->lo_offset,
> + (uint32_t) info64->lo_number);
> +#endif /* VERBOSE */
> +
> +# if VERBOSE
> + printf(", lo_encrypt_type=LO_CRYPT_NONE, lo_encrypt_key_size=%" PRIu32,
> + info64->lo_encrypt_key_size);
> +# endif /* VERBOSE */
> +
> + printf(", lo_flags=LO_FLAGS_READ_ONLY, lo_file_name=\"%.*s\"",
> + (int) sizeof(info64->lo_file_name) - 1, info64->lo_file_name);
> +
> +# if VERBOSE
> + printf(", lo_crypt_name=\"%.*s\", lo_encrypt_key=\"%.*s\"",
> + (int) sizeof(info64->lo_crypt_name) - 1,
> + info64->lo_crypt_name,
> + (int) sizeof(info64->lo_encrypt_key),
> + info64->lo_encrypt_key);
> +# endif /* VERBOSE */
> +
> +# if VERBOSE
> + printf(", lo_init=[%#" PRIx64 ", %#" PRIx64 "]}",
> + (uint64_t) info64->lo_init[0],
> + (uint64_t) info64->lo_init[1]);
> +# else /* !VERBOSE */
> + printf(", ...}");
> +# endif /* VERBOSE */
> +
> + printf(") = -1 EBADF (%m)\n");
> +
> + ioctl(-1, LOOP_GET_STATUS64, info64);
> + printf("ioctl(-1, LOOP_GET_STATUS64, %#llx) = -1 EBADF (%m)\n",
> + (long long) info64);
> +
> + ioctl(-1, LOOP_CHANGE_FD, magic);
> + printf("ioctl(-1, LOOP_CHANGE_FD, %d) = -1 EBADF (%m)\n", magic);
> +
> + ioctl(-1, LOOP_SET_CAPACITY, 0);
> + printf("ioctl(-1, LOOP_SET_CAPACITY) = -1 EBADF (%m)\n");
> +
> + ioctl(-1, LOOP_SET_DIRECT_IO, lmagic);
> + printf("ioctl(-1, LOOP_SET_DIRECT_IO, %lu) = -1 EBADF (%m)\n", lmagic);
> +
> + ioctl(-1, LOOP_CTL_ADD, magic);
> + printf("ioctl(-1, LOOP_CTL_ADD, %d) = -1 EBADF (%m)\n", magic);
> +
> + ioctl(-1, LOOP_CTL_REMOVE, magic);
> + printf("ioctl(-1, LOOP_CTL_REMOVE, %d) = -1 EBADF (%m)\n", magic);
> +
> + ioctl(-1, LOOP_CTL_GET_FREE, 0);
> + printf("ioctl(-1, LOOP_CTL_GET_FREE) = -1 EBADF (%m)\n");
> +
> + puts("+++ exited with 0 +++");
> + return 0;
> +}
> diff --git a/tests/ioctl_loop.test b/tests/ioctl_loop.test
> new file mode 100755
> index 0000000..112cd63
> --- /dev/null
> +++ b/tests/ioctl_loop.test
> @@ -0,0 +1,12 @@
> +#!/bin/sh
> +
> +# Check decoding of LOOP_* ioctls.
> +
> +. "${srcdir=.}/init.sh"
> +
> +run_prog > /dev/null
> +run_strace -a22 -eioctl $args > "$EXP"
> +check_prog grep
> +grep -v '^ioctl([012],' < "$LOG" > "$OUT"
> +match_diff "$OUT" "$EXP"
> +rm -f "$EXP" "$OUT"
> -- 
> 2.7.4

Sorry but this text is not a patch.
Please do not repeat the same mistake again and again by resending
it using a method that unavoidably damages patches.


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20161227/4c56e02b/attachment.bin>


More information about the Strace-devel mailing list