aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2017-11-28 19:05:18 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-11-28 19:05:18 +0000
commit7d5777ef15136e4e12a27c85d7b06d6806b98e70 (patch)
treeebf184715b7b033ecc4713444976a575c59b7cc7
parent26b80da44a694f068cc13ca58046f6278a363519 (diff)
parent9591df5294527616686c9a99f14a5d94572f637c (diff)
downloadbionic-7d5777ef15136e4e12a27c85d7b06d6806b98e70.tar.gz
Merge "Fix vdso system call fallback failures."
-rw-r--r--libc/bionic/vdso.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/libc/bionic/vdso.cpp b/libc/bionic/vdso.cpp
index 8cdb504d4..969c39f03 100644
--- a/libc/bionic/vdso.cpp
+++ b/libc/bionic/vdso.cpp
@@ -26,11 +26,18 @@
#include <unistd.h>
#include "private/KernelArgumentBlock.h"
+static inline int vdso_return(int result) {
+ if (__predict_true(result == 0)) return 0;
+
+ errno = -result;
+ return -1;
+}
+
int clock_gettime(int clock_id, timespec* tp) {
auto vdso_clock_gettime = reinterpret_cast<decltype(&clock_gettime)>(
__libc_globals->vdso[VDSO_CLOCK_GETTIME].fn);
if (__predict_true(vdso_clock_gettime)) {
- return vdso_clock_gettime(clock_id, tp);
+ return vdso_return(vdso_clock_gettime(clock_id, tp));
}
return __clock_gettime(clock_id, tp);
}
@@ -39,17 +46,15 @@ int gettimeofday(timeval* tv, struct timezone* tz) {
auto vdso_gettimeofday = reinterpret_cast<decltype(&gettimeofday)>(
__libc_globals->vdso[VDSO_GETTIMEOFDAY].fn);
if (__predict_true(vdso_gettimeofday)) {
- return vdso_gettimeofday(tv, tz);
+ return vdso_return(vdso_gettimeofday(tv, tz));
}
return __gettimeofday(tv, tz);
}
void __libc_init_vdso(libc_globals* globals, KernelArgumentBlock& args) {
auto&& vdso = globals->vdso;
- vdso[VDSO_CLOCK_GETTIME] = { VDSO_CLOCK_GETTIME_SYMBOL,
- reinterpret_cast<void*>(__clock_gettime) };
- vdso[VDSO_GETTIMEOFDAY] = { VDSO_GETTIMEOFDAY_SYMBOL,
- reinterpret_cast<void*>(__gettimeofday) };
+ vdso[VDSO_CLOCK_GETTIME] = { VDSO_CLOCK_GETTIME_SYMBOL, nullptr };
+ vdso[VDSO_GETTIMEOFDAY] = { VDSO_GETTIMEOFDAY_SYMBOL, nullptr };
// Do we have a vdso?
uintptr_t vdso_ehdr_addr = args.getauxval(AT_SYSINFO_EHDR);