Commit 8526d84f authored by Konstantin Khlebnikov's avatar Konstantin Khlebnikov Committed by Linus Torvalds

fs/proc/task_mmu.c: do not show VmExe bigger than total executable virtual memory

If start_code / end_code pointers are screwed then "VmExe" could be
bigger than total executable virtual memory and "VmLib" becomes
negative:

  VmExe:	  294320 kB
  VmLib:	18446744073709327564 kB

VmExe and VmLib documented as text segment and shared library code size.

Now their sum will be always equal to mm->exec_vm which sums size of
executable and not writable and not stack areas.

I've seen this for huge (>2Gb) statically linked binary which has whole
world inside.  For it start_code ..  end_code range also covers one of
rodata sections.  Probably this is bug in customized linker, elf loader
or both.

Anyway CONFIG_CHECKPOINT_RESTORE allows to change these pointers, thus
we cannot trust them without validation.

Link: http://lkml.kernel.org/r/150728955451.743749.11276392315459539583.stgit@buzzSigned-off-by: default avatarKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ef549e13
...@@ -47,8 +47,11 @@ void task_mem(struct seq_file *m, struct mm_struct *mm) ...@@ -47,8 +47,11 @@ void task_mem(struct seq_file *m, struct mm_struct *mm)
if (hiwater_rss < mm->hiwater_rss) if (hiwater_rss < mm->hiwater_rss)
hiwater_rss = mm->hiwater_rss; hiwater_rss = mm->hiwater_rss;
text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) >> 10; /* split executable areas between text and lib */
lib = (mm->exec_vm << (PAGE_SHIFT-10)) - text; text = PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK);
text = min(text, mm->exec_vm << PAGE_SHIFT);
lib = (mm->exec_vm << PAGE_SHIFT) - text;
swap = get_mm_counter(mm, MM_SWAPENTS); swap = get_mm_counter(mm, MM_SWAPENTS);
seq_printf(m, seq_printf(m,
"VmPeak:\t%8lu kB\n" "VmPeak:\t%8lu kB\n"
...@@ -76,7 +79,9 @@ void task_mem(struct seq_file *m, struct mm_struct *mm) ...@@ -76,7 +79,9 @@ void task_mem(struct seq_file *m, struct mm_struct *mm)
file << (PAGE_SHIFT-10), file << (PAGE_SHIFT-10),
shmem << (PAGE_SHIFT-10), shmem << (PAGE_SHIFT-10),
mm->data_vm << (PAGE_SHIFT-10), mm->data_vm << (PAGE_SHIFT-10),
mm->stack_vm << (PAGE_SHIFT-10), text, lib, mm->stack_vm << (PAGE_SHIFT-10),
text >> 10,
lib >> 10,
mm_pgtables_bytes(mm) >> 10, mm_pgtables_bytes(mm) >> 10,
swap << (PAGE_SHIFT-10)); swap << (PAGE_SHIFT-10));
hugetlb_report_usage(m, mm); hugetlb_report_usage(m, mm);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment