dynamic_debug: enlarge command/query write buffer
authorJim Cromie <jim.cromie@gmail.com>
Mon, 19 Dec 2011 22:13:07 +0000 (17:13 -0500)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 24 Jan 2012 20:48:55 +0000 (12:48 -0800)
Current query write buffer is 256 bytes, on stack.  In comparison, the
ddebug_query boot-arg is 1024.  Allocate the buffer off heap, and
enlarge it to 4096 bytes, big enough for ~100 queries (at 40 bytes
each), and error out if not.  This makes it play nicely with large
query sets (to be added later).  The buffer should be enough for most
uses, and others should probably be split into subsets.

[jbaron@redhat.com: changed USER_BUF_PAGE from 4095 -> 4096 ]
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Signed-off-by: Jason Baron <jbaron@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
lib/dynamic_debug.c

index 86a9abb9a1ce832e3872d7a4f5d553c4a147447e..d8773dcd83c50a6d077009ee5e102d48da1271bb 100644 (file)
@@ -570,24 +570,32 @@ __setup("ddebug_query=", ddebug_setup_query);
  * File_ops->write method for <debugfs>/dynamic_debug/conrol.  Gathers the
  * command text from userspace, parses and executes it.
  */
+#define USER_BUF_PAGE 4096
 static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf,
                                  size_t len, loff_t *offp)
 {
-       char tmpbuf[256];
+       char *tmpbuf;
        int ret;
 
        if (len == 0)
                return 0;
-       /* we don't check *offp -- multiple writes() are allowed */
-       if (len > sizeof(tmpbuf)-1)
+       if (len > USER_BUF_PAGE - 1) {
+               pr_warn("expected <%d bytes into control\n", USER_BUF_PAGE);
                return -E2BIG;
-       if (copy_from_user(tmpbuf, ubuf, len))
+       }
+       tmpbuf = kmalloc(len + 1, GFP_KERNEL);
+       if (!tmpbuf)
+               return -ENOMEM;
+       if (copy_from_user(tmpbuf, ubuf, len)) {
+               kfree(tmpbuf);
                return -EFAULT;
+       }
        tmpbuf[len] = '\0';
        if (verbose)
                pr_info("read %d bytes from userspace\n", (int)len);
 
        ret = ddebug_exec_query(tmpbuf);
+       kfree(tmpbuf);
        if (ret)
                return ret;