diff options
author | Dmitry V. Levin <ldv@strace.io> | 2021-04-22 08:00:00 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@strace.io> | 2021-04-22 08:00:00 +0000 |
commit | 2422548fe226ed5d3cb0072b842ec47e0b657009 (patch) | |
tree | 2527c98c97a051f8f6c4f05d80cb644f33f6e6aa | |
parent | cb4c154cfdc688a098c9163ab900d95083084d60 (diff) | |
download | strace-2422548fe226ed5d3cb0072b842ec47e0b657009.tar.gz |
mem: use print_array to decode mincore syscall
* src/mem.c (print_mincore_entry): New function.
(SYS_FUNC(mincore)): Use it with print_array to print the 3rd argument
of mincore syscall.
-rw-r--r-- | src/mem.c | 39 |
1 files changed, 16 insertions, 23 deletions
@@ -301,6 +301,15 @@ SYS_FUNC(mlock2) return RVAL_DECODED; } +static bool +print_mincore_entry(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data) +{ + uint8_t val = (*(uint8_t *) elem_buf) & 1; + PRINT_VAL_U(val); + + return true; +} + SYS_FUNC(mincore) { if (entering(tcp)) { @@ -309,29 +318,13 @@ SYS_FUNC(mincore) } else { const unsigned long page_size = get_pagesize(); const unsigned long page_mask = page_size - 1; - unsigned long len = tcp->u_arg[1]; - unsigned char *vec = NULL; - - len = len / page_size + (len & page_mask ? 1 : 0); - if (syserror(tcp) || !verbose(tcp) || - !tcp->u_arg[2] || !(vec = malloc(len)) || - umoven(tcp, tcp->u_arg[2], len, vec) < 0) - printaddr(tcp->u_arg[2]); - else { - unsigned long i; - tprints("["); - for (i = 0; i < len; i++) { - if (i) - tprints(", "); - if (abbrev(tcp) && i >= max_strlen) { - tprints("..."); - break; - } - tprints((vec[i] & 1) ? "1" : "0"); - } - tprints("]"); - } - free(vec); + const kernel_ulong_t len = tcp->u_arg[1]; + const kernel_ulong_t nmemb = + len / page_size + ((len & page_mask) ? 1 : 0); + const kernel_ulong_t vec = tcp->u_arg[2]; + uint8_t entry; + print_array(tcp, vec, nmemb, &entry, sizeof(entry), + tfetch_mem, print_mincore_entry, 0); } return 0; } |