From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753291AbZCDFH0 (ORCPT ); Wed, 4 Mar 2009 00:07:26 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1750739AbZCDFHM (ORCPT ); Wed, 4 Mar 2009 00:07:12 -0500 Received: from hrndva-omtalb.mail.rr.com ([71.74.56.123]:53169 "EHLO hrndva-omtalb.mail.rr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750717AbZCDFHK (ORCPT ); Wed, 4 Mar 2009 00:07:10 -0500 Date: Wed, 4 Mar 2009 00:07:07 -0500 (EST) From: Steven Rostedt X-X-Sender: rostedt@gandalf.stny.rr.com To: LKML cc: Theodore Tso , Andrew Morton , Ingo Molnar , Peter Zijlstra , Frederic Weisbecker , Arjan van de Ven , Pekka Paalanen , Arnaldo Carvalho de Melo , "H. Peter Anvin" , Mathieu Desnoyers , Martin Bligh , "Frank Ch. Eigler" , Tom Zanussi , Masami Hiramatsu , KOSAKI Motohiro , Jason Baron , Christoph Hellwig , Jiaying Zhang , Eduard - Gabriel Munteanu , mrubin@google.com, md@google.com, Steven Rostedt Subject: [PATCH] fs: make simple_read_from_buffer conventional In-Reply-To: <20090304044614.GL32284@mit.edu> Message-ID: References: <20090304024921.153061228@goodmis.org> <20090304025251.015368537@goodmis.org> <20090303193501.0055e329.akpm@linux-foundation.org> <20090304044614.GL32284@mit.edu> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Impact: have simple_read_from_buffer conform to standards It was brought to my attention by Andrew Morton, Theodore Tso, and H. Peter Anvin that a read from userspace should only return -EFAULT if nothing was actually read. Looking at the simple_read_from_buffer I noticed that this function does not conform to that rule. This patch fixes that function. Signed-off-by: Steven Rostedt diff --git a/fs/libfs.c b/fs/libfs.c index 49b4409..6a72298 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -525,14 +525,20 @@ ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos, const void *from, size_t available) { loff_t pos = *ppos; + size_t ret; + if (pos < 0) return -EINVAL; if (pos >= available) return 0; if (count > available - pos) count = available - pos; - if (copy_to_user(to, from + pos, count)) - return -EFAULT; + ret = copy_to_user(to, from + pos, count); + if (ret) { + if (ret == count) + return -EFAULT; + count -= ret; + } *ppos = pos + count; return count; }