No description
Find a file
David van Moolenbroek b7725c8552 Fix mmap leak in malloc code upon state transfer
The NetBSD libc malloc implementation uses a memory-mapped area for
its page directory.  Since the process heap is reconstructed upon
state transfer for live update, this memory-mapped area must not be
transferred to the new process.  However, as the new instance of the
process being updated inherits all memory-mapped areas of the old
instance, it also automatically inherits the malloc implementation's
page directory.  Thus, we must explicitly free this area in order to
avoid a memory leak.

The magic pass already detects (de)allocation functions called from
within other (de)allocation functions, which is why the mmap(2) and
munmap(2) calls of the malloc code are not instrumented as it is.
This patch changes that particular case to allow a different hook
function to be called for such "nested" allocation calls, for a
particular set of nested calls.  In particular, the malloc(3) code's
mmap(2) and munmap(2) calls are replaced with magic_nested_mmap and
magic_nested_munmap calls, respectively.  The magic library then
tracks memory mapping allocations of the malloc code by providing an
implementation for these two wrappers, and frees the allocations upon
state transfer.

This approach was chosen over various alternatives:

- While it appears that nesting could be established by setting a
  flag while the malloc(3) wrapper is active, and testing the flag in
  the mmap(2)/munmap(2) wrappers, this approach would fail to detect
  memory-mapped allocations made from uninstrumented malloc(3) calls,
  and therefore not a viable option.
- It would be possible to obtain the value of the variables that
  store the information about the memory-mapped area in the malloc
  code.  However, this is rather difficult in practice due to the way
  the libc malloc implementation stores the size of the are, and it
  would make the solution more dependent on the specific libc malloc
  implementation.
- It would be possible to use the special "nested" instrumentation
  for allocations made from certain marked sections.  Since we mark
  the data section of the malloc code already, this would not be hard
  to do.  Switching to this alternative would change very little, and
  if for any reason this approach yields more advantages in the
  future, we can still choose to do so.

Change-Id: Id977405da86a72458dd10f18e076d8460fd2fb75
2015-09-17 14:04:43 +00:00
bin Importing bin/domainname utility 2015-07-28 21:56:19 +00:00
common inet: do not link against libc 2015-06-07 14:38:12 +00:00
distrib kernel: Add support for IPC filters. 2015-09-16 11:02:24 +00:00
docs Add PTYFS, Unix98 pseudo terminal support 2015-06-23 17:43:46 +00:00
etc RS/VM: proper preparation for multi-VM live update 2015-09-17 14:01:06 +00:00
external clang: apply LLVM patch r201729 2015-06-29 10:58:16 +00:00
games Import games/caesar and games/rot13 2015-04-15 09:47:27 +02:00
gnu Update download urls in fetch.sh 2014-08-07 14:27:32 +02:00
include New sources layout 2014-07-31 16:00:30 +02:00
lib services: Selectively enable stateful restart. 2015-09-17 13:36:01 +00:00
libexec LLVM Minix changes 2014-07-28 17:05:59 +02:00
minix Fix mmap leak in malloc code upon state transfer 2015-09-17 14:04:43 +00:00
releasetools x86_hdimage: increase image size for bitcode build 2015-09-17 13:55:38 +00:00
sbin INIT died problem / build system robustness 2014-08-28 08:52:50 +02:00
share Do not instrument malloc implementation variables 2015-09-17 14:03:47 +00:00
sys libminixfs: add support for 64-bit block numbers 2015-08-13 13:46:44 +00:00
tests LLVM Minix changes 2014-07-28 17:05:59 +02:00
tools buildsystem: fix build errors for x86 on OSX 2014-11-04 11:00:29 +01:00
usr.bin patch(1): fix arbitrary code execution bug 2015-07-26 15:53:47 +00:00
usr.sbin Import NetBSD syslogd(8) 2015-07-26 11:57:04 +00:00
.gitignore gitignore: ignore some more generated files 2012-12-06 13:29:20 +00:00
.gitreview build:update 'git review' config to match gerrit.minix3.org 2014-07-28 17:05:15 +02:00
build.sh Importing netbsd clang -- pristine 2014-07-28 17:05:57 +02:00
LICENSE Fix parameter parsing in cut 2010-01-21 10:16:05 +00:00
Makefile INIT died problem / build system robustness 2014-08-28 08:52:50 +02:00
Makefile.inc Synchronize on NetBSD-CVS (2013/12/1 12:00:00 UTC) 2014-07-28 17:05:06 +02:00