]> granicus.if.org Git - strace/commitdiff
net: enhance decoding of setsockopt's SO_LINGER negative option length
authorDmitry V. Levin <ldv@altlinux.org>
Sun, 9 Jul 2017 18:43:34 +0000 (18:43 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 9 Jul 2017 18:43:34 +0000 (18:43 +0000)
* net.c (print_set_linger): Treat negative option length as invalid
to match the kernel behaviour.
* tests/so_linger.c (main): Check it.

net.c
tests/so_linger.c

diff --git a/net.c b/net.c
index 78325da8607395583d0c38eac3f01d95be0bf7a5..934e3ecfff491d57cf80d8c99a6001317cd3a3cf 100644 (file)
--- 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
index 8f1063497ea252980bdb36c06d950a7518c58820..4dc994bf6268b2b0d9cb8f8be9f02fe9c16fdf2a 100644 (file)
@@ -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",