Fix core corruption caused by race in note_procstat_vmmap
authorcem <cem@FreeBSD.org>
Tue, 6 Oct 2015 18:07:00 +0000 (18:07 +0000)
committercem <cem@FreeBSD.org>
Tue, 6 Oct 2015 18:07:00 +0000 (18:07 +0000)
commit9c1e214f79cb8f8fb38ba2f8fa010f282ec5be79
tree9844297e32023403c9df2beefdd3462b21290b04
parenta6f4f28b545e1f0632ba4b20b86a7ab487932373
Fix core corruption caused by race in note_procstat_vmmap

This fix is spiritually similar to r287442 and was discovered thanks to
the KASSERT added in that revision.

NT_PROCSTAT_VMMAP output length, when packing kinfo structs, is tied to
the length of filenames corresponding to vnodes in the process' vm map
via vn_fullpath.  As vnodes may move during coredump, this is racy.

We do not remove the race, only prevent it from causing coredump
corruption.

- Add a sysctl, kern.coredump_pack_vmmapinfo, to allow users to disable
  kinfo packing for PROCSTAT_VMMAP notes.  This avoids VMMAP corruption
  and truncation, even if names change, at the cost of up to PATH_MAX
  bytes per mapped object.  The new sysctl is documented in core.5.

- Fix note_procstat_vmmap to self-limit in the second pass.  This
  addresses corruption, at the cost of sometimes producing a truncated
  result.

- Fix PROCSTAT_VMMAP consumers libutil (and libprocstat, via copy-paste)
  to grok the new zero padding.

Reported by: pho (https://people.freebsd.org/~pho/stress/log/datamove4-2.txt)
Relnotes: yes
Sponsored by: EMC / Isilon Storage Division
Differential Revision: https://reviews.freebsd.org/D3824
lib/libprocstat/libprocstat.c
lib/libutil/kinfo_getvmmap.c
share/man/man5/core.5
sys/kern/imgact_elf.c
sys/kern/kern_exec.c
sys/kern/kern_proc.c
sys/sys/exec.h
sys/sys/user.h