From: Cyrill Gorcunov <gorcunov@gmail.com>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Vegard Nossum <vegard.nossum@gmail.com>,
Ingo Oeser <ioe-lkml@rameria.de>,
bfields@fieldses.org, neilb@suse.de
Subject: [PATCH] sunrpc - fixup userspace buffer possible overrun v3
Date: Sun, 31 Aug 2008 19:25:49 +0400 [thread overview]
Message-ID: <20080831152549.GD2884@lenovo> (raw)
Vegard Nossum reported
----------------------
> I noticed that something weird is going on with /proc/sys/sunrpc/transports.
> This file is generated in net/sunrpc/sysctl.c, function proc_do_xprt(). When
> I "cat" this file, I get the expected output:
> $ cat /proc/sys/sunrpc/transports
> tcp 1048576
> udp 32768
> But I think that it does not check the length of the buffer supplied by
> userspace to read(). With my original program, I found that the stack was
> being overwritten by the characters above, even when the length given to
> read() was just 1.
David Wagner added (among other things) that copy_to_user could be
probably used here.
Ingo Oeser suggested to use simple_read_from_buffer() here.
The conclusion is that proc_do_xprt doesn't check for userside buffer
size indeed so fix this by using Ingo's suggestion.
Reported-by: Vegard Nossum <vegard.nossum@gmail.com>
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
CC: Ingo Oeser <ioe-lkml@rameria.de>
---
Index: linux-2.6.git/net/sunrpc/sysctl.c
===================================================================
--- linux-2.6.git.orig/net/sunrpc/sysctl.c 2008-08-31 18:58:50.000000000 +0400
+++ linux-2.6.git/net/sunrpc/sysctl.c 2008-08-31 19:15:57.000000000 +0400
@@ -60,23 +60,27 @@ static int proc_do_xprt(ctl_table *table
void __user *buffer, size_t *lenp, loff_t *ppos)
{
char tmpbuf[256];
- int len;
+ size_t len;
+ ssize_t ret;
+
if ((*ppos && !write) || !*lenp) {
*lenp = 0;
return 0;
}
+
if (write)
return -EINVAL;
else {
len = svc_print_xprts(tmpbuf, sizeof(tmpbuf));
- if (!access_ok(VERIFY_WRITE, buffer, len))
- return -EFAULT;
-
- if (__copy_to_user(buffer, tmpbuf, len))
- return -EFAULT;
+ ret = simple_read_from_buffer(buffer, *lenp, ppos,
+ tmpbuf, len);
+ if (ret >= 0) {
+ *lenp = ret;
+ ret = 0;
+ }
+ return ret;
}
- *lenp -= len;
- *ppos += len;
+
return 0;
}
next reply other threads:[~2008-08-31 15:26 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-31 15:25 Cyrill Gorcunov [this message]
2008-09-01 1:17 ` [PATCH] sunrpc - fixup userspace buffer possible overrun v3 J. Bruce Fields
2008-09-01 14:07 ` Cyrill Gorcunov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080831152549.GD2884@lenovo \
--to=gorcunov@gmail.com \
--cc=bfields@fieldses.org \
--cc=ioe-lkml@rameria.de \
--cc=linux-kernel@vger.kernel.org \
--cc=neilb@suse.de \
--cc=vegard.nossum@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.