/*
* Copyright (c) 2016 Fabien Siron <fabien.siron@epita.fr>
* Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
- * Copyright (c) 2016-2017 The strace developers.
+ * Copyright (c) 2016-2018 The strace developers.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include "xlat/nf_ulog_msg_types.h"
#include "xlat/nl_audit_types.h"
#include "xlat/nl_crypto_types.h"
-#include "xlat/nl_netfilter_msg_types.h"
#include "xlat/nl_netfilter_subsys_ids.h"
#include "xlat/nl_selinux_types.h"
#include "xlat/nl_sock_diag_types.h"
*/
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
/* Reserved control nfnetlink messages first. */
const char *const text = xlookup(nl_netfilter_msg_types, type);
if (text) {
- tprints(text);
+ print_xlat_ex(type, text, XLAT_STYLE_DEFAULT);
return;
}
} else if (family < ARRAY_SIZE(nlmsg_flags) && nlmsg_flags[family])
table = nlmsg_flags[family](type);
- printflags_ex(flags, "NLM_F_???", netlink_flags, table, NULL);
+ printflags_ex(flags, "NLM_F_???", XLAT_STYLE_ABBREV,
+ netlink_flags, table, NULL);
}
static void
const size_t nmemb = len / sizeof(cookie);
print_array(tcp, addr, nmemb, &cookie, sizeof(cookie),
- umoven_or_printaddr, print_cookie, 0);
+ tfetch_mem, print_cookie, 0);
return true;
}
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)
const kernel_ulong_t addr,
const kernel_ulong_t len)
{
- const unsigned int nlmsg_len =
- nlmsghdr->nlmsg_len > len ? len : nlmsghdr->nlmsg_len;
+ const unsigned int nlmsg_len = MIN(nlmsghdr->nlmsg_len, len);
if (nlmsg_len > NLMSG_HDRLEN)
tprints("{");
const int family = get_fd_nl_family(tcp, fd);
if (family == NETLINK_KOBJECT_UEVENT) {
- printstrn(tcp, addr, len);
+ decode_netlink_kobject_uevent(tcp, addr, len);
return;
}
struct nlmsghdr nlmsghdr;
- bool print_array = false;
+ 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;
next_addr = addr + nlmsg_len;
}
- if (!print_array && next_addr) {
+ if (!is_array && next_addr) {
tprints("[");
- print_array = true;
+ is_array = true;
}
decode_nlmsghdr_with_payload(tcp, fd, family,
len = next_len;
}
- if (print_array) {
+ if (is_array) {
tprints("]");
}
}