}
void
-printaddr_klu(const kernel_ulong_t addr)
+printaddr(const kernel_ulong_t addr)
{
if (!addr)
tprints("NULL");
#define DEF_PRINTNUM(name, type) \
bool \
-printnum_ ## name(struct tcb *tcp, const long addr, const char *fmt) \
+printnum_ ## name(struct tcb *const tcp, const kernel_ulong_t addr, \
+ const char *const fmt) \
{ \
type num; \
if (umove_or_printaddr(tcp, addr, &num)) \
#define DEF_PRINTPAIR(name, type) \
bool \
-printpair_ ## name(struct tcb *tcp, const long addr, const char *fmt) \
+printpair_ ## name(struct tcb *const tcp, const kernel_ulong_t addr, \
+ const char *const fmt) \
{ \
type pair[2]; \
if (umove_or_printaddr(tcp, addr, &pair)) \
#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
bool
-printnum_long_int(struct tcb *tcp, const long addr,
- const char *fmt_long, const char *fmt_int)
+printnum_long_int(struct tcb *const tcp, const kernel_ulong_t addr,
+ const char *const fmt_long, const char *const fmt_int)
{
if (current_wordsize > sizeof(int)) {
return printnum_int64(tcp, addr, fmt_long);
* If path length exceeds `n', append `...' to the output.
*/
void
-printpathn(struct tcb *tcp, long addr, unsigned int n)
+printpathn(struct tcb *const tcp, const kernel_ulong_t addr, unsigned int n)
{
char path[PATH_MAX + 1];
int nul_seen;
}
void
-printpath(struct tcb *tcp, long addr)
+printpath(struct tcb *const tcp, const kernel_ulong_t addr)
{
/* Size must correspond to char path[] size in printpathn */
printpathn(tcp, addr, PATH_MAX);
/*
* Print string specified by address `addr' and length `len'.
- * If `len' == -1, set QUOTE_0_TERMINATED bit in `user_style'.
* If `user_style' has QUOTE_0_TERMINATED bit set, treat the string
* as a NUL-terminated string.
* Pass `user_style' on to `string_quote'.
* Append `...' to the output if either the string length exceeds `max_strlen',
- * or `len' != -1 and the string length exceeds `len'.
+ * or QUOTE_0_TERMINATED bit is set and the string length exceeds `len'.
*/
void
-printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
+printstr_ex(struct tcb *const tcp, const kernel_ulong_t addr,
+ const kernel_ulong_t len, const unsigned int user_style)
{
static char *str = NULL;
static char *outstr;
outstr = xmalloc(outstr_size);
}
+ /* Fetch one byte more because string_quote may look one byte ahead. */
size = max_strlen + 1;
- if (len == -1) {
- /*
- * Treat as a NUL-terminated string: fetch one byte more
- * because string_quote may look one byte ahead.
- */
- style |= QUOTE_0_TERMINATED;
+
+ if (size > len)
+ size = len;
+ if (style & QUOTE_0_TERMINATED)
rc = umovestr(tcp, addr, size, str);
- } else {
- if (size > (unsigned long) len)
- size = (unsigned long) len;
- if (style & QUOTE_0_TERMINATED)
- rc = umovestr(tcp, addr, size, str);
- else
- rc = umoven(tcp, addr, size, str);
- }
+ else
+ rc = umoven(tcp, addr, size, str);
+
if (rc < 0) {
printaddr(addr);
return;
ellipsis = string_quote(str, outstr, size, style)
&& len
&& ((style & QUOTE_0_TERMINATED)
- || (unsigned long) len > max_strlen);
+ || len > max_strlen);
tprints(outstr);
if (ellipsis)
}
void
-dumpiov_upto(struct tcb *tcp, int len, long addr, unsigned long data_size)
+dumpiov_upto(struct tcb *const tcp, const int len, const kernel_ulong_t addr,
+ kernel_ulong_t data_size)
{
#if SUPPORTED_PERSONALITIES > 1
union {
#else
struct iovec *iov;
#define sizeof_iov sizeof(*iov)
-#define iov_iov_base(i) iov[i].iov_base
+#define iov_iov_base(i) ptr_to_kulong(iov[i].iov_base)
#define iov_iov_len(i) iov[i].iov_len
#endif
int i;
}
if (umoven(tcp, addr, size, iov) >= 0) {
for (i = 0; i < len; i++) {
- unsigned long iov_len = iov_iov_len(i);
+ kernel_ulong_t iov_len = iov_iov_len(i);
if (iov_len > data_size)
iov_len = data_size;
if (!iov_len)
data_size -= iov_len;
/* include the buffer number to make it easy to
* match up the trace with the source */
- tprintf(" * %lu bytes in buffer %d\n", iov_len, i);
- dumpstr(tcp, (long) iov_iov_base(i), iov_len);
+ tprintf(" * %" PRI_klu " bytes in buffer %d\n", iov_len, i);
+ dumpstr(tcp, iov_iov_base(i), iov_len);
}
}
free(iov);
}
void
-dumpstr(struct tcb *tcp, long addr, int len)
+dumpstr(struct tcb *const tcp, const kernel_ulong_t addr, const int len)
{
static int strsize = -1;
static unsigned char *str;
#endif /* end of hack */
static ssize_t
-vm_read_mem(pid_t pid, void *laddr, long raddr, size_t len)
+vm_read_mem(const pid_t pid, void *const laddr,
+ const kernel_ulong_t raddr, const size_t len)
{
+ const unsigned long truncated_raddr = raddr;
+
+ if (raddr != (kernel_ulong_t) truncated_raddr) {
+ errno = EIO;
+ return -1;
+ }
+
const struct iovec local = {
.iov_base = laddr,
.iov_len = len
};
const struct iovec remote = {
- .iov_base = (void *) raddr,
+ .iov_base = (void *) truncated_raddr,
.iov_len = len
};
* at address `addr' to our space at `our_addr'
*/
int
-umoven(struct tcb *tcp, long addr, unsigned int len, void *our_addr)
+umoven(struct tcb *const tcp, kernel_ulong_t addr, unsigned int len,
+ void *const our_addr)
{
char *laddr = our_addr;
int pid = tcp->pid;
if ((unsigned int) r == len)
return 0;
if (r >= 0) {
- error_msg("umoven: short read (%u < %u) @0x%lx",
+ error_msg("umoven: short read (%u < %u) @0x%" PRI_klx,
(unsigned int) r, len, addr);
return -1;
}
n = addr & (sizeof(long) - 1); /* residue */
addr &= -sizeof(long); /* aligned address */
errno = 0;
- u.val = ptrace(PTRACE_PEEKDATA, pid, (void *) addr, 0);
+ u.val = ptrace(PTRACE_PEEKDATA, pid, addr, 0);
switch (errno) {
case 0:
break;
return -1;
default:
/* all the rest is strange and should be reported */
- perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
+ perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%" PRI_klx,
pid, addr);
return -1;
}
}
while (len) {
errno = 0;
- u.val = ptrace(PTRACE_PEEKDATA, pid, (void *) addr, 0);
+ u.val = ptrace(PTRACE_PEEKDATA, pid, addr, 0);
switch (errno) {
case 0:
break;
case EFAULT: case EIO: case EPERM:
/* address space is inaccessible */
if (nread) {
- perror_msg("umoven: short read (%u < %u) @0x%lx",
+ perror_msg("umoven: short read (%u < %u) @0x%" PRI_klx,
nread, nread + len, addr - nread);
}
return -1;
default:
/* all the rest is strange and should be reported */
- perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%lx",
+ perror_msg("umoven: PTRACE_PEEKDATA pid:%d @0x%" PRI_klx,
pid, addr);
return -1;
}
}
int
-umoven_or_printaddr(struct tcb *tcp, const long addr, const unsigned int len,
- void *our_addr)
+umoven_or_printaddr(struct tcb *const tcp, const kernel_ulong_t addr,
+ const unsigned int len, void *const our_addr)
{
if (!addr || !verbose(tcp) || (exiting(tcp) && syserror(tcp)) ||
umoven(tcp, addr, len, our_addr) < 0) {
}
int
-umoven_or_printaddr_ignore_syserror(struct tcb *tcp, const long addr,
- const unsigned int len, void *our_addr)
+umoven_or_printaddr_ignore_syserror(struct tcb *const tcp,
+ const kernel_ulong_t addr,
+ const unsigned int len,
+ void *const our_addr)
{
if (!addr || !verbose(tcp) || umoven(tcp, addr, len, our_addr) < 0) {
printaddr(addr);
* we never write past laddr[len-1]).
*/
int
-umovestr(struct tcb *tcp, long addr, unsigned int len, char *laddr)
+umovestr(struct tcb *const tcp, kernel_ulong_t addr, unsigned int len, char *laddr)
{
const unsigned long x01010101 = (unsigned long) 0x0101010101010101ULL;
const unsigned long x80808080 = (unsigned long) 0x8080808080808080ULL;
case EFAULT: case EIO:
/* address space is inaccessible */
if (nread) {
- perror_msg("umovestr: short read (%d < %d) @0x%lx",
+ perror_msg("umovestr: short read (%d < %d) @0x%" PRI_klx,
nread, nread + len, addr - nread);
}
return -1;
n = addr & (sizeof(long) - 1); /* residue */
addr &= -sizeof(long); /* aligned address */
errno = 0;
- u.val = ptrace(PTRACE_PEEKDATA, pid, (void *) addr, 0);
+ u.val = ptrace(PTRACE_PEEKDATA, pid, addr, 0);
switch (errno) {
case 0:
break;
return -1;
default:
/* all the rest is strange and should be reported */
- perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
+ perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%" PRI_klx,
pid, addr);
return -1;
}
while (len) {
errno = 0;
- u.val = ptrace(PTRACE_PEEKDATA, pid, (void *) addr, 0);
+ u.val = ptrace(PTRACE_PEEKDATA, pid, addr, 0);
switch (errno) {
case 0:
break;
case EFAULT: case EIO: case EPERM:
/* address space is inaccessible */
if (nread) {
- perror_msg("umovestr: short read (%d < %d) @0x%lx",
+ perror_msg("umovestr: short read (%d < %d) @0x%" PRI_klx,
nread, nread + len, addr - nread);
}
return -1;
default:
/* all the rest is strange and should be reported */
- perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%lx",
+ perror_msg("umovestr: PTRACE_PEEKDATA pid:%d @0x%" PRI_klx,
pid, addr);
return -1;
}
* - umoven_func has not returned false.
*/
bool
-print_array(struct tcb *tcp,
- const unsigned long start_addr,
+print_array(struct tcb *const tcp,
+ const kernel_ulong_t start_addr,
const size_t nmemb,
void *const elem_buf,
const size_t elem_size,
int (*const umoven_func)(struct tcb *,
- long,
+ kernel_ulong_t,
unsigned int,
void *),
bool (*const print_func)(struct tcb *,
}
const size_t size = nmemb * elem_size;
- const unsigned long end_addr = start_addr + size;
+ const kernel_ulong_t end_addr = start_addr + size;
if (end_addr <= start_addr || size / elem_size != nmemb) {
printaddr(start_addr);
return false;
}
- const unsigned long abbrev_end =
+ const kernel_ulong_t abbrev_end =
(abbrev(tcp) && max_strlen < nmemb) ?
start_addr + elem_size * max_strlen : end_addr;
- unsigned long cur;
+ kernel_ulong_t cur;
for (cur = start_addr; cur < end_addr; cur += elem_size) {
if (cur != start_addr)
return cur >= end_addr;
}
-kernel_ulong_t
-getarg_klu(struct tcb *tcp, int argn)
-{
-#if HAVE_STRUCT_TCB_EXT_ARG
-# ifndef current_klongsize
- if (current_klongsize < sizeof(*tcp->ext_arg)) {
- return tcp->u_arg[argn];
- } else
-# endif /* !current_klongsize */
- {
- return tcp->ext_arg[argn];
- }
-#else
- return tcp->u_arg[argn];
-#endif
-}
-
int
printargs(struct tcb *tcp)
{
const int n = tcp->s_ent->nargs;
int i;
for (i = 0; i < n; ++i)
- tprintf("%s%#" PRI_klx, i ? ", " : "", getarg_klu(tcp, i));
+ tprintf("%s%#" PRI_klx, i ? ", " : "", tcp->u_arg[i]);
return RVAL_DECODED;
}