Print this page
OS-5462 lxbrand kernel should be lint clean
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-5354 lx shebang argument handling is incorrect
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
OS-5189 lx dev enumeration can deadlock with zfs
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
OS-4937 lxbrand ptracer count updates can race
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
OS-4460 exec brands processes that still have multiple threads
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
OS-4437 lxbrand ptrace turns harmless signals deadly
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-3742 lxbrand add support for signalfd
OS-4382 remove obsolete brand hooks added during lx development
OS-4306 lxbrand setsockopt(IP_MULTICAST_TTL) handles optlen poorly
OS-4303 lxbrand ltp ptrace05 fails
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
OS-4188 NULL dereference in lwp_hash_in
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
OS-4119 lxbrand panic when running native perl inside lx zone
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4151 setbrand hooks should be sane during fork
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
OS-4129 lxbrand should not abuse p_brand_data for storing exit signal
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
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>
OS-3926 lxbrand in-kernel fchownat(2), fchown(2), lchown(2), chown(2) and 16-bit ID counterparts
OS-3920 lxbrand use native *at(2) system calls for LX emulation
OS-3561 lxbrand emulation library should execute on alternate stack
OS-3558 lxbrand add support for full in-kernel syscall handling
OS-3545 lx_syscall_regs should not walk stack
OS-3868 many LTP testcases now hang
OS-3901 lxbrand lx_recvmsg fails to translate control messages when 64-bit
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Bryan Cantrill <bryan@joyent.com>
OS-3820 lxbrand ptrace(2): the next generation
OS-3685 lxbrand PTRACE_O_TRACEFORK race condition
OS-3834 lxbrand 64-bit strace(1) reports 64-bit process as using x32 ABI
OS-3794 lxbrand panic on init signal death
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Bryan Cantrill <bryan@joyent.com>
OS-3602 lxbrand LTP recv* tests failing on MSG_ERRQUEUE flag
OS-3600 lxbrand 32bit cannot boot with OS-3594 fix
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Bryan Cantrill <bryan@joyent.com>
OS-3594 lx brand: need support for MAP_32BIT
OS-3554 lx brand: node.js test test-fs-append-file.js hangs on 64-bit
OS-3517 lx brand: branded zones don't interpret .interp section
OS-3438 lx brand: "start rsyslog" hangs
OS-2844 lx brand should support 64-bit user-land
OS-3280 need a way to specify the root of a native system in the lx brand
OS-3279 lx brand should allow delegated datasets
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-3149 lx brand always sends SIGCHLD to parent processes, regardless of how clone was invoked
OS-2887 lxbrand add WALL, WCLONE, WNOTHREAD support to waitid
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
        
*** 19,28 ****
--- 19,29 ----
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+  * Copyright 2016, Joyent, Inc.
   */
  
  #ifndef _SYS_BRAND_H
  #define _SYS_BRAND_H
  
*** 100,132 ****
  struct uarg;
  struct brand_mach_ops;
  struct intpdata;
  struct execa;
  
  struct brand_ops {
!         void    (*b_init_brand_data)(zone_t *);
          void    (*b_free_brand_data)(zone_t *);
          int     (*b_brandsys)(int, int64_t *, uintptr_t, uintptr_t, uintptr_t,
!                 uintptr_t, uintptr_t, uintptr_t);
          void    (*b_setbrand)(struct proc *);
          int     (*b_getattr)(zone_t *, int, void *, size_t *);
          int     (*b_setattr)(zone_t *, int, void *, size_t);
          void    (*b_copy_procdata)(struct proc *, struct proc *);
!         void    (*b_proc_exit)(struct proc *, klwp_t *);
          void    (*b_exec)();
          void    (*b_lwp_setrval)(klwp_t *, int, int);
!         int     (*b_initlwp)(klwp_t *);
          void    (*b_forklwp)(klwp_t *, klwp_t *);
          void    (*b_freelwp)(klwp_t *);
          void    (*b_lwpexit)(klwp_t *);
          int     (*b_elfexec)(struct vnode *vp, struct execa *uap,
              struct uarg *args, struct intpdata *idata, int level,
              long *execsz, int setid, caddr_t exec_file,
!             struct cred *cred, int brand_action);
          void    (*b_sigset_native_to_brand)(sigset_t *);
          void    (*b_sigset_brand_to_native)(sigset_t *);
          int     b_nsig;
  };
  
  /*
   * The b_version field must always be the first entry in this struct.
   */
--- 101,205 ----
  struct uarg;
  struct brand_mach_ops;
  struct intpdata;
  struct execa;
  
