User mode emulation returns wrong value for write(fd, NULL, 0)
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
QEMU version: latest master (fcea73709b966a
OS version: Ubuntu 14.04.5
Configured with: ../configure --target-
QEMU Linux usermode emulation does not handle write() syscalls with zero length and a null pointer correctly: on Linux this returns 0, but in emulation this returns -1.
I ran into this while using an aarch64 abuild-tar from Alpine Linux in user-mode emulation; here's the minimized reproduction test case:
zhuowei@
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
ssize_t ret = write(STDOUT_
fprintf(stderr, "write returned %ld\n", ret);
return 0;
}
zhuowei@
zhuowei@
Linux zhuowei-tablet 3.13.0-129-generic #178-Ubuntu SMP Fri Aug 11 12:48:20 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
zhuowei@
write returned 0
zhuowei@
write returned -1
zhuowei@
qemu-x86_64 version 2.10.50 (v2.10.
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
description: | updated |
Changed in qemu: | |
status: | Fix Committed → Fix Released |
This happens for me also, with qemu version 2.12.0 (Debian 1:2.12+dfsg-3).
An initial patch was proposed here: https:/ /lists. gnu.org/ archive/ html/qemu- devel/2017- 09/msg08073. html
Discussion pointed out some problems, and the patch languished and was not accepted.
Here is a summary of the changes needed for it to be more likely for the patch to be accepted: https:/ /lists. gnu.org/ archive/ html/qemu- devel/2018- 02/msg03964. html
- change from "ret = 0" to something like "ret = get_errno( safe_write( arg1, NULL, 0))"
- change TARGET_NR_read to do the same, instead of its current short-circuit behaviour for count==0
- check pread64/pwrite64 to see if they need a similar change as well