Lines Matching refs:cprm
56 static bool dump_vma_snapshot(struct coredump_params *cprm);
57 static void free_vma_snapshot(struct coredump_params *cprm);
198 static int format_corename(struct core_name *cn, struct coredump_params *cprm, in format_corename() argument
290 __get_dumpable(cprm->mm_flags)); in format_corename()
295 cprm->siginfo->si_signo); in format_corename()
526 struct coredump_params cprm = { in do_coredump() local
544 if (!__get_dumpable(cprm.mm_flags)) in do_coredump()
556 if (__get_dumpable(cprm.mm_flags) == SUID_DUMP_ROOT) { in do_coredump()
568 ispipe = format_corename(&cn, &cprm, &argv, &argc); in do_coredump()
582 if (cprm.limit == 1) { in do_coredump()
604 cprm.limit = RLIM_INFINITY; in do_coredump()
628 umh_pipe_setup, NULL, &cprm); in do_coredump()
645 if (cprm.limit < binfmt->min_coredump) in do_coredump()
692 cprm.file = file_open_root(&root, cn.corename, in do_coredump()
696 cprm.file = filp_open(cn.corename, open_flags, 0600); in do_coredump()
698 if (IS_ERR(cprm.file)) in do_coredump()
701 inode = file_inode(cprm.file); in do_coredump()
704 if (d_unhashed(cprm.file->f_path.dentry)) in do_coredump()
718 mnt_userns = file_mnt_user_ns(cprm.file); in do_coredump()
730 if (!(cprm.file->f_mode & FMODE_CAN_WRITE)) in do_coredump()
732 if (do_truncate(mnt_userns, cprm.file->f_path.dentry, in do_coredump()
733 0, 0, cprm.file)) in do_coredump()
747 if (!cprm.file) { in do_coredump()
751 if (!dump_vma_snapshot(&cprm)) in do_coredump()
754 file_start_write(cprm.file); in do_coredump()
755 core_dumped = binfmt->core_dump(&cprm); in do_coredump()
762 if (cprm.to_skip) { in do_coredump()
763 cprm.to_skip--; in do_coredump()
764 dump_emit(&cprm, "", 1); in do_coredump()
766 file_end_write(cprm.file); in do_coredump()
767 free_vma_snapshot(&cprm); in do_coredump()
770 wait_for_dump_helpers(cprm.file); in do_coredump()
772 if (cprm.file) in do_coredump()
773 filp_close(cprm.file, NULL); in do_coredump()
793 static int __dump_emit(struct coredump_params *cprm, const void *addr, int nr) in __dump_emit() argument
795 struct file *file = cprm->file; in __dump_emit()
798 if (cprm->written + nr > cprm->limit) in __dump_emit()
808 cprm->written += n; in __dump_emit()
809 cprm->pos += n; in __dump_emit()
814 static int __dump_skip(struct coredump_params *cprm, size_t nr) in __dump_skip() argument
817 struct file *file = cprm->file; in __dump_skip()
822 cprm->pos += nr; in __dump_skip()
826 if (!__dump_emit(cprm, zeroes, PAGE_SIZE)) in __dump_skip()
830 return __dump_emit(cprm, zeroes, nr); in __dump_skip()
834 static int dump_emit_page(struct coredump_params *cprm, struct page *page) in dump_emit_page() argument
842 struct file *file = cprm->file; in dump_emit_page()
846 if (cprm->to_skip) { in dump_emit_page()
847 if (!__dump_skip(cprm, cprm->to_skip)) in dump_emit_page()
849 cprm->to_skip = 0; in dump_emit_page()
851 if (cprm->written + PAGE_SIZE > cprm->limit) in dump_emit_page()
857 n = __kernel_write_iter(cprm->file, &iter, &pos); in dump_emit_page()
861 cprm->written += PAGE_SIZE; in dump_emit_page()
862 cprm->pos += PAGE_SIZE; in dump_emit_page()
867 int dump_emit(struct coredump_params *cprm, const void *addr, int nr) in dump_emit() argument
869 if (cprm->to_skip) { in dump_emit()
870 if (!__dump_skip(cprm, cprm->to_skip)) in dump_emit()
872 cprm->to_skip = 0; in dump_emit()
874 return __dump_emit(cprm, addr, nr); in dump_emit()
878 void dump_skip_to(struct coredump_params *cprm, unsigned long pos) in dump_skip_to() argument
880 cprm->to_skip = pos - cprm->pos; in dump_skip_to()
884 void dump_skip(struct coredump_params *cprm, size_t nr) in dump_skip() argument
886 cprm->to_skip += nr; in dump_skip()
891 int dump_user_range(struct coredump_params *cprm, unsigned long start, in dump_user_range() argument
908 int stop = !dump_emit_page(cprm, page); in dump_user_range()
913 dump_skip(cprm, PAGE_SIZE); in dump_user_range()
920 int dump_align(struct coredump_params *cprm, int align) in dump_align() argument
922 unsigned mod = (cprm->pos + cprm->to_skip) & (align - 1); in dump_align()
926 cprm->to_skip += align - mod; in dump_align()
1120 static void free_vma_snapshot(struct coredump_params *cprm) in free_vma_snapshot() argument
1122 if (cprm->vma_meta) { in free_vma_snapshot()
1124 for (i = 0; i < cprm->vma_count; i++) { in free_vma_snapshot()
1125 struct file *file = cprm->vma_meta[i].file; in free_vma_snapshot()
1129 kvfree(cprm->vma_meta); in free_vma_snapshot()
1130 cprm->vma_meta = NULL; in free_vma_snapshot()
1138 static bool dump_vma_snapshot(struct coredump_params *cprm) in dump_vma_snapshot() argument
1153 cprm->vma_data_size = 0; in dump_vma_snapshot()
1155 cprm->vma_count = mm->map_count + (gate_vma ? 1 : 0); in dump_vma_snapshot()
1157 cprm->vma_meta = kvmalloc_array(cprm->vma_count, sizeof(*cprm->vma_meta), GFP_KERNEL); in dump_vma_snapshot()
1158 if (!cprm->vma_meta) { in dump_vma_snapshot()
1164 struct core_vma_metadata *m = cprm->vma_meta + i; in dump_vma_snapshot()
1169 m->dump_size = vma_dump_size(vma, cprm->mm_flags); in dump_vma_snapshot()
1179 for (i = 0; i < cprm->vma_count; i++) { in dump_vma_snapshot()
1180 struct core_vma_metadata *m = cprm->vma_meta + i; in dump_vma_snapshot()
1193 cprm->vma_data_size += m->dump_size; in dump_vma_snapshot()