From 3bbfb541b258baec9eba674b5d8dc30007a61542 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" 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],