aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libc/x86/sys/__vdso_gettc.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2017-07-28 12:22:32 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2017-07-28 12:22:32 +0000
commitd00ed7642f402de60d6662fdf8d7104e577c3890 (patch)
tree9da7833871b41bcddd901fc2fb4e302d25fa2a9d /lib/libc/x86/sys/__vdso_gettc.c
parentec92fc80857cb4a9bc97c9fc1d76c0e2f6cf814d (diff)
downloadsrc-d00ed7642f402de60d6662fdf8d7104e577c3890.tar.gz
src-d00ed7642f402de60d6662fdf8d7104e577c3890.zip
Simplify flow control.
Also add explicit comment why libc cannot simply rely on open(2) failure in capability mode. Sponsored by: The FreeBSD Foundation MFC after: 1 week
Notes
Notes: svn path=/head/; revision=321652
Diffstat (limited to 'lib/libc/x86/sys/__vdso_gettc.c')
-rw-r--r--lib/libc/x86/sys/__vdso_gettc.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/lib/libc/x86/sys/__vdso_gettc.c b/lib/libc/x86/sys/__vdso_gettc.c
index 04ef426eada6..4ada5e7eac14 100644
--- a/lib/libc/x86/sys/__vdso_gettc.c
+++ b/lib/libc/x86/sys/__vdso_gettc.c
@@ -197,12 +197,17 @@ __vdso_init_hpet(uint32_t u)
if (old_map != NULL)
return;
- if (cap_getmode(&mode) == 0 && mode != 0)
- goto fail;
-
- fd = _open(devname, O_RDONLY);
- if (fd == -1)
- goto fail;
+ /*
+ * Explicitely check for the capability mode to avoid
+ * triggering trap_enocap on the device open by absolute path.
+ */
+ if ((cap_getmode(&mode) == 0 && mode != 0) ||
+ (fd = _open(devname, O_RDONLY)) == -1) {
+ /* Prevent the caller from re-entering. */
+ atomic_cmpset_rel_ptr((volatile uintptr_t *)&hpet_dev_map[u],
+ (uintptr_t)old_map, (uintptr_t)MAP_FAILED);
+ return;
+ }
new_map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, 0);
_close(fd);
@@ -210,12 +215,6 @@ __vdso_init_hpet(uint32_t u)
(uintptr_t)old_map, (uintptr_t)new_map) == 0 &&
new_map != MAP_FAILED)
munmap((void *)new_map, PAGE_SIZE);
-
- return;
-fail:
- /* Prevent the caller from re-entering. */
- atomic_cmpset_rel_ptr((volatile uintptr_t *)&hpet_dev_map[u],
- (uintptr_t)old_map, (uintptr_t)MAP_FAILED);
}
#ifdef WANT_HYPERV