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
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to