aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-04-24 11:45:01 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-05-03 16:13:47 +0000
commit86ffb3d1a0cbb09ba0123ff8d34149e691b461c4 (patch)
treeac3dd3f315b8333eedad86c09565bc2a9a355930
parent5bc3c61780d775810eea852936671ca4a232b2a8 (diff)
downloadsrc-86ffb3d1a0cbb09ba0123ff8d34149e691b461c4.tar.gz
src-86ffb3d1a0cbb09ba0123ff8d34149e691b461c4.zip
ELF coredump: define several useful flags for the coredump operations
- SVC_ALL request dumping all map entries, including those marked as non-dumpable - SVC_NOCOMPRESS disallows compressing the dump regardless of the sysctl policy - SVC_PC_COREDUMP is provided for future use by userspace core dump request Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D29955
-rw-r--r--sys/kern/imgact_elf.c31
-rw-r--r--sys/sys/sysent.h5
2 files changed, 25 insertions, 11 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index 77045842a13c..563629b747b5 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -1655,7 +1655,7 @@ int
__elfN(coredump)(struct thread *td, struct vnode *vp, off_t limit, int flags)
{
struct ucred *cred = td->td_ucred;
- int error = 0;
+ int compm, error = 0;
struct sseg_closure seginfo;
struct note_info_list notelst;
struct coredump_params params;
@@ -1706,9 +1706,13 @@ __elfN(coredump)(struct thread *td, struct vnode *vp, off_t limit, int flags)
}
/* Create a compression stream if necessary. */
- if (compress_user_cores != 0) {
+ compm = compress_user_cores;
+ if ((flags & (SVC_PT_COREDUMP | SVC_NOCOMPRESS)) == SVC_PT_COREDUMP &&
+ compm == 0)
+ compm = COMPRESS_GZIP;
+ if (compm != 0) {
params.comp = compressor_init(core_compressed_write,
- compress_user_cores, CORE_BUF_SIZE,
+ compm, CORE_BUF_SIZE,
compress_user_cores_level, &params);
if (params.comp == NULL) {
error = EFAULT;
@@ -1826,12 +1830,15 @@ each_dumpable_segment(struct thread *td, segment_callback func, void *closure,
* are marked MAP_ENTRY_NOCOREDUMP now so we no longer
* need to arbitrarily ignore such segments.
*/
- if (elf_legacy_coredump) {
- if ((entry->protection & VM_PROT_RW) != VM_PROT_RW)
- continue;
- } else {
- if ((entry->protection & VM_PROT_ALL) == 0)
- continue;
+ if ((flags & SVC_ALL) == 0) {
+ if (elf_legacy_coredump) {
+ if ((entry->protection & VM_PROT_RW) !=
+ VM_PROT_RW)
+ continue;
+ } else {
+ if ((entry->protection & VM_PROT_ALL) == 0)
+ continue;
+ }
}
/*
@@ -1840,9 +1847,11 @@ each_dumpable_segment(struct thread *td, segment_callback func, void *closure,
* madvise(2). Do not dump submaps (i.e. parts of the
* kernel map).
*/
- if (entry->eflags & (MAP_ENTRY_NOCOREDUMP|MAP_ENTRY_IS_SUB_MAP))
+ if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0)
+ continue;
+ if ((entry->eflags & MAP_ENTRY_NOCOREDUMP) != 0 &&
+ (flags & SVC_ALL) == 0)
continue;
-
if ((object = entry->object.vm_object) == NULL)
continue;
diff --git a/sys/sys/sysent.h b/sys/sys/sysent.h
index db729239243f..e6db2ec3dfb1 100644
--- a/sys/sys/sysent.h
+++ b/sys/sys/sysent.h
@@ -171,6 +171,11 @@ struct sysentvec {
#define SV_ABI_CLOUDABI 17
#define SV_ABI_UNDEF 255
+/* sv_coredump flags */
+#define SVC_PT_COREDUMP 0x00000001 /* dump requested by ptrace(2) */
+#define SVC_NOCOMPRESS 0x00000002 /* disable compression. */
+#define SVC_ALL 0x00000004 /* dump everything */
+
#ifdef _KERNEL
extern struct sysentvec aout_sysvec;
extern struct sysent sysent[];