* Check decoding of waitid syscall.
*
* Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2016-2017 The strace developers.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include <unistd.h>
#include <sys/wait.h>
#include <sys/resource.h>
-#include <sys/syscall.h>
+#include <asm/unistd.h>
static const char *
sprint_rusage(const struct rusage *const ru)
{
static char buf[1024];
snprintf(buf, sizeof(buf),
- "{ru_utime={%llu, %llu}"
- ", ru_stime={%llu, %llu}"
-#ifdef VERBOSE_RUSAGE
+ "{ru_utime={tv_sec=%lld, tv_usec=%llu}"
+ ", ru_stime={tv_sec=%lld, tv_usec=%llu}"
+#if VERBOSE
", ru_maxrss=%llu"
", ru_ixrss=%llu"
", ru_idrss=%llu"
#else
", ...}"
#endif
- , widen_to_ull(ru->ru_utime.tv_sec)
- , widen_to_ull(ru->ru_utime.tv_usec)
- , widen_to_ull(ru->ru_stime.tv_sec)
- , widen_to_ull(ru->ru_stime.tv_usec)
-#ifdef VERBOSE_RUSAGE
- , widen_to_ull(ru->ru_maxrss)
- , widen_to_ull(ru->ru_ixrss)
- , widen_to_ull(ru->ru_idrss)
- , widen_to_ull(ru->ru_isrss)
- , widen_to_ull(ru->ru_minflt)
- , widen_to_ull(ru->ru_majflt)
- , widen_to_ull(ru->ru_nswap)
- , widen_to_ull(ru->ru_inblock)
- , widen_to_ull(ru->ru_oublock)
- , widen_to_ull(ru->ru_msgsnd)
- , widen_to_ull(ru->ru_msgrcv)
- , widen_to_ull(ru->ru_nsignals)
- , widen_to_ull(ru->ru_nvcsw)
- , widen_to_ull(ru->ru_nivcsw)
+ , (long long) ru->ru_utime.tv_sec
+ , zero_extend_signed_to_ull(ru->ru_utime.tv_usec)
+ , (long long) ru->ru_stime.tv_sec
+ , zero_extend_signed_to_ull(ru->ru_stime.tv_usec)
+#if VERBOSE
+ , zero_extend_signed_to_ull(ru->ru_maxrss)
+ , zero_extend_signed_to_ull(ru->ru_ixrss)
+ , zero_extend_signed_to_ull(ru->ru_idrss)
+ , zero_extend_signed_to_ull(ru->ru_isrss)
+ , zero_extend_signed_to_ull(ru->ru_minflt)
+ , zero_extend_signed_to_ull(ru->ru_majflt)
+ , zero_extend_signed_to_ull(ru->ru_nswap)
+ , zero_extend_signed_to_ull(ru->ru_inblock)
+ , zero_extend_signed_to_ull(ru->ru_oublock)
+ , zero_extend_signed_to_ull(ru->ru_msgsnd)
+ , zero_extend_signed_to_ull(ru->ru_msgrcv)
+ , zero_extend_signed_to_ull(ru->ru_nsignals)
+ , zero_extend_signed_to_ull(ru->ru_nvcsw)
+ , zero_extend_signed_to_ull(ru->ru_nivcsw)
#endif
);
return buf;
#ifdef CLD_CONTINUED
CASE(CLD_CONTINUED);
#endif
- default: perror_msg_and_fail("unknown si_code %d", code);
+ default:
+ perror_msg_and_fail("unknown si_code %d", code);
}
}
si->si_pid,
si->si_uid,
status_text,
- widen_to_ull(si->si_utime),
- widen_to_ull(si->si_stime));
+ zero_extend_signed_to_ull(si->si_utime),
+ zero_extend_signed_to_ull(si->si_stime));
return buf;
}
static unsigned long
poison(unsigned int v)
{
- return (unsigned long) 0xfacefeed00000000 | v;
+ return (unsigned long) 0xfacefeed00000000ULL | v;
}
static long
do_waitid(const unsigned int idtype,
const unsigned int id,
- const siginfo_t const *infop,
+ const siginfo_t *const infop,
const unsigned int options,
const struct rusage *const rusage)
{
perror_msg_and_fail("waitid #1");
tprintf("waitid(P_PID, %d, NULL, WNOHANG|WEXITED, NULL) = 0\n", pid);
- siginfo_t *const sinfo = tail_alloc(sizeof(*sinfo));
+ TAIL_ALLOC_OBJECT_CONST_PTR(siginfo_t, sinfo);
memset(sinfo, 0, sizeof(*sinfo));
- struct rusage *const rusage = tail_alloc(sizeof(*rusage));
+ TAIL_ALLOC_OBJECT_CONST_PTR(struct rusage, rusage);
if (do_waitid(P_PID, pid, sinfo, WNOHANG|WEXITED|WSTOPPED, rusage))
perror_msg_and_fail("waitid #2");
tprintf("waitid(P_PID, %d, {}, WNOHANG|WEXITED|WSTOPPED, %s) = 0\n",