+ /*
+  * Common structure to define hooks for brand operation.
+  *
+  * Required Fields:
+  * b_init_brand_data - Setup zone brand data during zone_setbrand
+  * b_free_brand_data - Free zone brand data during zone_destroy
+  * b_brandsys - Syscall handler for brandsys
+  * b_setbrand - Initialize process brand data
+  * b_getattr - Get brand-custom zone attribute
+  * b_setattr - Set brand-custom zone attribute
+  * b_copy_procdata - Copy process brand data during fork
+  * b_proc_exit - Perform process brand exit processing
+  * b_exec - Reset branded process state on exec
+  * b_lwp_setrval - Set return code for forked child
+  * b_initlwp - Initialize lwp brand data (cannot drop p->p_lock)
+  * b_forklwp - Copy lwp brand data during fork
+  * b_freelwp - Free lwp brand data
+  * b_lwpexit - Perform lwp-specific brand exit processing
+  * b_elfexec - Load and execute ELF binary
+  * b_sigset_native_to_brand - Convert sigset native->brand
+  * b_sigset_brand_to_native - Convert sigset brand->native
+  * b_nsig - Maxiumum signal number
+  * b_sendsig - Update process state after sendsig
+  *
+  * Optional Fields:
+  * b_lwpdata_alloc - Speculatively allocate data for use in b_initlwp
+  * b_lwpdata_free - Free data from allocated by b_lwpdata_alloc if errors occur
+  *                  during lwp creation before b_initlwp could be called.
+  * b_initlwp_post - Complete lwp branding (can temporarily drop p->p_lock)
+  * b_exit_with_sig - Instead of sending SIGCLD, exit with custom behavior
+  * b_psig_to_proc - Custom additional behavior during psig
+  * b_wait_filter - Filter processes from being matched by waitid
+  * b_native_exec - Provide interpreter path prefix for executables
+  * b_ptrace_exectrap - Custom behavior for legacy ptrace traps
+  * b_map32limit - Specify alternate limit for MAP_32BIT mappings
+  * b_stop_notify - Hook process stop events
+  * b_waitid_helper - Generate synthetic results for waitid
+  * b_sigcld_repost - Post synthetic SIGCLD signals
+  * b_issig_stop - Alter/suppress signal delivery during issig
+  * b_sig_ignorable - Disallow discarding of signals
+  * b_savecontext - Alter context during savecontext
+  * b_restorecontext - Alter context during restorecontext
+  * b_sendsig_stack - Override stack used for signal delivery
+  * b_setid_clear - Override setid_clear behavior
+  * b_pagefault - Trap pagefault events
+  * b_intp_parse_arg - Controls interpreter argument handling (allow 1 or all)
+  */
  struct brand_ops {
!         void    (*b_init_brand_data)(zone_t *, kmutex_t *);
          void    (*b_free_brand_data)(zone_t *);
          int     (*b_brandsys)(int, int64_t *, uintptr_t, uintptr_t, uintptr_t,
!                 uintptr_t);
          void    (*b_setbrand)(struct proc *);
          int     (*b_getattr)(zone_t *, int, void *, size_t *);
          int     (*b_setattr)(zone_t *, int, void *, size_t);
          void    (*b_copy_procdata)(struct proc *, struct proc *);
!         void    (*b_proc_exit)(struct proc *);
          void    (*b_exec)();
          void    (*b_lwp_setrval)(klwp_t *, int, int);
!         void    *(*b_lwpdata_alloc)(struct proc *);
!         void    (*b_lwpdata_free)(void *);
!         void    (*b_initlwp)(klwp_t *, void *);
!         void    (*b_initlwp_post)(klwp_t *);
          void    (*b_forklwp)(klwp_t *, klwp_t *);
          void    (*b_freelwp)(klwp_t *);
          void    (*b_lwpexit)(klwp_t *);
          int     (*b_elfexec)(struct vnode *vp, struct execa *uap,
              struct uarg *args, struct intpdata *idata, int level,
              long *execsz, int setid, caddr_t exec_file,
!             struct cred *cred, int *brand_action);
          void    (*b_sigset_native_to_brand)(sigset_t *);
          void    (*b_sigset_brand_to_native)(sigset_t *);
+         void    (*b_sigfd_translate)(k_siginfo_t *);
          int     b_nsig;
+         void    (*b_exit_with_sig)(proc_t *, sigqueue_t *);
+         boolean_t (*b_wait_filter)(proc_t *, proc_t *);
+         boolean_t (*b_native_exec)(uint8_t, const char **);
+         uint32_t (*b_map32limit)(proc_t *);
+         void    (*b_stop_notify)(proc_t *, klwp_t *, ushort_t, ushort_t);
+         int     (*b_waitid_helper)(idtype_t, id_t, k_siginfo_t *, int,
+             boolean_t *, int *);
+         int     (*b_sigcld_repost)(proc_t *, sigqueue_t *);
+         int     (*b_issig_stop)(proc_t *, klwp_t *);
+         boolean_t (*b_sig_ignorable)(proc_t *, klwp_t *, int);
+         void    (*b_savecontext)(ucontext_t *);
+ #if defined(_SYSCALL32_IMPL)
+         void    (*b_savecontext32)(ucontext32_t *);
+ #endif
+         void    (*b_restorecontext)(ucontext_t *);
+         caddr_t (*b_sendsig_stack)(int);
+         void    (*b_sendsig)(int);
+         int     (*b_setid_clear)(vattr_t *vap, cred_t *cr);
+         int     (*b_pagefault)(proc_t *, klwp_t *, caddr_t, enum fault_type,
+             enum seg_rw);
+         boolean_t b_intp_parse_arg;
  };
  
  /*
   * The b_version field must always be the first entry in this struct.
   */
