bionic: fix __set_errno for arm64 syscalls that return a 64-bit value
bionic/libc/arch-arm64/syscalls/read.S ends with: b.hi __set_errno ret END(read) If __set_errno returns int, it will set w0 to 0xFFFFFFFF, which means x0 is 0x00000000FFFFFFFF. When interpreted as a ssize_t that is INT_MAX, not -1. Change __set_errno to return long, which will cause x0 to be set instead of w0. Change-Id: I9f9ea0f2995928d2ea240eb2ff7758ecdf0ff412
This commit is contained in:

committed by
Elliott Hughes

parent
d4bc9ef83b
commit
3d19a8319b
@@ -18,6 +18,7 @@
|
||||
#include "ScopedSignalHandler.h"
|
||||
#include "TemporaryFile.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@@ -88,3 +89,25 @@ TEST(unistd, pause) {
|
||||
ASSERT_EQ(-1, pause());
|
||||
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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user