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.
This commit is contained in:
Дмитрий Левин 2018-05-29 09:58:10 +00:00
parent d54388e1ce
commit eb2c0b8bdf
10 changed files with 55 additions and 29 deletions

View File

@ -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);

View File

@ -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)) {

View File

@ -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(", ...");
}

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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));

View File

@ -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));