*** 133,142 ****
--- 206,216 ----
  typedef struct brand {
          int                     b_version;
          char                    *b_name;
          struct brand_ops        *b_ops;
          struct brand_mach_ops   *b_machops;
+         size_t                  b_data_size;
  } brand_t;
  
  extern brand_t native_brand;
  
  /*
*** 163,173 ****
  extern int      brand_unregister(brand_t *);
  extern brand_t  *brand_register_zone(struct brand_attr *);
  extern brand_t  *brand_find_name(char *);
  extern void     brand_unregister_zone(brand_t *);
  extern int      brand_zone_count(brand_t *);
! extern void     brand_setbrand(proc_t *);
  extern void     brand_clearbrand(proc_t *, boolean_t);
  
  /*
   * The following functions can be shared among kernel brand modules which
   * implement Solaris-derived brands, all of which need to do similar tasks to
--- 237,247 ----
  extern int      brand_unregister(brand_t *);
  extern brand_t  *brand_register_zone(struct brand_attr *);
  extern brand_t  *brand_find_name(char *);
  extern void     brand_unregister_zone(brand_t *);
  extern int      brand_zone_count(brand_t *);
! extern int      brand_setbrand(proc_t *, boolean_t);
  extern void     brand_clearbrand(proc_t *, boolean_t);
  
  /*
   * The following functions can be shared among kernel brand modules which
   * implement Solaris-derived brands, all of which need to do similar tasks to
*** 176,196 ****
  extern int      brand_solaris_cmd(int, uintptr_t, uintptr_t, uintptr_t,
                      struct brand *, int);
  extern void     brand_solaris_copy_procdata(proc_t *, proc_t *,
                      struct brand *);
  extern int      brand_solaris_elfexec(vnode_t *, execa_t *, uarg_t *,
!                     intpdata_t *, int, long *, int, caddr_t, cred_t *, int,
!                     struct brand *, char *, char *, char *, char *, char *);
  extern void     brand_solaris_exec(struct brand *);
  extern int      brand_solaris_fini(char **, struct modlinkage *,
                      struct brand *);
  extern void     brand_solaris_forklwp(klwp_t *, klwp_t *, struct brand *);
  extern void     brand_solaris_freelwp(klwp_t *, struct brand *);
! extern int      brand_solaris_initlwp(klwp_t *, struct brand *);
  extern void     brand_solaris_lwpexit(klwp_t *, struct brand *);
! extern void     brand_solaris_proc_exit(struct proc *, klwp_t *,
!                     struct brand *);
  extern void     brand_solaris_setbrand(proc_t *, struct brand *);
  
  #if defined(_SYSCALL32)
  typedef struct brand_elf_data32 {
          uint32_t        sed_phdr;
--- 250,269 ----
  extern int      brand_solaris_cmd(int, uintptr_t, uintptr_t, uintptr_t,
                      struct brand *, int);
  extern void     brand_solaris_copy_procdata(proc_t *, proc_t *,
                      struct brand *);
  extern int      brand_solaris_elfexec(vnode_t *, execa_t *, uarg_t *,
!                     intpdata_t *, int, long *, int, caddr_t, cred_t *, int *,
!                     struct brand *, char *, char *, char *);
  extern void     brand_solaris_exec(struct brand *);
  extern int      brand_solaris_fini(char **, struct modlinkage *,
                      struct brand *);
  extern void     brand_solaris_forklwp(klwp_t *, klwp_t *, struct brand *);
  extern void     brand_solaris_freelwp(klwp_t *, struct brand *);
! extern void     brand_solaris_initlwp(klwp_t *, struct brand *);
  extern void     brand_solaris_lwpexit(klwp_t *, struct brand *);
! extern void     brand_solaris_proc_exit(struct proc *, struct brand *);
  extern void     brand_solaris_setbrand(proc_t *, struct brand *);
  
  #if defined(_SYSCALL32)
  typedef struct brand_elf_data32 {
          uint32_t        sed_phdr;