Revert "coredump: Snapshot the vmas in do_coredump"
This reverts commit 936c8be4d1.
It breaks the abi and is not needed for Android devices so it can be
dropped.
Bug: 161946584
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I2af6e8472f55475bbb841e04ad18a84fdd2d9379
This commit is contained in:
@@ -53,8 +53,6 @@
|
||||
|
||||
#include <trace/events/sched.h>
|
||||
|
||||
static bool dump_vma_snapshot(struct coredump_params *cprm);
|
||||
|
||||
int core_uses_pid;
|
||||
unsigned int core_pipe_limit;
|
||||
char core_pattern[CORENAME_MAX_SIZE] = "core";
|
||||
@@ -604,7 +602,6 @@ void do_coredump(const kernel_siginfo_t *siginfo)
|
||||
* by any locks.
|
||||
*/
|
||||
.mm_flags = mm->flags,
|
||||
.vma_meta = NULL,
|
||||
};
|
||||
|
||||
audit_core_dumps(siginfo->si_signo);
|
||||
@@ -810,13 +807,9 @@ void do_coredump(const kernel_siginfo_t *siginfo)
|
||||
pr_info("Core dump to |%s disabled\n", cn.corename);
|
||||
goto close_fail;
|
||||
}
|
||||
if (!dump_vma_snapshot(&cprm))
|
||||
goto close_fail;
|
||||
|
||||
file_start_write(cprm.file);
|
||||
core_dumped = binfmt->core_dump(&cprm);
|
||||
file_end_write(cprm.file);
|
||||
kvfree(cprm.vma_meta);
|
||||
}
|
||||
if (ispipe && core_pipe_limit)
|
||||
wait_for_dump_helpers(cprm.file);
|
||||
@@ -1092,11 +1085,14 @@ static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
|
||||
* Under the mmap_lock, take a snapshot of relevant information about the task's
|
||||
* VMAs.
|
||||
*/
|
||||
static bool dump_vma_snapshot(struct coredump_params *cprm)
|
||||
int dump_vma_snapshot(struct coredump_params *cprm, int *vma_count,
|
||||
struct core_vma_metadata **vma_meta,
|
||||
size_t *vma_data_size_ptr)
|
||||
{
|
||||
struct vm_area_struct *vma, *gate_vma;
|
||||
struct mm_struct *mm = current->mm;
|
||||
int i;
|
||||
size_t vma_data_size = 0;
|
||||
|
||||
/*
|
||||
* Once the stack expansion code is fixed to not change VMA bounds
|
||||
@@ -1104,21 +1100,20 @@ static bool dump_vma_snapshot(struct coredump_params *cprm)
|
||||
* mmap_lock in read mode.
|
||||
*/
|
||||
if (mmap_write_lock_killable(mm))
|
||||
return false;
|
||||
return -EINTR;
|
||||
|
||||
cprm->vma_data_size = 0;
|
||||
gate_vma = get_gate_vma(mm);
|
||||
cprm->vma_count = mm->map_count + (gate_vma ? 1 : 0);
|
||||
*vma_count = mm->map_count + (gate_vma ? 1 : 0);
|
||||
|
||||
cprm->vma_meta = kvmalloc_array(cprm->vma_count, sizeof(*cprm->vma_meta), GFP_KERNEL);
|
||||
if (!cprm->vma_meta) {
|
||||
*vma_meta = kvmalloc_array(*vma_count, sizeof(**vma_meta), GFP_KERNEL);
|
||||
if (!*vma_meta) {
|
||||
mmap_write_unlock(mm);
|
||||
return false;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
|
||||
vma = next_vma(vma, gate_vma), i++) {
|
||||
struct core_vma_metadata *m = cprm->vma_meta + i;
|
||||
struct core_vma_metadata *m = (*vma_meta) + i;
|
||||
|
||||
m->start = vma->vm_start;
|
||||
m->end = vma->vm_end;
|
||||
@@ -1128,14 +1123,13 @@ static bool dump_vma_snapshot(struct coredump_params *cprm)
|
||||
|
||||
mmap_write_unlock(mm);
|
||||
|
||||
if (WARN_ON(i != cprm->vma_count)) {
|
||||
kvfree(cprm->vma_meta);
|
||||
return false;
|
||||
if (WARN_ON(i != *vma_count)) {
|
||||
kvfree(*vma_meta);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < cprm->vma_count; i++) {
|
||||
struct core_vma_metadata *m = cprm->vma_meta + i;
|
||||
for (i = 0; i < *vma_count; i++) {
|
||||
struct core_vma_metadata *m = (*vma_meta) + i;
|
||||
|
||||
if (m->dump_size == DUMP_SIZE_MAYBE_ELFHDR_PLACEHOLDER) {
|
||||
char elfmag[SELFMAG];
|
||||
@@ -1148,8 +1142,9 @@ static bool dump_vma_snapshot(struct coredump_params *cprm)
|
||||
}
|
||||
}
|
||||
|
||||
cprm->vma_data_size += m->dump_size;
|
||||
vma_data_size += m->dump_size;
|
||||
}
|
||||
|
||||
return true;
|
||||
*vma_data_size_ptr = vma_data_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user