SHA256
1
0
forked from pool/qemu
qemu/0036-linux-user-lseek-explicitly-cast-no.patch
Bruce Rogers 5819c49528 Accepting request 210801 from home:bfrogers:branches:Virtualization
Adjust for recently fixed acpica package, Do a better? work around for roms/Makefile issue. Rework changes file for suitability for openSUSE:Factory checkin.

OBS-URL: https://build.opensuse.org/request/show/210801
OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=170
2013-12-13 14:49:46 +00:00

39 lines
1.4 KiB
Diff

From 2a97fe64cb1a621b99dcb4f5f37f30264e63bbbd Mon Sep 17 00:00:00 2001
From: Alexander Graf <agraf@suse.de>
Date: Thu, 13 Dec 2012 14:29:22 +0100
Subject: [PATCH] linux-user: lseek: explicitly cast non-set offsets to signed
When doing lseek, SEEK_SET indicates that the offset is an unsigned variable.
Other seek types have parameters that can be negative.
When converting from 32bit to 64bit parameters, we need to take this into
account and enable SEEK_END and SEEK_CUR to be negative, while SEEK_SET stays
absolute positioned which we need to maintain as unsigned.
Signed-off-by: Alexander Graf <agraf@suse.de>
---
linux-user/syscall.c | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index b794666..4f7327a 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -5723,9 +5723,14 @@ abi_long do_syscall(void *cpu_env, int num, abi_ulong arg1,
case TARGET_NR_oldstat:
goto unimplemented;
#endif
- case TARGET_NR_lseek:
- ret = get_errno(lseek(arg1, arg2, arg3));
+ case TARGET_NR_lseek: {
+ off_t off = arg2;
+ if (arg3 != SEEK_SET) {
+ off = (abi_long)arg2;
+ }
+ ret = get_errno(lseek(arg1, off, arg3));
break;
+ }
#if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA)
/* Alpha specific */
case TARGET_NR_getxpid: