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
alpha
arm
cris
generic
host
hppa
i386
m68k
microblaze
mips elf: Don't check FCR31_NAN2008 bit for nanoMIPS 2018-08-24 17:51:59 +02:00
mips64
nios2
openrisc
ppc
riscv
s390x
sh4
sparc
sparc64
tilegx
x86_64
xtensa
cpu_loop-common.h
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
exit.c
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
ioctls.h
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
qemu.h
safe-syscall.S
signal-common.h
signal.c
socket.h
strace.c
strace.list
syscall_defs.h linux-user: add SO_LINGER to {g,s}etsockopt 2018-09-25 22:36:49 +02:00
syscall_types.h
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
uaccess.c
uname.c
uname.h
vm86.c