[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [V3 PATCH 13/13] linux-user: writev Partial Writes
From: |
Tom Musta |
Subject: |
[Qemu-ppc] [V3 PATCH 13/13] linux-user: writev Partial Writes |
Date: |
Wed, 13 Aug 2014 14:04:48 -0500 |
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>
---
V2: Use bool instead of int for "bad_address" per Peter Maydell's review.
linux-user/syscall.c | 16 ++++++++++++++--
1 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index edc48e1..fb54f0e 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1798,6 +1798,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;
@@ -1838,9 +1839,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;
--
1.7.1
- [Qemu-ppc] [V3 PATCH 02/13] linux-user: Dereference Pointer Argument to ipc/semctl Sys Call, (continued)
- [Qemu-ppc] [V3 PATCH 02/13] linux-user: Dereference Pointer Argument to ipc/semctl Sys Call, Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 05/13] linux-user: Conditionally Pass Attribute Pointer to mq_open(), Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 03/13] linux-user: Properly Handle semun Structure In Cross-Endian Situations, Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 06/13] linux-user: Detect Negative Message Sizes in msgsnd System Call, Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 04/13] linux-user: Make ipc syscall's third argument an abi_long, Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 08/13] linux-user: Detect fault in sched_rr_get_interval, Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 07/13] linux-user: Handle NULL sched_param argument to sched_*, Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 11/13] linux-user: clock_nanosleep errno Handling on PPC, Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 09/13] linux-user: Move get_ppc64_abi, Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 10/13] linux-user: Minimum Sig Handler Stack Size for PPC64 ELF V2, Tom Musta, 2014/08/13
- [Qemu-ppc] [V3 PATCH 13/13] linux-user: writev Partial Writes,
Tom Musta <=
- [Qemu-ppc] [V3 PATCH 12/13] linux-user: Support target-to-host translation of mlockall argument, Tom Musta, 2014/08/13
- Re: [Qemu-ppc] [Qemu-devel] [V3 PATCH 00/13] target-ppc: Linux-User Mode Bug Fixes for Power, Riku Voipio, 2014/08/14