Print this page
OS-3825 lxbrand rsyslogd abort on centos6
OS-4047 lxbrand vsyscall while SIGSEGV? on next trap we're handler-free!
Reviewed by: Bryan Cantrill <bryan@joyent.com>

@@ -30,11 +30,11 @@
 /*      Copyright (c) 1987, 1988 Microsoft Corporation          */
 /*              All Rights Reserved                             */
 /*                                                              */
 
 /*
- * Copyright 2012 Joyent, Inc. All rights reserved.
+ * Copyright 2015 Joyent, Inc.
  */
 
 #include <sys/types.h>
 #include <sys/sysmacros.h>
 #include <sys/param.h>

@@ -99,10 +99,11 @@
 #include <sys/mach_mmu.h>
 #if defined(__xpv)
 #include <sys/hypervisor.h>
 #endif
 #include <sys/contract/process_impl.h>
+#include <sys/brand.h>
 
 #define USER    0x10000         /* user-mode flag added to trap type */
 
 static const char *trap_type_mnemonic[] = {
         "de",   "db",   "2",    "bp",

@@ -860,10 +861,21 @@
                                 goto out;
                         do_watch_step(vaddr, sz, rw, 0, 0);
                         fault_type = F_INVAL;
                 }
 
+                /*
+                 * Allow the brand to interpose on invalid memory accesses
+                 * prior to running the native pagefault handler.  If this
+                 * brand hook returns zero, it was able to handle the fault
+                 * completely.  Otherwise, drive on and call pagefault().
+                 */
+                if (PROC_IS_BRANDED(p) && BROP(p)->b_pagefault != NULL &&
+                    BROP(p)->b_pagefault(p, lwp, addr, fault_type, rw) == 0) {
+                        goto out;
+                }
+
                 res = pagefault(addr, fault_type, rw, 0);
 
                 /*
                  * If pagefault() succeeded, ok.
                  * Otherwise attempt to grow the stack.