From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=53401 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PwIMn-0000LN-Tu for qemu-devel@nongnu.org; Sun, 06 Mar 2011 13:07:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PwIMm-0004aF-Lb for qemu-devel@nongnu.org; Sun, 06 Mar 2011 13:07:41 -0500 Received: from hall.aurel32.net ([88.191.126.93]:41308) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PwIMm-0004a9-FE for qemu-devel@nongnu.org; Sun, 06 Mar 2011 13:07:40 -0500 Date: Sun, 6 Mar 2011 19:07:38 +0100 From: Aurelien Jarno Subject: Re: [Qemu-devel] [PATCH] linux-user: Fix large seeks by 32 bit guest on 64 bit host Message-ID: <20110306180738.GD32068@volta.aurel32.net> References: <1298379746-18484-1-git-send-email-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <1298379746-18484-1-git-send-email-peter.maydell@linaro.org> List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell Cc: Eoghan Sherry , qemu-devel@nongnu.org, patches@linaro.org On Tue, Feb 22, 2011 at 01:02:26PM +0000, Peter Maydell wrote: > When emulating a 32 bit Linux user-mode program on a 64 bit target > we implement the llseek syscall in terms of lseek. Correct a bug > which meant we were silently casting the result of host lseek() > to a 32 bit integer as it passed through get_errno() and thus > throwing away the top half. > > We also don't try to store the result back to userspace unless > the seek succeeded; this matches the kernel behaviour. > > Thanks to Eoghan Sherry for identifying the problem and suggesting > a solution. > > Signed-off-by: Peter Maydell > --- > linux-user/syscall.c | 16 ++++++++++------ > 1 files changed, 10 insertions(+), 6 deletions(-) Thanks, applied. > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index cf8a4c3..23d7a63 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -6127,16 +6127,20 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > #ifdef TARGET_NR__llseek /* Not on alpha */ > case TARGET_NR__llseek: > { > + int64_t res; > #if !defined(__NR_llseek) > - ret = get_errno(lseek(arg1, ((uint64_t )arg2 << 32) | arg3, arg5)); > - if (put_user_s64(ret, arg4)) > - goto efault; > + res = lseek(arg1, ((uint64_t)arg2 << 32) | arg3, arg5); > + if (res == -1) { > + ret = get_errno(res); > + } else { > + ret = 0; > + } > #else > - int64_t res; > ret = get_errno(_llseek(arg1, arg2, arg3, &res, arg5)); > - if (put_user_s64(res, arg4)) > - goto efault; > #endif > + if ((ret == 0) && put_user_s64(res, arg4)) { > + goto efault; > + } > } > break; > #endif > -- > 1.7.1 > > > -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurelien@aurel32.net http://www.aurel32.net