* Improvements
* Enhanced decoding of optlen argument of getsockopt syscall.
+ * Enhanced decoding of SO_LINGER option of getsockopt and setsockopt syscalls.
Noteworthy changes in release 4.18 (2017-07-05)
===============================================
}
static void
-print_linger(struct tcb *const tcp, const kernel_ulong_t addr,
- const unsigned int len)
+print_set_linger(struct tcb *const tcp, const kernel_ulong_t addr,
+ const unsigned int len)
{
struct linger linger;
tprints("}");
}
+static void
+print_get_linger(struct tcb *const tcp, const kernel_ulong_t addr,
+ unsigned int len)
+{
+ struct linger linger;
+
+ if (len < sizeof(linger)) {
+ if (len != sizeof(linger.l_onoff)) {
+ printstr_ex(tcp, addr, len, QUOTE_FORCE_HEX);
+ return;
+ }
+ } else {
+ len = sizeof(linger);
+ }
+
+ if (umoven(tcp, addr, len, &linger) < 0) {
+ printaddr(addr);
+ return;
+ }
+
+ PRINT_FIELD_D("{", linger, l_onoff);
+ if (len == sizeof(linger))
+ PRINT_FIELD_D(", ", linger, l_linger);
+ tprints("}");
+}
+
#ifdef SO_PEERCRED
static void
print_ucred(struct tcb *const tcp, const kernel_ulong_t addr, const int len)
case SOL_SOCKET:
switch (name) {
case SO_LINGER:
- print_linger(tcp, addr, len);
+ print_get_linger(tcp, addr, len);
return;
#ifdef SO_PEERCRED
case SO_PEERCRED:
case SOL_SOCKET:
switch (name) {
case SO_LINGER:
- print_linger(tcp, addr, len);
+ print_set_linger(tcp, addr, len);
return;
}
break;