Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Feb 2017 22:07:26 +0000 (UTC)
From:      Mariusz Zaborski <oshogbo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r314319 - head/lib/libc/x86/sys
Message-ID:  <201702262207.v1QM7QBk028204@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: oshogbo
Date: Sun Feb 26 22:07:26 2017
New Revision: 314319
URL: https://svnweb.freebsd.org/changeset/base/314319

Log:
  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.
  
  Reviewed by:	kib

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	Sun Feb 26 22:05:22 2017	(r314318)
+++ head/lib/libc/x86/sys/__vdso_gettc.c	Sun Feb 26 22:07:26 2017	(r314319)
@@ -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,26 @@ __vdso_init_hpet(uint32_t u)
 	if (old_map != NULL)
 		return;
 
+	mode = 0;
+	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);
+	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 +184,23 @@ static void
 __vdso_init_hyperv_tsc(void)
 {
 	int fd;
+	unsigned int mode;
+
+	mode = 0;
+	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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201702262207.v1QM7QBk028204>