diff options
author | Andrew Morton <akpm@linux-foundation.org> | 2013-06-07 10:07:51 +1000 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2013-06-07 15:42:13 +1000 |
commit | caf1e3a932f926c54b6325291542ec5d705dd2c8 (patch) | |
tree | d99a7abf518ec8f99ba91459619371046f83c948 /fs | |
parent | f3758affdb6a51ea780a5ed5c455f1de49de631e (diff) |
vmcore-support-mmap-on-proc-vmcore-fix
use min(), switch to conventional error-unwinding approach
Cc: Atsushi Kumagai <kumagai-atsushi@mxc.nes.nec.co.jp>
Cc: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Lisa Mitchell <lisa.mitchell@hp.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/proc/vmcore.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c index 423796979640..0f6db5269d38 100644 --- a/fs/proc/vmcore.c +++ b/fs/proc/vmcore.c @@ -218,9 +218,7 @@ static int mmap_vmcore(struct file *file, struct vm_area_struct *vma) if (start < elfcorebuf_sz) { u64 pfn; - tsz = elfcorebuf_sz - start; - if (size < tsz) - tsz = size; + tsz = min(elfcorebuf_sz - (size_t)start, size); pfn = __pa(elfcorebuf + start) >> PAGE_SHIFT; if (remap_pfn_range(vma, vma->vm_start, pfn, tsz, vma->vm_page_prot)) @@ -236,15 +234,11 @@ static int mmap_vmcore(struct file *file, struct vm_area_struct *vma) if (start < elfcorebuf_sz + elfnotes_sz) { void *kaddr; - tsz = elfcorebuf_sz + elfnotes_sz - start; - if (size < tsz) - tsz = size; + tsz = min(elfcorebuf_sz + elfnotes_sz - (size_t)start, size); kaddr = elfnotes_buf + start - elfcorebuf_sz; if (remap_vmalloc_range_partial(vma, vma->vm_start + len, - kaddr, tsz)) { - do_munmap(vma->vm_mm, vma->vm_start, len); - return -EAGAIN; - } + kaddr, tsz)) + goto fail; size -= tsz; start += tsz; len += tsz; @@ -257,16 +251,12 @@ static int mmap_vmcore(struct file *file, struct vm_area_struct *vma) if (start < m->offset + m->size) { u64 paddr = 0; - tsz = m->offset + m->size - start; - if (size < tsz) - tsz = size; + tsz = min_t(size_t, m->offset + m->size - start, size); paddr = m->paddr + start - m->offset; if (remap_pfn_range(vma, vma->vm_start + len, paddr >> PAGE_SHIFT, tsz, - vma->vm_page_prot)) { - do_munmap(vma->vm_mm, vma->vm_start, len); - return -EAGAIN; - } + vma->vm_page_prot)) + goto fail; size -= tsz; start += tsz; len += tsz; @@ -277,6 +267,9 @@ static int mmap_vmcore(struct file *file, struct vm_area_struct *vma) } return 0; +fail: + do_munmap(vma->vm_mm, vma->vm_start, len); + return -EAGAIN; } static const struct file_operations proc_vmcore_operations = { |