[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v3 21/22] linux-user: writev Partial Writes
From: |
riku . voipio |
Subject: |
[Qemu-devel] [PULL v3 21/22] linux-user: writev Partial Writes |
Date: |
Fri, 22 Aug 2014 16:24:39 +0300 |
From: Tom Musta <address@hidden>
Although not technically not required by POSIX, the writev system call will
typically write out its buffers individually. That is, if the first buffer
is written successfully, but the second buffer pointer is invalid, then
the first chuck will be written and its size is returned.
Signed-off-by: Tom Musta <address@hidden>
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Riku Voipio <address@hidden>
---
linux-user/syscall.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 1da216e..ebdc70e 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1803,6 +1803,7 @@ static struct iovec *lock_iovec(int type, abi_ulong
target_addr,
abi_ulong total_len, max_len;
int i;
int err = 0;
+ bool bad_address = false;
if (count == 0) {
errno = 0;
@@ -1843,9 +1844,20 @@ static struct iovec *lock_iovec(int type, abi_ulong
target_addr,
vec[i].iov_base = 0;
} else {
vec[i].iov_base = lock_user(type, base, len, copy);
+ /* If the first buffer pointer is bad, this is a fault. But
+ * subsequent bad buffers will result in a partial write; this
+ * is realized by filling the vector with null pointers and
+ * zero lengths. */
if (!vec[i].iov_base) {
- err = EFAULT;
- goto fail;
+ if (i == 0) {
+ err = EFAULT;
+ goto fail;
+ } else {
+ bad_address = true;
+ }
+ }
+ if (bad_address) {
+ len = 0;
}
if (len > max_len - total_len) {
len = max_len - total_len;
--
2.0.1
- [Qemu-devel] [PULL v3 02/22] linux-user: redirect openat calls, (continued)
- [Qemu-devel] [PULL v3 02/22] linux-user: redirect openat calls, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 10/22] linux-user: Dereference Pointer Argument to ipc/semctl Sys Call, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 09/22] linux-user: PPC64 semid_ds Doesnt Include _unused1 and _unused2, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 04/22] linux-user: Fix conversion of sigevent argument to timer_create, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 12/22] linux-user: Make ipc syscall's third argument an abi_long, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 18/22] linux-user: Minimum Sig Handler Stack Size for PPC64 ELF V2, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 19/22] linux-user: clock_nanosleep errno Handling on PPC, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 16/22] linux-user: Detect fault in sched_rr_get_interval, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 22/22] linux-user: check return value of malloc(), riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 15/22] linux-user: Handle NULL sched_param argument to sched_*, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 21/22] linux-user: writev Partial Writes,
riku . voipio <=
- [Qemu-devel] [PULL v3 13/22] linux-user: Conditionally Pass Attribute Pointer to mq_open(), riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 20/22] linux-user: Support target-to-host translation of mlockall argument, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 14/22] linux-user: Detect Negative Message Sizes in msgsnd System Call, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 11/22] linux-user: Properly Handle semun Structure In Cross-Endian Situations, riku . voipio, 2014/08/22
- [Qemu-devel] [PULL v3 17/22] linux-user: Move get_ppc64_abi, riku . voipio, 2014/08/22
- Re: [Qemu-devel] [PULL v3 00/22] Linux-user updates, Peter Maydell, 2014/08/22