|
Message-Id: <1453839994-7649-1-git-send-email-hauke@hauke-m.de> Date: Tue, 26 Jan 2016 21:26:33 +0100 From: Hauke Mehrtens <hauke@...ke-m.de> To: musl@...ts.openwall.com Cc: Hauke Mehrtens <hauke@...ke-m.de> Subject: [PATCH v3 1/2] vdso: clock_gettime: call normal syscall in case of an error When the vdso call returns an error just call the normal syscall and return its result. clock_gettime() only fails with EFAULT if tp points to an inaccessible address space or with EINVAL if the clk_id is unknown. EFAULT is an implementation problem and performance for this case is not important. When it returns EINVAL a normal syscall could still work, so try it. This fixes a bug when an error occurred errno was not set and it was a value different than -1 returned. In addition on MIPS the Linux kernel 4.4 only supports some clk_ids and assumes the libc will call the original function if it gets a -ENOSYS, so do this for all error codes. Signed-off-by: Hauke Mehrtens <hauke@...ke-m.de> --- src/time/clock_gettime.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/time/clock_gettime.c b/src/time/clock_gettime.c index 1572de0..9d3ff7e 100644 --- a/src/time/clock_gettime.c +++ b/src/time/clock_gettime.c @@ -26,16 +26,18 @@ void *__vdsosym(const char *, const char *); int __clock_gettime(clockid_t clk, struct timespec *ts) { #ifdef VDSO_CGT_SYM + int r; static int (*volatile cgt)(clockid_t, struct timespec *); if (!cgt) { void *f = __vdsosym(VDSO_CGT_VER, VDSO_CGT_SYM); if (!f) f = (void *)sc_clock_gettime; a_cas_p(&cgt, 0, f); } - return cgt(clk, ts); -#else - return sc_clock_gettime(clk, ts); + r = cgt(clk, ts); + /* In case an error occurred try the normal syscall */ + if (!r) return r; #endif + return sc_clock_gettime(clk, ts); } weak_alias(__clock_gettime, clock_gettime); -- 2.7.0.rc3
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.