app/procinfo: fix sprintf overrun
authorAndy Green <andy@warmcat.com>
Mon, 14 May 2018 05:01:02 +0000 (13:01 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 14 May 2018 21:32:23 +0000 (23:32 +0200)
app/proc-info/main.c: In function ‘nic_xstats_display’:
app/proc-info/main.c:495:45: error:
‘%s’ directive writing up to 255 bytes into a regioni of size between 165 and 232
[-Werror=format-overflow=]
    sprintf(buf, "PUTVAL %s/dpdkstat-port.%u/%s-%s N:%"
                                             ^~
     PRIu64"\n", host_id, port_id, counter_type,
                                   ~~~~~~~~~~~~
app/proc-info/main.c:495:4: note:
‘sprintf’ output between 31 and 435 bytes into a destination of size 256
    sprintf(buf, "PUTVAL %s/dpdkstat-port.%u/%s-%s N:%"
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     PRIu64"\n", host_id, port_id, counter_type,
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     xstats_names[i].name, values[i]);

Fixes: 2deb6b5246d7 ("app/procinfo: add collectd format and host id")
Cc: stable@dpdk.org
Signed-off-by: Andy Green <andy@warmcat.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
app/proc-info/main.c

index 539e132..c20effa 100644 (file)
@@ -488,14 +488,18 @@ nic_xstats_display(uint16_t port_id)
                if (enable_collectd_format) {
                        char counter_type[MAX_STRING_LEN];
                        char buf[MAX_STRING_LEN];
+                       size_t n;
 
                        collectd_resolve_cnt_type(counter_type,
                                                  sizeof(counter_type),
                                                  xstats_names[i].name);
-                       sprintf(buf, "PUTVAL %s/dpdkstat-port.%u/%s-%s N:%"
+                       n = snprintf(buf, MAX_STRING_LEN,
+                               "PUTVAL %s/dpdkstat-port.%u/%s-%s N:%"
                                PRIu64"\n", host_id, port_id, counter_type,
                                xstats_names[i].name, values[i]);
-                       ret = write(stdout_fd, buf, strlen(buf));
+                       if (n > sizeof(buf) - 1)
+                               n = sizeof(buf) - 1;
+                       ret = write(stdout_fd, buf, n);
                        if (ret < 0)
                                goto err;
                } else {