Use the kernel's MAX_ERRNO in the syscall stubs.
Bug: http://code.google.com/p/android/issues/detail?id=53104
Change-Id: Iaabf7025b153e96dc5eca231a33a32d4cb7d8116
diff --git a/libc/arch-arm/bionic/clone.S b/libc/arch-arm/bionic/clone.S
index 13bc7d7..281230c 100644
--- a/libc/arch-arm/bionic/clone.S
+++ b/libc/arch-arm/bionic/clone.S
@@ -26,6 +26,7 @@
* SUCH DAMAGE.
*/
+#include <linux/err.h>
#include <machine/asm.h>
#include <sys/linux-syscalls.h>
@@ -45,10 +46,12 @@
movs r0, r0
beq 1f
- # In parent, reload saved registers then either exit or set errno.
+ # In parent, reload saved registers then either return or set errno.
ldmfd sp!, {r4, r7}
- bxpl lr
- b __set_syscall_errno
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno
1: # The child.
# pick the function arg and call address off the stack and jump
@@ -94,10 +97,12 @@
movs r0, r0
beq 1f
- # In the parent, reload saved registers then either exit or set errno.
+ # In the parent, reload saved registers then either return or set errno.
ldmfd sp!, {r4, r5, r6, r7}
- bxpl lr
- b __set_syscall_errno
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno
1: # The child.
ldr r0, [sp, #-4]
diff --git a/libc/arch-arm/bionic/kill.S b/libc/arch-arm/bionic/kill.S
index 33dfc2b..7e030f3 100644
--- a/libc/arch-arm/bionic/kill.S
+++ b/libc/arch-arm/bionic/kill.S
@@ -32,6 +32,8 @@
abort due to a fatal runtime error (e.g. detection
of a corrupted malloc heap).
*/
+
+#include <linux/err.h>
#include <sys/linux-syscalls.h>
#include <machine/asm.h>
@@ -44,7 +46,8 @@
ldr r7, =__NR_kill
swi #0
ldmfd sp!, {r4-r7, ip, lr}
- movs r0, r0
- bxpl lr
- b __set_syscall_errno
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno
END(kill)
diff --git a/libc/arch-arm/bionic/syscall.S b/libc/arch-arm/bionic/syscall.S
index 69f3bec..be9591e 100644
--- a/libc/arch-arm/bionic/syscall.S
+++ b/libc/arch-arm/bionic/syscall.S
@@ -26,6 +26,7 @@
* SUCH DAMAGE.
*/
+#include <linux/err.h>
#include <machine/asm.h>
#include <sys/linux-syscalls.h>
@@ -39,7 +40,8 @@
ldmfd ip, {r3, r4, r5, r6}
swi #0
ldmfd sp!, {r4, r5, r6, r7}
- movs r0, r0
- bxpl lr
- b __set_syscall_errno
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno
END(syscall)
diff --git a/libc/arch-arm/bionic/tgkill.S b/libc/arch-arm/bionic/tgkill.S
index da5c0af..60df9e6 100644
--- a/libc/arch-arm/bionic/tgkill.S
+++ b/libc/arch-arm/bionic/tgkill.S
@@ -33,6 +33,7 @@
of a corrupted malloc heap).
*/
+#include <linux/err.h>
#include <sys/linux-syscalls.h>
#include <machine/asm.h>
@@ -45,7 +46,8 @@
ldr r7, =__NR_tgkill
swi #0
ldmfd sp!, {r4-r7, ip, lr}
- movs r0, r0
- bxpl lr
- b __set_syscall_errno
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno
END(tgkill)
diff --git a/libc/arch-arm/bionic/tkill.S b/libc/arch-arm/bionic/tkill.S
index fdc5ed4..d5bb739 100644
--- a/libc/arch-arm/bionic/tkill.S
+++ b/libc/arch-arm/bionic/tkill.S
@@ -33,6 +33,7 @@
of a corrupted malloc heap).
*/
+#include <linux/err.h>
#include <sys/linux-syscalls.h>
#include <machine/asm.h>
@@ -45,7 +46,8 @@
ldr r7, =__NR_tkill
swi #0
ldmfd sp!, {r4-r7, ip, lr}
- movs r0, r0
- bxpl lr
- b __set_syscall_errno
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno
END(tkill)