From: Andrew Morton Date: Wed, 19 Jun 2013 00:06:09 +0000 (+1000) Subject: vmcore-support-mmap-on-proc-vmcore-fix X-Git-Tag: next-20130619~2^2~503 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=71a2ceefb0abaea92500e682e910695d1b3108f2;p=karo-tx-linux.git vmcore-support-mmap-on-proc-vmcore-fix use min(), switch to conventional error-unwinding approach Cc: Atsushi Kumagai Cc: HATAYAMA Daisuke Cc: KOSAKI Motohiro Cc: Lisa Mitchell Cc: Vivek Goyal Cc: Zhang Yanfei Signed-off-by: Andrew Morton --- 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 = {