Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F147429125
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/lib/libsysdecode/netlink.c b/lib/libsysdecode/netlink.c
index 2143a0d391a5..723272d3b8da 100644
--- a/lib/libsysdecode/netlink.c
+++ b/lib/libsysdecode/netlink.c
@@ -21,7 +21,7 @@
* to fallback to a standard hex/string dump.
*/
bool
-sysdecode_netlink(FILE *fp, const void *buf, size_t len)
+sysdecode_netlink(FILE *fp, const void *buf, size_t len, int protocol)
{
const struct nlmsghdr *nl = buf;
size_t remaining = len;
diff --git a/lib/libsysdecode/sysdecode.h b/lib/libsysdecode/sysdecode.h
index 3675a582a9b8..bd38bb5bdc42 100644
--- a/lib/libsysdecode/sysdecode.h
+++ b/lib/libsysdecode/sysdecode.h
@@ -136,7 +136,8 @@ bool sysdecode_wait4_options(FILE *_fp, int _options, int *_rem);
bool sysdecode_wait6_options(FILE *_fp, int _options, int *_rem);
const char *sysdecode_whence(int _whence);
bool sysdecode_shmflags(FILE *_fp, int _flags, int *_rem);
-bool sysdecode_netlink(FILE *_fp, const void *_buf, size_t _len);
+bool sysdecode_netlink(FILE *_fp, const void *_buf, size_t _len,
+ int _protocol);
#if defined(__i386__) || defined(__amd64__) || defined(__aarch64__)
diff --git a/usr.bin/truss/setup.c b/usr.bin/truss/setup.c
index ecc4a1792144..d35b392aba1e 100644
--- a/usr.bin/truss/setup.c
+++ b/usr.bin/truss/setup.c
@@ -587,6 +587,7 @@ exit_syscall(struct trussinfo *info, struct ptrace_lwpinfo *pl)
f->fd = (int)psr.sr_retval[0];
f->domain = (int)t->cs.args[0];
+ f->protocol = (int)t->cs.args[2];
LIST_INSERT_HEAD(&p->fdlist, f, entries);
}
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c
index dbc621124071..a92c903dc691 100644
--- a/usr.bin/truss/syscalls.c
+++ b/usr.bin/truss/syscalls.c
@@ -1573,17 +1573,17 @@ user_ptr32_to_psaddr(int32_t user_pointer)
* Check whether a file descriptor belongs to an AF_NETLINK socket
* for the current traced process.
*/
-static bool
-is_netlink(struct trussinfo *trussinfo, int num_fd)
+static int
+get_netlink_protocol(struct trussinfo *trussinfo, int num_fd)
{
struct procinfo *p = trussinfo->curthread->proc;
struct fd_domain *f;
LIST_FOREACH(f, &p->fdlist, entries) {
if (f->fd == num_fd && f->domain == AF_NETLINK)
- return (true);
+ return (f->protocol);
}
- return (false);
+ return (-1);
}
#define NETLINK_MAX_DECODE 4096
@@ -1593,7 +1593,8 @@ is_netlink(struct trussinfo *trussinfo, int num_fd)
* and attempt to decode and print it.
*/
static bool
-print_netlink(FILE *fp, struct trussinfo *trussinfo, void *msg, size_t len)
+print_netlink(FILE *fp, struct trussinfo *trussinfo, void *msg, size_t len,
+ int protocol)
{
char *buf;
pid_t pid = trussinfo->curthread->proc->pid;
@@ -1615,7 +1616,7 @@ print_netlink(FILE *fp, struct trussinfo *trussinfo, void *msg, size_t len)
return (false);
}
- if (sysdecode_netlink(fp, buf, read_len)) {
+ if (sysdecode_netlink(fp, buf, read_len, protocol)) {
success = true;
}
free(buf);
@@ -1690,12 +1691,18 @@ print_arg(struct syscall_arg *sc, syscallarg_t *args, syscallarg_t *retval,
}
case BinString: {
if ((strcmp(decode->name, "sendto") == 0 ||
- strcmp(decode->name, "recvfrom") == 0) &&
- is_netlink(trussinfo, (int)args[0]))
- if (print_netlink(fp, trussinfo,
+ strcmp(decode->name, "recvfrom") == 0)) {
+
+ int protocol =
+ get_netlink_protocol(trussinfo, (int)args[0]);
+
+ if ((protocol != -1) &&
+ print_netlink(fp, trussinfo,
(void *)args[sc->offset],
- (size_t)args[sc->offset + 1]))
+ (size_t)args[sc->offset + 1],
+ protocol))
break;
+ }
/*
* Binary block of data that might have printable characters.
* XXX If type|OUT, assume that the length is the syscall's
@@ -2770,11 +2777,12 @@ print_arg(struct syscall_arg *sc, syscallarg_t *args, syscallarg_t *retval,
print_sockaddr(fp, trussinfo, (uintptr_t)msghdr.msg_name, msghdr.msg_namelen);
fprintf(fp, ",%d,", msghdr.msg_namelen);
/* Attempt Netlink decode; fallback to standard iovec if it fails. */
- if ((!is_netlink(trussinfo, (int)args[0])) ||
+ int protocol = get_netlink_protocol(trussinfo, (int)args[0]);
+ if ((protocol == -1) ||
(get_struct(pid, (uintptr_t)msghdr.msg_iov,
&iov, sizeof(iov)) == -1) ||
(!print_netlink(fp, trussinfo, (void *)iov.iov_base,
- (size_t)iov.iov_len))) {
+ (size_t)iov.iov_len, protocol))) {
print_iovec(fp, trussinfo, (uintptr_t)msghdr.msg_iov,
msghdr.msg_iovlen);
}
diff --git a/usr.bin/truss/truss.h b/usr.bin/truss/truss.h
index 737ebc184806..077460fe4090 100644
--- a/usr.bin/truss/truss.h
+++ b/usr.bin/truss/truss.h
@@ -100,6 +100,7 @@ struct fd_domain
int fd;
int domain;
+ int protocol;
};
struct procinfo {
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Jul 7, 2:16 PM (11 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29019825
Default Alt Text
(4 KB)
Attached To
Mode
rG FreeBSD src repository
Attached
Detach File
Event Timeline
Log In to Comment