diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2017-07-28 12:22:32 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2017-07-28 12:22:32 +0000 |
commit | d00ed7642f402de60d6662fdf8d7104e577c3890 (patch) | |
tree | 9da7833871b41bcddd901fc2fb4e302d25fa2a9d /lib | |
parent | ec92fc80857cb4a9bc97c9fc1d76c0e2f6cf814d (diff) | |
download | src-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')
-rw-r--r-- | lib/libc/x86/sys/__vdso_gettc.c | 23 |
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 |