From: Dmitry V. Levin Date: Sun, 9 Jul 2017 18:43:34 +0000 (+0000) Subject: net: enhance decoding of setsockopt's SO_LINGER negative option length X-Git-Tag: v4.19~294 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b5f7cde8a58e1215f4379dd4b2b1b9e366275cb4;p=strace net: enhance decoding of setsockopt's SO_LINGER negative option length * net.c (print_set_linger): Treat negative option length as invalid to match the kernel behaviour. * tests/so_linger.c (main): Check it. --- diff --git a/net.c b/net.c index 78325da8..934e3ecf 100644 --- a/net.c +++ b/net.c @@ -443,19 +443,17 @@ print_sockopt_fd_level_name(struct tcb *tcp, int fd, unsigned int level, 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 diff --git a/tests/so_linger.c b/tests/so_linger.c index 8f106349..4dc994bf 100644 --- a/tests/so_linger.c +++ b/tests/so_linger.c @@ -83,6 +83,11 @@ main(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",