Defect #683
closedLinux syscalls return negative value on error
100%
Description
I believe the general convention on Linux systems is that all
syscall return a negative value on error and that the error code
it the absolute of this value.
When I look at the code in amd64linuxrun.asm
:
; standard fopen function .code fopen mov eax, 2 mov rdi, [rsp + 8] mov rsi, [rsp + 16] cmp byte [rsi], 'w' mov rsi, 0 jne skip mov rsi, 01 + 0100 skip: mov rdx, 04 + 040 + 0200 + 0400 syscall ; sys_open cmp eax, -1 je fail ret fail: mov eax, 0 ret
The return code is compared to -1, but this is only valid if using a syscall wrapper
which typical captures the error return code, stores this in errno and return -1 in case
of a error.
This is what all online documentation of syscalls shows as it does not reflect
using these directly from assembler code.
I checked this and when opening a non-existing file for reading the return value
if the direct syscall is -2 which is error ENOENT (=2).
Perhaps the runtime code should be update to follow c syscall wrappers and store
the return code in a global errno integer if it is negative and return -1 on failure?
This will create problems with multiple threads, but that is probably ok.
Updated by Florian Negele 7 months ago
- Status changed from New to Closed
- % Done changed from 0 to 100
The next release fixes the error checking, thanks for reporting. The return code will be stored in a thread-local variable called errno sometime in the future.