| From | jim.cromie@gmail ... | Subject | [PATCH 10/26] dynamic_debug: enlarge command/query write buffer | Date | Wed, 21 Sep 2011 15:54:59 -0600 |
| |
From: Jim Cromie <jim.cromie@gmail.com>
Current write buffer is 256 bytes, on stack. Allocate it off heap, and enlarge it to 4096 bytes, big enough for ~100 queries (at 40 bytes each), and error out if not. This should be enough for most uses, and others can be split into 2 writes.
This makes it play nicely with: $> cat debug-queries-file > /dbg/dynamic_debug/control
Signed-off-by: Jim Cromie <jim.cromie@gmail.com> --- lib/dynamic_debug.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 4bf27f3..2b3393f 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -590,24 +590,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 4095 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_queries(tmpbuf); + kfree(tmpbuf); if (ret) return ret; -- 1.7.4.4
|