ntb_tool: BUG: Ensure the buffer size is large enough to return all spads
authorLogan Gunthorpe <logang@deltatee.com>
Mon, 20 Jun 2016 19:15:08 +0000 (13:15 -0600)
committerJon Mason <jdmason@kudzu.us>
Fri, 5 Aug 2016 14:05:31 +0000 (10:05 -0400)
On hardware with 32 scratchpad registers the spad field in ntb tool
could chop off the end. The maximum buffer size is increased from
256 to 15 times the number or scratchpads.

Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Allen Hubbe <Allen.Hubbe@emc.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
drivers/ntb/test/ntb_tool.c

index 209ef7ceb98a8fe7752c7a9581eb31237ed36f9b..a0ead31cd79946e72beadce0d3cf05b44c860a9d 100644 (file)
@@ -239,7 +239,14 @@ static ssize_t tool_spadfn_read(struct tool_ctx *tc, char __user *ubuf,
        if (!spad_read_fn)
                return -EINVAL;
 
-       buf_size = min_t(size_t, size, 0x100);
+       spad_count = ntb_spad_count(tc->ntb);
+
+       /*
+        * We multiply the number of spads by 15 to get the buffer size
+        * this is from 3 for the %d, 10 for the largest hex value
+        * (0x00000000) and 2 for the tab and line feed.
+        */
+       buf_size = min_t(size_t, size, spad_count * 15);
 
        buf = kmalloc(buf_size, GFP_KERNEL);
        if (!buf)
@@ -247,7 +254,6 @@ static ssize_t tool_spadfn_read(struct tool_ctx *tc, char __user *ubuf,
 
        pos = 0;
 
-       spad_count = ntb_spad_count(tc->ntb);
        for (i = 0; i < spad_count; ++i) {
                pos += scnprintf(buf + pos, buf_size - pos, "%d\t%#x\n",
                                 i, spad_read_fn(tc->ntb, i));