From cb2069bf69b14f0e76593e1ec4d1deb6fa15232c Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 12 Mar 2013 11:55:45 -0700 Subject: [PATCH] Support large errno values on ARM. Bug: http://code.google.com/p/android/issues/detail?id=53104 Change-Id: Ic6c40be2dc50f0644a3d8b09ceae59c38f2d5b53 --- libc/bionic/__set_errno.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/libc/bionic/__set_errno.cpp b/libc/bionic/__set_errno.cpp index 5b249c8bb..c69ca8707 100644 --- a/libc/bionic/__set_errno.cpp +++ b/libc/bionic/__set_errno.cpp @@ -27,6 +27,9 @@ */ #include +#include + +#define unlikely(x) __builtin_expect((x), false) // Used but not defined by . // These functions are called from our assembler syscall stubs. // C/C++ code should just assign 'errno' instead. @@ -39,14 +42,10 @@ extern "C" int __set_errno(int n) { } // TODO: this is only used on ARM, but is exported by NDK on all platforms :-( -extern "C" __LIBC_HIDDEN__ int __set_syscall_errno(int n) { - // Some syscalls, mmap() for example, have valid return - // values that are "negative". Since errno values are not - // greater than 131 on Linux, we will just consider - // anything significantly out of range as not-an-error. - if(n > -256) { - return __set_errno(-n); - } else { - return n; +extern "C" __LIBC_HIDDEN__ int __set_syscall_errno(unsigned long n) { + if (IS_ERR_VALUE(n)) { + errno = -n; + return -1; } + return n; }