[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 22/23] linux-user: writev Partial Writes
From: |
riku . voipio |
Subject: |
[Qemu-devel] [PULL v2 22/23] linux-user: writev Partial Writes |
Date: |
Tue, 19 Aug 2014 11:32:57 +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 c4f6454..3b1beff 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 v2 04/23] linux-user: Fix conversion of sigevent argument to timer_create, (continued)
- [Qemu-devel] [PULL v2 04/23] linux-user: Fix conversion of sigevent argument to timer_create, riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 01/23] linux-user: /proc/self/maps content, riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 16/23] linux-user: Handle NULL sched_param argument to sched_*, riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 13/23] linux-user: Make ipc syscall's third argument an abi_long, riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 17/23] linux-user: Detect fault in sched_rr_get_interval, riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 15/23] linux-user: Detect Negative Message Sizes in msgsnd System Call, riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 20/23] linux-user: clock_nanosleep errno Handling on PPC, riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 23/23] linux-user: check return value of malloc(), riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 14/23] linux-user: Conditionally Pass Attribute Pointer to mq_open(), riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 18/23] linux-user: Move get_ppc64_abi, riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 22/23] linux-user: writev Partial Writes,
riku . voipio <=
- [Qemu-devel] [PULL v2 21/23] linux-user: Support target-to-host translation of mlockall argument, riku . voipio, 2014/08/19
- [Qemu-devel] [PULL v2 19/23] linux-user: Minimum Sig Handler Stack Size for PPC64 ELF V2, riku . voipio, 2014/08/19
- Re: [Qemu-devel] [PULL v2 00/23] linux-user updates, Peter Maydell, 2014/08/19