Skip to content

Commit

Permalink
[qemu-usermode] make sure scratchbox2 can hook fcntl(64). JB#48738
Browse files Browse the repository at this point in the history
  • Loading branch information
krnlyng committed Jan 29, 2020
1 parent c90ac8d commit acf616f
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 0 deletions.
136 changes: 136 additions & 0 deletions rpm/0017-Revert-linux-user-Use-safe_syscall-wrapper-for-fcntl.patch
@@ -0,0 +1,136 @@
From 4a3009c3e98c7c67cf3ba1aacca8a533f0b960e0 Mon Sep 17 00:00:00 2001
From: Frajo Haider <f_haider@gmx.at>
Date: Wed, 29 Jan 2020 12:42:08 +0000
Subject: [PATCH 17/17] Revert "linux-user: Use safe_syscall wrapper for fcntl"

This reverts commit 435da5e7092aa54e12044b9401b42c4a9333c74d.

Conflicts:
linux-user/syscall.c
slirp
---
linux-user/syscall.c | 36 ++++++++++++------------------------
1 file changed, 12 insertions(+), 24 deletions(-)

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 26c80f6..859cce2 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -808,16 +808,6 @@ safe_syscall5(int, mq_timedreceive, int, mqdes, char *, msg_ptr,
* the libc function.
*/
#define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
-/* Similarly for fcntl. Note that callers must always:
- * pass the F_GETLK64 etc constants rather than the unsuffixed F_GETLK
- * use the flock64 struct rather than unsuffixed flock
- * This will then work and use a 64-bit offset for both 32-bit and 64-bit hosts.
- */
-#ifdef __NR_fcntl64
-#define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__)
-#else
-#define safe_fcntl(...) safe_syscall(__NR_fcntl, __VA_ARGS__)
-#endif

static inline int host_to_target_sock_type(int host_type)
{
@@ -6223,7 +6213,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
if (ret) {
return ret;
}
- ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
+ ret = get_errno(fcntl(fd, host_cmd, &fl64));
if (ret == 0) {
ret = copy_to_user_flock(arg, &fl64);
}
@@ -6235,7 +6225,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
if (ret) {
return ret;
}
- ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
+ ret = get_errno(fcntl(fd, host_cmd, &fl64));
break;

case TARGET_F_GETLK64:
@@ -6243,7 +6233,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
if (ret) {
return ret;
}
- ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
+ ret = get_errno(fcntl(fd, host_cmd, &fl64));
if (ret == 0) {
ret = copy_to_user_flock64(arg, &fl64);
}
@@ -6254,25 +6244,23 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
if (ret) {
return ret;
}
- ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
+ ret = get_errno(fcntl(fd, host_cmd, &fl64));
break;

case TARGET_F_GETFL:
- ret = get_errno(safe_fcntl(fd, host_cmd, arg));
+ ret = get_errno(fcntl(fd, host_cmd, arg));
if (ret >= 0) {
ret = host_to_target_bitmask(ret, fcntl_flags_tbl);
}
break;

case TARGET_F_SETFL:
- ret = get_errno(safe_fcntl(fd, host_cmd,
- target_to_host_bitmask(arg,
- fcntl_flags_tbl)));
+ ret = get_errno(fcntl(fd, host_cmd, target_to_host_bitmask(arg, fcntl_flags_tbl)));
break;

#ifdef F_GETOWN_EX
case TARGET_F_GETOWN_EX:
- ret = get_errno(safe_fcntl(fd, host_cmd, &fox));
+ ret = get_errno(fcntl(fd, host_cmd, &fox));
if (ret >= 0) {
if (!lock_user_struct(VERIFY_WRITE, target_fox, arg, 0))
return -TARGET_EFAULT;
@@ -6290,7 +6278,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
fox.type = tswap32(target_fox->type);
fox.pid = tswap32(target_fox->pid);
unlock_user_struct(target_fox, arg, 0);
- ret = get_errno(safe_fcntl(fd, host_cmd, &fox));
+ ret = get_errno(fcntl(fd, host_cmd, &fox));
break;
#endif

@@ -6302,11 +6290,11 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
case TARGET_F_GETLEASE:
case TARGET_F_SETPIPE_SZ:
case TARGET_F_GETPIPE_SZ:
- ret = get_errno(safe_fcntl(fd, host_cmd, arg));
+ ret = get_errno(fcntl(fd, host_cmd, arg));
break;

default:
- ret = get_errno(safe_fcntl(fd, cmd, arg));
+ ret = get_errno(fcntl(fd, cmd, arg));
break;
}
return ret;
@@ -11070,7 +11058,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
if (ret) {
break;
}
- ret = get_errno(safe_fcntl(arg1, cmd, &fl));
+ ret = get_errno(fcntl(arg1, cmd, &fl));
if (ret == 0) {
ret = copyto(arg3, &fl);
}
@@ -11082,7 +11070,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
if (ret) {
break;
}
- ret = get_errno(safe_fcntl(arg1, cmd, &fl));
+ ret = get_errno(fcntl(arg1, cmd, &fl));
break;
default:
ret = do_fcntl(arg1, arg2, arg3);
--
1.8.3-rc3

2 changes: 2 additions & 0 deletions rpm/qemu-usermode.spec
Expand Up @@ -36,6 +36,8 @@ Patch13: 0014-Revert-tcg-Add-INDEX_op_dupm_vec.patch
Patch14: 0015-qemu-usermode-make-sure-mode-is-passed-to-openat-if-.patch
# make sure utimensat from glibc is being used (see sb2 fixes above)
Patch15: 0016-Revert-util-drop-old-utimensat-compat-code.patch
# one more revert for sb2
Patch16: 0017-Revert-linux-user-Use-safe_syscall-wrapper-for-fcntl.patch

BuildRequires: pkgconfig(ext2fs)
BuildRequires: pkgconfig(glib-2.0)
Expand Down

0 comments on commit acf616f

Please sign in to comment.