[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 5/6] linux-user: use __get_user and __put_user in cms
From: |
riku . voipio |
Subject: |
[Qemu-devel] [PULL 5/6] linux-user: use __get_user and __put_user in cmsg conversions |
Date: |
Mon, 15 Jun 2015 15:20:49 +0300 |
From: Peter Maydell <address@hidden>
The target payloads in cmsg conversions may not have the alignment
required by the host. Using the get_user and put_user functions is
the easiest way to handle this and also do the byte-swapping we
require.
(Note that prior to this commit target_to_host_cmsg was incorrectly
using __put_user() rather than __get_user() for the SCM_CREDENTIALS
conversion, which meant it wasn't getting the benefit of the
misalignment handling.)
Signed-off-by: Peter Maydell <address@hidden>
Signed-off-by: Riku Voipio <address@hidden>
---
linux-user/syscall.c | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 839ce93..ed99104 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1228,17 +1228,18 @@ static inline abi_long target_to_host_cmsg(struct
msghdr *msgh,
int *target_fd = (int *)target_data;
int i, numfds = len / sizeof(int);
- for (i = 0; i < numfds; i++)
- fd[i] = tswap32(target_fd[i]);
+ for (i = 0; i < numfds; i++) {
+ __get_user(fd[i], target_fd + i);
+ }
} else if (cmsg->cmsg_level == SOL_SOCKET
&& cmsg->cmsg_type == SCM_CREDENTIALS) {
struct ucred *cred = (struct ucred *)data;
struct target_ucred *target_cred =
(struct target_ucred *)target_data;
- __put_user(target_cred->pid, &cred->pid);
- __put_user(target_cred->uid, &cred->uid);
- __put_user(target_cred->gid, &cred->gid);
+ __get_user(cred->pid, &target_cred->pid);
+ __get_user(cred->uid, &target_cred->uid);
+ __get_user(cred->gid, &target_cred->gid);
} else {
gemu_log("Unsupported ancillary data: %d/%d\n",
cmsg->cmsg_level, cmsg->cmsg_type);
@@ -1333,8 +1334,9 @@ static inline abi_long host_to_target_cmsg(struct
target_msghdr *target_msgh,
int *target_fd = (int *)target_data;
int i, numfds = tgt_len / sizeof(int);
- for (i = 0; i < numfds; i++)
- target_fd[i] = tswap32(fd[i]);
+ for (i = 0; i < numfds; i++) {
+ __put_user(fd[i], target_fd + i);
+ }
break;
}
case SO_TIMESTAMP:
@@ -1349,8 +1351,8 @@ static inline abi_long host_to_target_cmsg(struct
target_msghdr *target_msgh,
}
/* copy struct timeval to target */
- target_tv->tv_sec = tswapal(tv->tv_sec);
- target_tv->tv_usec = tswapal(tv->tv_usec);
+ __put_user(tv->tv_sec, &target_tv->tv_sec);
+ __put_user(tv->tv_usec, &target_tv->tv_usec);
break;
}
case SCM_CREDENTIALS:
--
2.1.4
- [Qemu-devel] [PULL 0/6] linux-user patches for 2.4 softfreeze, riku . voipio, 2015/06/15
- [Qemu-devel] [PULL 2/6] linux-user: Use abi_ulong for TARGET_ELF_PAGESTART, riku . voipio, 2015/06/15
- [Qemu-devel] [PULL 5/6] linux-user: use __get_user and __put_user in cmsg conversions,
riku . voipio <=
- [Qemu-devel] [PULL 6/6] linux-user: fix the breakpoint inheritance in spawned threads, riku . voipio, 2015/06/15
- [Qemu-devel] [PULL 1/6] linux-user: Allocate thunk size dynamically, riku . voipio, 2015/06/15
- [Qemu-devel] [PULL 3/6] linux-user: ioctl() command type is int, riku . voipio, 2015/06/15
- [Qemu-devel] [PULL 4/6] linux-user: Fix length handling in host_to_target_cmsg, riku . voipio, 2015/06/15
- Re: [Qemu-devel] [PULL 0/6] linux-user patches for 2.4 softfreeze, Peter Maydell, 2015/06/15