summaryrefslogtreecommitdiffstats
path: root/libc
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-02-18 20:31:01 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-02-18 20:31:01 +0000
commitffe026680edaba268330bc67dd986d2c900ecfc7 (patch)
tree18c7511d7f5025db420b1b49820ac241ec280501 /libc
parent7f15e28dd4184015a2c990b6e45c33c35b251935 (diff)
parent3d19a8319b9c27af8aa5cfbf495da0fe7fa62d3e (diff)
downloadbionic-ffe026680edaba268330bc67dd986d2c900ecfc7.zip
bionic-ffe026680edaba268330bc67dd986d2c900ecfc7.tar.gz
bionic-ffe026680edaba268330bc67dd986d2c900ecfc7.tar.bz2
Merge "bionic: fix __set_errno for arm64 syscalls that return a 64-bit value"
Diffstat (limited to 'libc')
-rw-r--r--libc/bionic/__set_errno.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/libc/bionic/__set_errno.cpp b/libc/bionic/__set_errno.cpp
index af6a68e..236aeac 100644
--- a/libc/bionic/__set_errno.cpp
+++ b/libc/bionic/__set_errno.cpp
@@ -31,8 +31,19 @@
// This function is called from our assembler syscall stubs.
// C/C++ code should just assign 'errno' instead.
-// TODO: this should be __LIBC_HIDDEN__ but was exposed in <errno.h> in the NDK.
-extern "C" int __set_errno(int n) {
+// The return type is 'long' because we use the same routine in calls
+// that return an int as in ones that return a ssize_t. On a 32-bit
+// system these are the same size, but on a 64-bit system they're not.
+// 'long' gives us 32-bit on 32-bit systems, 64-bit on 64-bit systems.
+
+#if __LP64__
+extern "C" __LIBC_HIDDEN__ long __set_errno(int);
+#else
+// __set_errno was mistakenly exposed in <errno.h> in the 32-bit NDK.
+extern "C" long __set_errno(int);
+#endif
+
+long __set_errno(int n) {
errno = n;
return -1;
}