coredump: plug a memory leak situation on dump_seek()
authorAndré Goddard Rosa <andre.goddard@gmail.com>
Wed, 10 Mar 2010 23:21:22 +0000 (15:21 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 12 Mar 2010 23:52:32 +0000 (15:52 -0800)
After having started writing the coredump, if filesystem reports an error
anytime while writing part of the core file, we would leak a memory page
when bailing out.

Signed-off-by: André Goddard Rosa <andre.goddard@gmail.com>
Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Roland McGrath <roland@redhat.com>
Cc: WANG Cong <amwang@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/coredump.h

index b3c91d7cede4e764cb5a62700e5900987aa3e0eb..8ba66a9d9022c7d0ddbbcb984b8839dabb2b91f8 100644 (file)
@@ -16,6 +16,8 @@ static inline int dump_write(struct file *file, const void *addr, int nr)
 
 static inline int dump_seek(struct file *file, loff_t off)
 {
+       int ret = 1;
+
        if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
                if (file->f_op->llseek(file, off, SEEK_CUR) < 0)
                        return 0;
@@ -29,13 +31,15 @@ static inline int dump_seek(struct file *file, loff_t off)
 
                        if (n > PAGE_SIZE)
                                n = PAGE_SIZE;
-                       if (!dump_write(file, buf, n))
-                               return 0;
+                       if (!dump_write(file, buf, n)) {
+                               ret = 0;
+                               break;
+                       }
                        off -= n;
                }
                free_page((unsigned long)buf);
        }
-       return 1;
+       return ret;
 }
 
 #endif /* _LINUX_COREDUMP_H */