summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2017-07-28 10:30:59 +0000
committerkib <kib@FreeBSD.org>2017-07-28 10:30:59 +0000
commita34bf7e39604a98feeec348d8b49988a92e05bf5 (patch)
treee1e0ac3c78c544514a4efb5aea7ab2f9be746b8b /lib
parent38e00c130261e5380801f3c57ad388c4388c77d8 (diff)
downloadFreeBSD-src-a34bf7e39604a98feeec348d8b49988a92e05bf5.zip
FreeBSD-src-a34bf7e39604a98feeec348d8b49988a92e05bf5.tar.gz
MFC r314319 (by oshogbo):
Don't try to open devices in the gettc() function which will always fail in the Capability mode. Instead silently fallback to the syscall method, which is done for example in the gettimeofday(2) function. MFC r314320 (by oshogbo): Remove unneeded variable initialization from r314319. MFC r321461: Fix indent.
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/x86/sys/__vdso_gettc.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/lib/libc/x86/sys/__vdso_gettc.c b/lib/libc/x86/sys/__vdso_gettc.c
index bf46a10..16af7d8 100644
--- a/lib/libc/x86/sys/__vdso_gettc.c
+++ b/lib/libc/x86/sys/__vdso_gettc.c
@@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include "namespace.h"
+#include <sys/capsicum.h>
#include <sys/elf.h>
#include <sys/fcntl.h>
#include <sys/mman.h>
@@ -124,6 +125,7 @@ __vdso_init_hpet(uint32_t u)
static const char devprefix[] = "/dev/hpet";
char devname[64], *c, *c1, t;
volatile char *new_map, *old_map;
+ unsigned int mode;
uint32_t u1;
int fd;
@@ -144,18 +146,25 @@ __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) {
- atomic_cmpset_rel_ptr((volatile uintptr_t *)&hpet_dev_map[u],
- (uintptr_t)old_map, (uintptr_t)MAP_FAILED);
- return;
- }
+ 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
@@ -174,16 +183,22 @@ static void
__vdso_init_hyperv_tsc(void)
{
int fd;
+ unsigned int mode;
+
+ if (cap_getmode(&mode) == 0 && mode != 0)
+ goto fail;
fd = _open(HYPERV_REFTSC_DEVPATH, O_RDONLY);
- if (fd < 0) {
- /* Prevent the caller from re-entering. */
- hyperv_ref_tsc = MAP_FAILED;
- return;
- }
+ if (fd < 0)
+ goto fail;
hyperv_ref_tsc = mmap(NULL, sizeof(*hyperv_ref_tsc), PROT_READ,
MAP_SHARED, fd, 0);
_close(fd);
+
+ return;
+fail:
+ /* Prevent the caller from re-entering. */
+ hyperv_ref_tsc = MAP_FAILED;
}
static int
OpenPOWER on IntegriCloud