From eb2c0b8bdfb8980f3336fc82dc40aafbcdd75eed Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Tue, 29 May 2018 09:58:10 +0000 Subject: [PATCH] Enhance printing of unfetchable object addresses in sequences and arrays * btrfs.c (btrfs_print_tree_search): Print the address of unfetchable object inside the sequence using printaddr_comment. * msghdr.c (decode_msg_control): Likewise. * execve.c (printargv): Print the address of unfetchable object inside the array using printaddr_comment. * netlink.c (fetch_nlmsghdr): Add in_array argument. When in_array is true, print the address of unfetchable object using printaddr_comment. * nlattr.c (fetch_nlattr): Likewise. * tests/execve.c (main): Update expected output. * tests/execveat.c (main): Likewise. * tests/msg_control.c (test_scm_rights1, test_scm_rights2, test_scm_security): Likewise. * tests/netlink_protocol.c (send_query): Likewise. * tests/nlattr.c (test_nlattr): Likewise. --- btrfs.c | 8 ++++++-- execve.c | 7 +++++-- msghdr.c | 4 ++-- netlink.c | 21 +++++++++++++++------ nlattr.c | 18 +++++++++++++----- tests/execve.c | 9 +++++---- tests/execveat.c | 7 ++++--- tests/msg_control.c | 6 +++--- tests/netlink_protocol.c | 2 +- tests/nlattr.c | 2 +- 10 files changed, 55 insertions(+), 29 deletions(-) diff --git a/btrfs.c b/btrfs.c index 46cb94d2..7ab01714 100644 --- a/btrfs.c +++ b/btrfs.c @@ -418,11 +418,15 @@ btrfs_print_tree_search(struct tcb *tcp, struct btrfs_ioctl_search_key *key, uint64_t addr = buf_addr + off; if (i) tprints(", "); - if (i > max_strlen || - umove(tcp, addr, &sh)) { + if (i > max_strlen) { tprints("..."); break; } + if (umove(tcp, addr, &sh)) { + tprints("..."); + printaddr_comment(addr); + break; + } PRINT_FIELD_U("{", sh, transid); btrfs_print_objectid(", ", sh, objectid); PRINT_FIELD_U(", ", sh, offset); diff --git a/execve.c b/execve.c index 5455b153..1c8caff2 100644 --- a/execve.c +++ b/execve.c @@ -57,8 +57,11 @@ printargv(struct tcb *const tcp, kernel_ulong_t addr) if (umoven(tcp, addr, wordsize, cp.data)) { if (sep == start_sep) printaddr(addr); - else - tprints(", ???]"); + else { + tprints(", ..."); + printaddr_comment(addr); + tprints("]"); + } return; } if (!(wordsize < sizeof(cp.p64) ? cp.p32 : cp.p64)) { diff --git a/msghdr.c b/msghdr.c index c698e540..5faab77a 100644 --- a/msghdr.c +++ b/msghdr.c @@ -350,8 +350,8 @@ decode_msg_control(struct tcb *const tcp, const kernel_ulong_t addr, buf_len -= len; } if (buf_len) { - tprints(", "); - printaddr(addr + (control_len - buf_len)); + tprints(", ..."); + printaddr_comment(addr + (control_len - buf_len)); } else if (control_len < in_control_len) { tprints(", ..."); } diff --git a/netlink.c b/netlink.c index ba05edcf..8a30483c 100644 --- a/netlink.c +++ b/netlink.c @@ -64,17 +64,25 @@ */ static bool fetch_nlmsghdr(struct tcb *const tcp, struct nlmsghdr *const nlmsghdr, - const kernel_ulong_t addr, const kernel_ulong_t len) + const kernel_ulong_t addr, const kernel_ulong_t len, + const bool in_array) { if (len < sizeof(struct nlmsghdr)) { printstr_ex(tcp, addr, len, QUOTE_FORCE_HEX); return false; } - if (umove_or_printaddr(tcp, addr, nlmsghdr)) - return false; + if (tfetch_obj(tcp, addr, nlmsghdr)) + return true; - return true; + if (in_array) { + tprints("..."); + printaddr_comment(addr); + } else { + printaddr(addr); + } + + return false; } static int @@ -522,7 +530,7 @@ decode_nlmsgerr(struct tcb *const tcp, if (len) { tprints(", msg="); - if (fetch_nlmsghdr(tcp, &err.msg, addr, len)) { + if (fetch_nlmsghdr(tcp, &err.msg, addr, len, false)) { unsigned int payload = capped ? sizeof(err.msg) : err.msg.nlmsg_len; if (payload > len) @@ -639,7 +647,8 @@ decode_netlink(struct tcb *const tcp, bool is_array = false; unsigned int elt; - for (elt = 0; fetch_nlmsghdr(tcp, &nlmsghdr, addr, len); elt++) { + for (elt = 0; fetch_nlmsghdr(tcp, &nlmsghdr, addr, len, is_array); + elt++) { if (abbrev(tcp) && elt == max_strlen) { tprints("..."); break; diff --git a/nlattr.c b/nlattr.c index 36e06e1f..924e647f 100644 --- a/nlattr.c +++ b/nlattr.c @@ -38,17 +38,25 @@ static bool fetch_nlattr(struct tcb *const tcp, struct nlattr *const nlattr, - const kernel_ulong_t addr, const unsigned int len) + const kernel_ulong_t addr, const unsigned int len, + const bool in_array) { if (len < sizeof(struct nlattr)) { printstr_ex(tcp, addr, len, QUOTE_FORCE_HEX); return false; } - if (umove_or_printaddr(tcp, addr, nlattr)) - return false; + if (tfetch_obj(tcp, addr, nlattr)) + return true; - return true; + if (in_array) { + tprints("..."); + printaddr_comment(addr); + } else { + printaddr(addr); + } + + return false; } static void @@ -118,7 +126,7 @@ decode_nlattr(struct tcb *const tcp, bool is_array = false; unsigned int elt; - for (elt = 0; fetch_nlattr(tcp, &nla, addr, len); elt++) { + for (elt = 0; fetch_nlattr(tcp, &nla, addr, len, is_array); elt++) { if (abbrev(tcp) && elt == max_strlen) { tprints("..."); break; diff --git a/tests/execve.c b/tests/execve.c index da3bc520..ead8c7d0 100644 --- a/tests/execve.c +++ b/tests/execve.c @@ -59,17 +59,18 @@ main(void) execve(FILENAME, tail_argv, tail_envp); printf("execve(\"%s\"" - ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ???]" + ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]" #if VERBOSE - ", [\"%s\", \"%s\", %p, %p, %p, ???]" + ", [\"%s\", \"%s\", %p, %p, %p, ... /* %p */]" #else ", %p /* 5 vars, unterminated */" #endif ") = -1 ENOENT (%m)\n", Q_FILENAME, q_argv[0], q_argv[1], q_argv[2], - argv[3], argv[4], argv[5] + argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv) #if VERBOSE - , q_envp[0], q_envp[1], envp[2], envp[3], envp[4] + , q_envp[0], q_envp[1], envp[2], envp[3], envp[4], + (char *) tail_envp + sizeof(envp) #else , tail_envp #endif diff --git a/tests/execveat.c b/tests/execveat.c index 566a59f9..caa75054 100644 --- a/tests/execveat.c +++ b/tests/execveat.c @@ -64,17 +64,18 @@ main(void) syscall(__NR_execveat, -100, FILENAME, tail_argv, tail_envp, 0x1100); printf("execveat(AT_FDCWD, \"%s\"" - ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ???]" + ", [\"%s\", \"%s\", \"%s\", %p, %p, %p, ... /* %p */]" #if VERBOSE - ", [\"%s\", \"%s\", %p, %p, %p, ???]" + ", [\"%s\", \"%s\", %p, %p, %p, ... /* %p */]" #else ", %p /* 5 vars, unterminated */" #endif ", AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) = -1 %s (%m)\n", Q_FILENAME, q_argv[0], q_argv[1], q_argv[2], - argv[3], argv[4], argv[5], + argv[3], argv[4], argv[5], (char *) tail_argv + sizeof(argv), #if VERBOSE q_envp[0], q_envp[1], envp[2], envp[3], envp[4], + (char *) tail_envp + sizeof(envp), #else tail_envp, #endif diff --git a/tests/msg_control.c b/tests/msg_control.c index 48b7347a..e704d8f2 100644 --- a/tests/msg_control.c +++ b/tests/msg_control.c @@ -132,7 +132,7 @@ test_scm_rights1(struct msghdr *const mh, print_fds(cmsg, src_len); printf("}"); if (aligned_cms_len < msg_controllen) - printf(", %p", (void *) cmsg + aligned_cms_len); + printf(", ... /* %p */", (void *) cmsg + aligned_cms_len); printf("]"); } @@ -195,7 +195,7 @@ test_scm_rights2(struct msghdr *const mh, print_fds(cmsg[1], src1_len); printf("}"); if (aligned_cms_len[1] < msg_controllen1) - printf(", %p", (void *) cmsg[1] + aligned_cms_len[1]); + printf(", ... /* %p */", (void *) cmsg[1] + aligned_cms_len[1]); printf("]"); errno = saved_errno; @@ -425,7 +425,7 @@ test_scm_security(struct msghdr *const mh, print_security(cmsg, src_len); printf("}"); if (aligned_cms_len < msg_controllen) - printf(", %p", (void *) cmsg + aligned_cms_len); + printf(", ... /* %p */", (void *) cmsg + aligned_cms_len); printf("]"); errno = saved_errno; diff --git a/tests/netlink_protocol.c b/tests/netlink_protocol.c index 866c16e3..aa335aa8 100644 --- a/tests/netlink_protocol.c +++ b/tests/netlink_protocol.c @@ -145,7 +145,7 @@ send_query(const int fd) rc = sendto(fd, efault2, sizeof(*reqs), MSG_DONTWAIT, NULL, 0); printf("sendto(%d, [{{len=%u, type=NLMSG_NOOP, flags=NLM_F_REQUEST|0x%x" ", seq=0, pid=0}, \"\\x61\\x62\\x63\\x64\"}" - ", %p], %u, MSG_DONTWAIT, NULL, 0) = %s\n", + ", ... /* %p */], %u, MSG_DONTWAIT, NULL, 0) = %s\n", fd, reqs->req1.nlh.nlmsg_len, NLM_F_DUMP, &((struct reqs *) efault2)->req2, (unsigned) sizeof(*reqs), sprintrc(rc)); diff --git a/tests/nlattr.c b/tests/nlattr.c index 41923c0a..1d6e2c42 100644 --- a/tests/nlattr.c +++ b/tests/nlattr.c @@ -172,7 +172,7 @@ test_nlattr(const int fd) ", flags=NLM_F_DUMP, seq=0, pid=0}, {udiag_family=AF_UNIX" ", udiag_type=SOCK_STREAM, udiag_state=TCP_FIN_WAIT1" ", udiag_ino=0, udiag_cookie=[0, 0]}, [{nla_len=%u" - ", nla_type=UNIX_DIAG_NAME}, %p]}, %u" + ", nla_type=UNIX_DIAG_NAME}, ... /* %p */]}, %u" ", MSG_DONTWAIT, NULL, 0) = %s\n", fd, msg_len, NLA_HDRLEN, nla + 1, msg_len, sprintrc(rc)); -- 2.40.0