svn commit: r321650 - stable/11/lib/libc/x86/sys
Konstantin Belousov
kib at FreeBSD.org
Fri Jul 28 10:31:00 UTC 2017
Author: kib
Date: Fri Jul 28 10:30:59 2017
New Revision: 321650
URL: https://svnweb.freebsd.org/changeset/base/321650
Log:
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.
Modified:
stable/11/lib/libc/x86/sys/__vdso_gettc.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/lib/libc/x86/sys/__vdso_gettc.c
==============================================================================
--- stable/11/lib/libc/x86/sys/__vdso_gettc.c Fri Jul 28 04:41:57 2017 (r321649)
+++ stable/11/lib/libc/x86/sys/__vdso_gettc.c Fri Jul 28 10:30:59 2017 (r321650)
@@ -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
More information about the svn-src-stable-11
mailing list