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:
parent
d54388e1ce
commit
eb2c0b8bdf
8
btrfs.c
8
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);
|
||||
|
7
execve.c
7
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)) {
|
||||
|
4
msghdr.c
4
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(", ...");
|
||||
}
|
||||
|
21
netlink.c
21
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;
|
||||
|
18
nlattr.c
18
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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user