blob: b4c6ff99de6a5591f2ce240dd613799d455c8d81 [file] [log] [blame]
From 3bbfb541b258baec9eba674b5d8dc30007a61542 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@strace.io>
Date: Wed, 21 Jun 2023 08:00:00 +0000
Subject: [PATCH] net: enhance getsockopt decoding
When getsockopt syscall fails the kernel sometimes updates the optlen
argument, for example, NETLINK_LIST_MEMBERSHIPS updates it even if
optval is not writable.
* src/net.c (SYS_FUNC(getsockopt)): Try to fetch and print optlen
argument on exiting syscall regardless of getsockopt exit status.
Upstream-Status: Backport
---
src/net.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/net.c b/src/net.c
index f68ccb947..7244b5e57 100644
--- a/src/net.c
+++ b/src/net.c
@@ -1038,7 +1038,7 @@ SYS_FUNC(getsockopt)
} else {
ulen = get_tcb_priv_ulong(tcp);
- if (syserror(tcp) || umove(tcp, tcp->u_arg[4], &rlen) < 0) {
+ if (umove(tcp, tcp->u_arg[4], &rlen) < 0) {
/* optval */
printaddr(tcp->u_arg[3]);
tprint_arg_next();
@@ -1047,6 +1047,19 @@ SYS_FUNC(getsockopt)
tprint_indirect_begin();
PRINT_VAL_D(ulen);
tprint_indirect_end();
+ } else if (syserror(tcp)) {
+ /* optval */
+ printaddr(tcp->u_arg[3]);
+ tprint_arg_next();
+
+ /* optlen */
+ tprint_indirect_begin();
+ if (ulen != rlen) {
+ PRINT_VAL_D(ulen);
+ tprint_value_changed();
+ }
+ PRINT_VAL_D(rlen);
+ tprint_indirect_end();
} else {
/* optval */
print_getsockopt(tcp, tcp->u_arg[1], tcp->u_arg[2],