svn commit: r321652 - head/lib/libc/x86/sys
Konstantin Belousov
kib at FreeBSD.org
Fri Jul 28 12:22:33 UTC 2017
Author: kib
Date: Fri Jul 28 12:22:32 2017
New Revision: 321652
URL: https://svnweb.freebsd.org/changeset/base/321652
Log:
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
Modified:
head/lib/libc/x86/sys/__vdso_gettc.c
Modified: head/lib/libc/x86/sys/__vdso_gettc.c
==============================================================================
--- head/lib/libc/x86/sys/__vdso_gettc.c Fri Jul 28 11:51:55 2017 (r321651)
+++ head/lib/libc/x86/sys/__vdso_gettc.c Fri Jul 28 12:22:32 2017 (r321652)
@@ -197,25 +197,24 @@ __vdso_init_hpet(uint32_t u)
if (old_map != NULL)
return;
- if (cap_getmode(&mode) == 0 && mode != 0)
- 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;
+ }
- fd = _open(devname, O_RDONLY);
- if (fd == -1)
- goto fail;
-
new_map = mmap(NULL, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, 0);
_close(fd);
if (atomic_cmpset_rel_ptr((volatile uintptr_t *)&hpet_dev_map[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
More information about the svn-src-all
mailing list