Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102813600
D33248.id99412.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D33248.id99412.diff
View Options
Index: lib/libc/sys/procctl.2
===================================================================
--- lib/libc/sys/procctl.2
+++ lib/libc/sys/procctl.2
@@ -430,15 +430,20 @@
.Er ECAPMODE
error.
If the control is enabled, such errors from the syscalls cause
-delivery of the synchronous
+delivery of either a synchronous
.Dv SIGTRAP
+or
+.Dv SIGCAP
signal to the thread immediately before returning from the syscalls.
+The former is useful for debugging processes that are unexpectedly failing in
+capability mode, the latter is intended to be caught by the process and used to
+handle the failure within the process.
.Pp
Possible values for the
.Fa data
argument are:
.Bl -tag -width PROC_TRAPCAP_CTL_DISABLE
-.It Dv PROC_TRAPCAP_CTL_ENABLE
+.It Dv PROC_TRAPCAP_CTL_ENABLE_SIGTRAP
Enable the
.Dv SIGTRAP
signal delivery on capability mode access violations.
@@ -446,6 +451,18 @@
and is kept after
.Xr fexecve 2
calls.
+.It Dv PROC_TRAPCAP_CTL_ENABLE
+is an alias for
+.Dv PROC_TRAPCAP_CTL_ENABLE_SIGTRAP
+for legacy compatibility.
+.It Dv PROC_TRAPCAP_CTL_ENABLE_SIGCAP
+Enable the
+.Dv SIGCAP
+signal delivery on capability mode access violations.
+The enabled mode is inherited by the children of the process,
+and is kept after
+.Xr fexecve 2
+calls.
.It Dv PROC_TRAPCAP_CTL_DISABLE
Disable the signal delivery on capability mode access violations.
Note that the global sysctl
Index: sys/kern/kern_procctl.c
===================================================================
--- sys/kern/kern_procctl.c
+++ sys/kern/kern_procctl.c
@@ -408,12 +408,24 @@
PROC_LOCK_ASSERT(p, MA_OWNED);
state = *(int *)data;
- switch (state) {
+ /*
+ * The low two bits of the state indicate whether trapping should be
+ * enabled or disabled (0b01 enable, 0b10 disable). In the enable
+ * commands, bit 2 indicates whether the signal should be SIGTRAP (0) or
+ * SIGCAP (1).
+ */
+ switch (state & 3) {
case PROC_TRAPCAP_CTL_ENABLE:
p->p_flag2 |= P2_TRAPCAP;
+ if (state == PROC_TRAPCAP_CTL_ENABLE_SIGCAP) {
+ p->p_flag2 |= P2_SIGCAP;
+ } else {
+ p->p_flag2 &= ~P2_SIGCAP;
+ }
break;
case PROC_TRAPCAP_CTL_DISABLE:
p->p_flag2 &= ~P2_TRAPCAP;
+ p->p_flag2 &= ~P2_SIGCAP;
break;
default:
return (EINVAL);
@@ -427,8 +439,10 @@
int *status;
status = data;
- *status = (p->p_flag2 & P2_TRAPCAP) != 0 ? PROC_TRAPCAP_CTL_ENABLE :
- PROC_TRAPCAP_CTL_DISABLE;
+ *status = (p->p_flag2 & P2_TRAPCAP) != 0 ?
+ (((p->p_flag2 & P2_SIGCAP) != 0) ?
+ PROC_TRAPCAP_CTL_ENABLE_SIGCAP : PROC_TRAPCAP_CTL_ENABLE) :
+ PROC_TRAPCAP_CTL_DISABLE;
return (0);
}
Index: sys/kern/subr_syscall.c
===================================================================
--- sys/kern/subr_syscall.c
+++ sys/kern/subr_syscall.c
@@ -225,7 +225,8 @@
if ((trap_enotcap ||
(p->p_flag2 & P2_TRAPCAP) != 0) && IN_CAPABILITY_MODE(td)) {
ksiginfo_init_trap(&ksi);
- ksi.ksi_signo = SIGTRAP;
+ ksi.ksi_signo =
+ ((p->p_flag2 & P2_SIGCAP) == 0) ? SIGTRAP : SIGCAP;
ksi.ksi_errno = td->td_errno;
ksi.ksi_code = TRAP_CAP;
ksi.ksi_info.si_syscall = sa->original_code;
Index: sys/sys/proc.h
===================================================================
--- sys/sys/proc.h
+++ sys/sys/proc.h
@@ -841,6 +841,7 @@
#define P2_NO_NEW_PRIVS 0x00008000 /* Ignore setuid */
#define P2_WXORX_DISABLE 0x00010000 /* WX mappings enabled */
#define P2_WXORX_ENABLE_EXEC 0x00020000 /* WXORX enabled after exec */
+#define P2_SIGCAP 0x00040000 /* SIGCAP on ENOTCAPABLE */
/* Flags protected by proctree_lock, kept in p_treeflags. */
#define P_TREE_ORPHANED 0x00000001 /* Reparented, on orphan list */
Index: sys/sys/procctl.h
===================================================================
--- sys/sys/procctl.h
+++ sys/sys/procctl.h
@@ -67,6 +67,8 @@
#define PROC_NO_NEW_PRIVS_STATUS 20 /* query suid/sgid disabled status */
#define PROC_WXMAP_CTL 21 /* control W^X */
#define PROC_WXMAP_STATUS 22 /* query W^X */
+#define PROC_SIGCAP_CTL 23 /* signal on capability errors */
+#define PROC_SIGCAP_STATUS 24 /* query signal on capability status */
/* Operations for PROC_SPROTECT (passed in integer arg). */
#define PPROT_OP(x) ((x) & 0xf)
@@ -129,6 +131,8 @@
#define PROC_TRAPCAP_CTL_ENABLE 1
#define PROC_TRAPCAP_CTL_DISABLE 2
+#define PROC_TRAPCAP_CTL_ENABLE_SIGTRAP PROC_TRAPCAP_CTL_ENABLE
+#define PROC_TRAPCAP_CTL_ENABLE_SIGCAP (PROC_TRAPCAP_CTL_ENABLE | 4)
#define PROC_ASLR_FORCE_ENABLE 1
#define PROC_ASLR_FORCE_DISABLE 2
Index: sys/sys/signal.h
===================================================================
--- sys/sys/signal.h
+++ sys/sys/signal.h
@@ -131,6 +131,7 @@
#define SIGTHR 32 /* reserved by thread library. */
#define SIGLWP SIGTHR
#define SIGLIBRT 33 /* reserved by real-time library. */
+#define SIGCAP 34 /* Capsicum violation. */
#endif
#define SIGRTMIN 65
Index: usr.bin/proccontrol/proccontrol.c
===================================================================
--- usr.bin/proccontrol/proccontrol.c
+++ usr.bin/proccontrol/proccontrol.c
@@ -232,8 +232,11 @@
break;
case MODE_TRAPCAP:
switch (arg) {
- case PROC_TRAPCAP_CTL_ENABLE:
- printf("enabled\n");
+ case PROC_TRAPCAP_CTL_ENABLE_SIGTRAP:
+ printf("enabled, delivering SIGTRAP\n");
+ break;
+ case PROC_TRAPCAP_CTL_ENABLE_SIGCAP:
+ printf("enabled, delivering SIGCAP\n");
break;
case PROC_TRAPCAP_CTL_DISABLE:
printf("disabled\n");
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Nov 18, 12:53 PM (16 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14698032
Default Alt Text
D33248.id99412.diff (5 KB)
Attached To
Mode
D33248: Optionally deliver SIGCAP on capsicum violations.
Attached
Detach File
Event Timeline
Log In to Comment