qemu-e2k/linux-user
Tony Garnock-Jones 58cfa6c2e6 linux-user: write(fd, NULL, 0) parity with linux's treatment of same
Bring linux-user write(2) handling into line with linux for the case
of a 0-byte write with a NULL buffer. Based on a patch originally
written by Zhuowei Zhang.

Addresses https://bugs.launchpad.net/qemu/+bug/1716292.

>From Zhuowei Zhang's patch (https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg08073.html):

    Linux returns success for the special case of calling write with a
    zero-length NULL buffer: compiling and running

    int main() {
       ssize_t ret = write(STDOUT_FILENO, NULL, 0);
       fprintf(stderr, "write returned %ld\n", ret);
       return 0;
    }

    gives "write returned 0" when run directly, but "write returned
    -1" in QEMU.

    This commit checks for this situation and returns success if
    found.

Subsequent discussion raised the following questions (and my answers):

 - Q. Should TARGET_NR_read pass through to safe_read in this
      situation too?
   A. I'm wary of changing unrelated code to the specific problem I'm
      addressing. TARGET_NR_read is already consistent with Linux for
      this case.

 - Q. Do pread64/pwrite64 need to be changed similarly?
   A. Experiment suggests not: both linux and linux-user yield -1 for
      NULL 0-length reads/writes.

Signed-off-by: Tony Garnock-Jones <tonygarnockjones@gmail.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20180908182205.GB409@mornington.dcs.gla.ac.uk>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
2018-09-25 22:36:49 +02:00
..
aarch64 linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
alpha linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
arm linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
cris linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
generic linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
host linux-user: ppc64: don't use volatile register during safe_syscall 2018-07-31 09:57:43 +02:00
hppa linux-user/hppa: Fix typo in mknodat syscall 2018-06-11 14:45:44 +02:00
i386 linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
m68k linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
microblaze linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
mips elf: Don't check FCR31_NAN2008 bit for nanoMIPS 2018-08-24 17:51:59 +02:00
mips64 linux-user: Update MIPS syscall numbers up to kernel 4.18 headers 2018-08-16 19:18:45 +02:00
nios2 linux-user: Do not report "syscall not implemented" by default 2018-07-09 00:52:04 +02:00
openrisc linux-user: Fix struct sigaltstack for openrisc 2018-07-03 22:40:33 +09:00
ppc linux-user/ppc: Implement swapcontext syscall 2018-07-22 21:33:45 +02:00
riscv linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
s390x linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
sh4 linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
sparc linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
sparc64 linux-user/sparc64: Add inotify_rm_watch and tee syscalls 2018-06-11 14:47:45 +02:00
tilegx linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
x86_64 linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
xtensa linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
cpu_loop-common.h linux-user: create a dummy per arch cpu_loop.c 2018-04-30 09:47:55 +02:00
elfload.c linux-user: elf: mmap all the target-pages of hostpage for data segment 2018-09-25 22:36:49 +02:00
errno_defs.h linux-user: Handle ERFKILL and EHWPOISON 2017-01-22 18:14:10 -08:00
exit.c linux-user: add gcov support to preexit_cleanup 2018-07-05 15:59:41 +01:00
fd-trans.c linux-user: move TargetFdTrans functions to their own file 2018-09-25 22:36:47 +02:00
fd-trans.h linux-user: move TargetFdTrans functions to their own file 2018-09-25 22:36:47 +02:00
flat.h
flatload.c linux-user: Use is_error() to avoid warnings and make the code clearer 2018-06-11 14:40:11 +02:00
ioctls.h linux-user: Implement ioctl cmd TIOCGPTPEER 2018-02-18 18:52:32 +01:00
linux_loop.h
linuxload.c
m68k-sim.c
main.c qom: convert the CPU list to RCU 2018-08-23 18:46:25 +02:00
Makefile.objs linux-user: move TargetFdTrans functions to their own file 2018-09-25 22:36:47 +02:00
mmap.c linux-user/mmap.c: handle invalid len maps correctly 2018-07-31 09:57:25 +02:00
qemu.h linux-user/ppc: Implement swapcontext syscall 2018-07-22 21:33:45 +02:00
safe-syscall.S
signal-common.h linux-user: introduce target_sigsp() and target_save_altstack() 2018-05-03 18:29:15 +02:00
signal.c linux-user: Implement signals for openrisc 2018-07-03 22:40:33 +09:00
socket.h linux-user: update ARCH_HAS_SOCKET_TYPES use 2018-05-25 10:10:55 +02:00
strace.c linux-user: Add preprocessor availability control to some syscalls 2018-08-16 19:18:45 +02:00
strace.list linux-user/strace: Improve recvmsg() output 2018-07-03 16:27:15 +02:00
syscall_defs.h linux-user: add SO_LINGER to {g,s}etsockopt 2018-09-25 22:36:49 +02:00
syscall_types.h linux-user: Add FICLONE and FICLONERANGE ioctls 2017-02-16 15:29:30 +01:00
syscall.c linux-user: write(fd, NULL, 0) parity with linux's treatment of same 2018-09-25 22:36:49 +02:00
target_flat.h
trace-events trace-events: fix code style: print 0x before hex numbers 2017-08-01 12:13:07 +01:00
uaccess.c
uname.c
uname.h
vm86.c