am ffe02668: Merge "bionic: fix __set_errno for arm64 syscalls that return a 64-bit value"
* commit 'ffe026680edaba268330bc67dd986d2c900ecfc7': bionic: fix __set_errno for arm64 syscalls that return a 64-bit value
This commit is contained in:
commit
9df798dcfc
@ -31,8 +31,19 @@
|
|||||||
// This function is called from our assembler syscall stubs.
|
// This function is called from our assembler syscall stubs.
|
||||||
// C/C++ code should just assign 'errno' instead.
|
// C/C++ code should just assign 'errno' instead.
|
||||||
|
|
||||||
// TODO: this should be __LIBC_HIDDEN__ but was exposed in <errno.h> in the NDK.
|
// The return type is 'long' because we use the same routine in calls
|
||||||
extern "C" int __set_errno(int n) {
|
// 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;
|
errno = n;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "ScopedSignalHandler.h"
|
#include "ScopedSignalHandler.h"
|
||||||
#include "TemporaryFile.h"
|
#include "TemporaryFile.h"
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
@ -88,3 +89,25 @@ TEST(unistd, pause) {
|
|||||||
ASSERT_EQ(-1, pause());
|
ASSERT_EQ(-1, pause());
|
||||||
ASSERT_TRUE(gPauseTestFlag);
|
ASSERT_TRUE(gPauseTestFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(unistd, read) {
|
||||||
|
int fd = open("/proc/version", O_RDONLY);
|
||||||
|
ASSERT_TRUE(fd != -1);
|
||||||
|
|
||||||
|
char buf[5];
|
||||||
|
ASSERT_EQ(5, read(fd, buf, 5));
|
||||||
|
ASSERT_EQ(buf[0], 'L');
|
||||||
|
ASSERT_EQ(buf[1], 'i');
|
||||||
|
ASSERT_EQ(buf[2], 'n');
|
||||||
|
ASSERT_EQ(buf[3], 'u');
|
||||||
|
ASSERT_EQ(buf[4], 'x');
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(unistd, read_EBADF) {
|
||||||
|
// read returns ssize_t which is 64-bits on LP64, so it's worth explicitly checking that
|
||||||
|
// our syscall stubs correctly return a 64-bit -1.
|
||||||
|
char buf[1];
|
||||||
|
ASSERT_EQ(-1, read(-1, buf, sizeof(buf)));
|
||||||
|
ASSERT_EQ(EBADF, errno);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user