static void
print_set_linger(struct tcb *const tcp, const kernel_ulong_t addr,
- const unsigned int len)
+ const int len)
{
struct linger linger;
- if (len < sizeof(linger) ||
- umove(tcp, addr, &linger) < 0) {
+ if (len < (int) sizeof(linger)) {
printaddr(addr);
- return;
+ } else if (!umove_or_printaddr(tcp, addr, &linger)) {
+ PRINT_FIELD_D("{", linger, l_onoff);
+ PRINT_FIELD_D(", ", linger, l_linger);
+ tprints("}");
}
-
- PRINT_FIELD_D("{", linger, l_onoff);
- PRINT_FIELD_D(", ", linger, l_linger);
- tprints("}");
}
static void
fd, linger->l_onoff, linger->l_linger,
(unsigned int) sizeof(*linger) + 1, errstr);
+ /* setsockopt with optlen < 0 - EINVAL */
+ set_linger(fd, linger, -1U);
+ printf("setsockopt(%d, SOL_SOCKET, SO_LINGER, %p, -1) = %s\n",
+ fd, linger, errstr);
+
/* setsockopt with optlen smaller than necessary - EINVAL */
set_linger(fd, linger, sizeof(linger->l_onoff));
printf("setsockopt(%d, SOL_SOCKET, SO_LINGER, %p, %d) = %s\n",