]> granicus.if.org Git - strace/commitdiff
netlink_sock_diag: enhance decoding of long meminfo arrays
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 12 Jul 2017 21:08:03 +0000 (21:08 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 12 Jul 2017 21:08:03 +0000 (21:08 +0000)
Print trailing dots instead of silent truncation if the array
is too long.

* netlink_sock_diag.c (decode_meminfo): Do not apply SK_MEMINFO_VARS
limit to nmemb, specify element count to print_array instead.
(print_meminfo): Check element count and terminate printing
if the element count exceeds SK_MEMINFO_VARS.
* tests/nlattr_inet_diag_msg.c (main): Check it.

netlink_sock_diag.c
tests/nlattr_inet_diag_msg.c

index f0cb500be3584639542d057e3acc91f2cfeee334..44ec34a1f37b613c0e118923e6a8b27562138096 100644 (file)
@@ -120,6 +120,13 @@ print_meminfo(struct tcb *const tcp,
              const size_t elem_size,
              void *const opaque_data)
 {
+       unsigned int *const count = opaque_data;
+
+       if ((*count)++ >= SK_MEMINFO_VARS) {
+               tprints("...");
+               return false;
+       }
+
        tprintf("%" PRIu32, *(uint32_t *) elem_buf);
 
        return true;
@@ -137,11 +144,9 @@ decode_meminfo(struct tcb *const tcp,
        if (!nmemb)
                return false;
 
-       if (nmemb > SK_MEMINFO_VARS)
-               nmemb = SK_MEMINFO_VARS;
-
+       unsigned int count = 0;
        print_array(tcp, addr, nmemb, &mem, sizeof(mem),
-                   umoven_or_printaddr, print_meminfo, 0);
+                   umoven_or_printaddr, print_meminfo, &count);
 
        return true;
 }
index ca1eedd81084bcfe91cc0b2873dcf85349d5a49f..6a8ffa277b98d0e53aef5ea6ca3c916fdc1fe78d 100644 (file)
@@ -169,6 +169,18 @@ main(void)
                          init_inet_diag_msg, print_inet_diag_msg,
                          INET_DIAG_SKMEMINFO, pattern, mem, print_uint);
 
+       static uint32_t bigmem[SK_MEMINFO_VARS + 1];
+       memcpy(bigmem, pattern, sizeof(bigmem));
+
+       TEST_NLATTR(fd, nlh0, hdrlen, init_inet_diag_msg, print_inet_diag_msg,
+                   INET_DIAG_SKMEMINFO, sizeof(bigmem), bigmem, sizeof(bigmem),
+                   size_t i;
+                   for (i = 0; i < SK_MEMINFO_VARS; ++i) {
+                       printf(i ? ", " : "[");
+                       print_uint(&bigmem[i]);
+                   }
+                   printf(", ...]"));
+
        static const uint32_t mark = 0xabdfadca;
        TEST_NLATTR_OBJECT(fd, nlh0, hdrlen,
                           init_inet_diag_msg, print_inet_diag_msg,