From: Dmitry V. Levin Date: Wed, 17 Feb 2016 05:24:43 +0000 (+0000) Subject: Print pid_t arguments of rt_sigqueueinfo and rt_tgsigqueueinfo as int X-Git-Tag: v4.12~529 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=11d623f10aee9491091262bf5f70cc5e962187eb;p=strace Print pid_t arguments of rt_sigqueueinfo and rt_tgsigqueueinfo as int * signal.c (SYS_FUNC(rt_sigqueueinfo)): Print first syscall argument using %d format. (SYS_FUNC(rt_tgsigqueueinfo)): Print first and second syscall arguments using %d format. * tests/rt_tgsigqueueinfo.c: New file. * tests/rt_tgsigqueueinfo.test: New test. * tests/.gitignore: Add rt_tgsigqueueinfo. * tests/Makefile.am (check_PROGRAMS): Likewise. (TESTS): Add rt_tgsigqueueinfo.test. --- diff --git a/signal.c b/signal.c index d0f0b081..ad1d967f 100644 --- a/signal.c +++ b/signal.c @@ -640,7 +640,7 @@ print_sigqueueinfo(struct tcb *tcp, int sig, unsigned long uinfo) SYS_FUNC(rt_sigqueueinfo) { - tprintf("%lu, ", tcp->u_arg[0]); + tprintf("%d, ", (int) tcp->u_arg[0]); print_sigqueueinfo(tcp, tcp->u_arg[1], tcp->u_arg[2]); return RVAL_DECODED; @@ -648,7 +648,7 @@ SYS_FUNC(rt_sigqueueinfo) SYS_FUNC(rt_tgsigqueueinfo) { - tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]); + tprintf("%d, %d, ", (int) tcp->u_arg[0], (int) tcp->u_arg[1]); print_sigqueueinfo(tcp, tcp->u_arg[2], tcp->u_arg[3]); return RVAL_DECODED; diff --git a/tests/.gitignore b/tests/.gitignore index 3cded8d5..0b3edf40 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -86,6 +86,7 @@ rt_sigpending rt_sigprocmask rt_sigqueueinfo rt_sigtimedwait +rt_tgsigqueueinfo sched_xetaffinity sched_xetattr scm_rights diff --git a/tests/Makefile.am b/tests/Makefile.am index 96026425..ecf4b8a4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -134,6 +134,7 @@ check_PROGRAMS = \ rt_sigprocmask \ rt_sigqueueinfo \ rt_sigtimedwait \ + rt_tgsigqueueinfo \ sched_xetaffinity \ sched_xetattr \ scm_rights \ @@ -288,6 +289,7 @@ TESTS = \ rt_sigprocmask.test \ rt_sigqueueinfo.test \ rt_sigtimedwait.test \ + rt_tgsigqueueinfo.test \ sched_xetaffinity.test \ sched_xetattr.test \ scm_rights-fd.test \ diff --git a/tests/rt_tgsigqueueinfo.c b/tests/rt_tgsigqueueinfo.c new file mode 100644 index 00000000..ff33f408 --- /dev/null +++ b/tests/rt_tgsigqueueinfo.c @@ -0,0 +1,88 @@ +/* + * This file is part of rt_tgsigqueueinfo strace test. + * + * Copyright (c) 2016 Dmitry V. Levin + * 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 + +#ifdef __NR_rt_tgsigqueueinfo + +# include +# include +# include +# include +# include +# include + +static long +k_tgsigqueueinfo(const pid_t pid, const int sig, const void const *info) +{ + return syscall(__NR_rt_tgsigqueueinfo, + (unsigned long) 0xffffffff00000000 | pid, + (unsigned long) 0xffffffff00000000 | pid, + (unsigned long) 0xffffffff00000000 | sig, + info); +} + +int +main (void) +{ + const struct sigaction sa = { + .sa_handler = SIG_IGN + }; + if (sigaction(SIGUSR1, &sa, NULL)) + perror_msg_and_fail("sigaction"); + + siginfo_t *const info = tail_alloc(sizeof(*info)); + memset(info, 0, sizeof(*info)); + info->si_signo = SIGUSR1; + info->si_errno = ENOENT; + info->si_code = SI_QUEUE; + info->si_pid = getpid(); + info->si_uid = getuid(); + info->si_value.sival_ptr = (void *) (unsigned long) 0xdeadbeeffacefeed; + + if (k_tgsigqueueinfo(info->si_pid, SIGUSR1, info)) + perror_msg_and_fail("rt_tgsigqueueinfo"); + + printf("rt_tgsigqueueinfo(%u, %u, %s, {si_signo=%s" + ", si_code=SI_QUEUE, si_errno=ENOENT, si_pid=%u" + ", si_uid=%u, si_value={int=%d, ptr=%p}}) = 0\n", + info->si_pid, info->si_pid, "SIGUSR1", "SIGUSR1", + info->si_pid, info->si_uid, info->si_value.sival_int, + info->si_value.sival_ptr); + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_rt_tgsigqueueinfo") + +#endif diff --git a/tests/rt_tgsigqueueinfo.test b/tests/rt_tgsigqueueinfo.test new file mode 100755 index 00000000..d2fcca5b --- /dev/null +++ b/tests/rt_tgsigqueueinfo.test @@ -0,0 +1,11 @@ +#!/bin/sh + +# Check decoding of rt_tgsigqueueinfo syscall + +. "${srcdir=.}/init.sh" + +run_prog > /dev/null +OUT="$LOG.out" +run_strace -ert_tgsigqueueinfo -esignal=none $args > "$OUT" +match_diff "$LOG" "$OUT" +rm -f "$OUT"