From: Ingo Molnar This patch makes the /proc//maps file easier to parse (both for humans and for applications), by annotating the heap, stack and vdso mappings with [heap], [stack] and [vdso] markers. It makes it easier/faster to determine at a quick glance whether an application has a secure VM layout, and it also makes it easier for tools to determine whether e.g. the heap or stack is executable or not. new maps file, on a patched kernel: 001c4000-001d9000 r-xp 00000000 03:01 19954 /lib/ld-2.3.3.so 001d9000-001db000 rw-p 00014000 03:01 19954 /lib/ld-2.3.3.so 001dd000-002fb000 r-xp 00000000 03:01 19960 /lib/tls/libc-2.3.3.so 002fb000-002fd000 r--p 0011d000 03:01 19960 /lib/tls/libc-2.3.3.so 002fd000-002ff000 rw-p 0011f000 03:01 19960 /lib/tls/libc-2.3.3.so 002ff000-00301000 rw-p 002ff000 00:00 0 08048000-0804c000 r-xp 00000000 03:01 31968 /bin/cat 0804c000-0804d000 rw-p 00003000 03:01 31968 /bin/cat 0804d000-0806e000 rw-p 0804d000 00:00 0 [heap] b7dbc000-b7dbd000 r--p 009d1000 03:01 83628 /usr/lib/locale/locale-archive b7dbd000-b7dc4000 r--p 0097d000 03:01 83628 /usr/lib/locale/locale-archive b7dc4000-b7df1000 r--p 0094a000 03:01 83628 /usr/lib/locale/locale-archive b7df1000-b7ff1000 r--p 00000000 03:01 83628 /usr/lib/locale/locale-archive b7ff1000-b7ff2000 rw-p b7ff1000 00:00 0 bffeb000-c0000000 rw-p bffeb000 00:00 0 [stack] ffffe000-fffff000 ---p 00000000 00:00 0 [vdso] Tested on x86, but should work on all architectures. Signed-off-by: Ingo Molnar Signed-off-by: Andrew Morton --- 25-akpm/fs/proc/task_mmu.c | 36 ++++++++++++++++++++++++++++++++---- 1 files changed, 32 insertions(+), 4 deletions(-) diff -puN fs/proc/task_mmu.c~annotate-proc-pid-maps-with--markers fs/proc/task_mmu.c --- 25/fs/proc/task_mmu.c~annotate-proc-pid-maps-with--markers 2005-02-02 16:51:47.374909288 -0800 +++ 25-akpm/fs/proc/task_mmu.c 2005-02-02 16:51:47.377908832 -0800 @@ -77,9 +77,18 @@ out: return result; } +static void pad_len_spaces(struct seq_file *m, int len) +{ + len = 25 + sizeof(void*) * 6 - len; + if (len < 1) + len = 1; + seq_printf(m, "%*c", len, ' '); +} + static int show_map(struct seq_file *m, void *v) { struct vm_area_struct *map = v; + struct mm_struct *mm = map->vm_mm; struct file *file = map->vm_file; int flags = map->vm_flags; unsigned long ino = 0; @@ -102,12 +111,31 @@ static int show_map(struct seq_file *m, map->vm_pgoff << PAGE_SHIFT, MAJOR(dev), MINOR(dev), ino, &len); + /* + * Print the dentry name for named mappings, and a + * special [heap] marker for the heap: + */ if (map->vm_file) { - len = 25 + sizeof(void*) * 6 - len; - if (len < 1) - len = 1; - seq_printf(m, "%*c", len, ' '); + pad_len_spaces(m, len); seq_path(m, file->f_vfsmnt, file->f_dentry, ""); + } else { + if (mm) { + if (map->vm_start <= mm->start_brk && + map->vm_end >= mm->brk) { + pad_len_spaces(m, len); + seq_puts(m, "[heap]"); + } else { + if (map->vm_start <= mm->start_stack && + map->vm_end >= mm->start_stack) { + + pad_len_spaces(m, len); + seq_puts(m, "[stack]"); + } + } + } else { + pad_len_spaces(m, len); + seq_puts(m, "[vdso]"); + } } seq_putc(m, '\n'); return 0; _