]> Pileus Git - ~andy/linux/commitdiff
binfmt_elf: convert writing actual dump pages to dump_emit()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 5 Oct 2013 22:08:47 +0000 (18:08 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 9 Nov 2013 05:16:24 +0000 (00:16 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/binfmt_elf.c

index a998b221b53a8a8fea43054a2871f1388702fa09..ddab40d3d8287d9e4b273f398e25445e9921b62c 100644 (file)
@@ -2093,7 +2093,6 @@ static int elf_core_dump(struct coredump_params *cprm)
 
        offset += sizeof(*elf);                         /* Elf header */
        offset += segs * sizeof(struct elf_phdr);       /* Program headers */
-       foffset = offset;
 
        /* Write notes phdr entry */
        {
@@ -2157,7 +2156,6 @@ static int elf_core_dump(struct coredump_params *cprm)
                goto end_coredump;
 
        size = cprm->written;
-       cprm->written = foffset;        /* will disappear */
        /* write out the notes section */
        if (!write_note_info(&info, cprm))
                goto end_coredump;
@@ -2170,6 +2168,7 @@ static int elf_core_dump(struct coredump_params *cprm)
        if (!dump_seek(cprm->file, dataoff - foffset))
                goto end_coredump;
 
+       cprm->written = size;
        for (vma = first_vma(current, gate_vma); vma != NULL;
                        vma = next_vma(vma, gate_vma)) {
                unsigned long addr;
@@ -2184,9 +2183,7 @@ static int elf_core_dump(struct coredump_params *cprm)
                        page = get_dump_page(addr);
                        if (page) {
                                void *kaddr = kmap(page);
-                               stop = ((size += PAGE_SIZE) > cprm->limit) ||
-                                       !dump_write(cprm->file, kaddr,
-                                                   PAGE_SIZE);
+                               stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
                                kunmap(page);
                                page_cache_release(page);
                        } else
@@ -2196,16 +2193,11 @@ static int elf_core_dump(struct coredump_params *cprm)
                }
        }
 
-       cprm->written = size;
        if (!elf_core_write_extra_data(cprm))
                goto end_coredump;
-       size = cprm->written;
 
        if (e_phnum == PN_XNUM) {
-               size += sizeof(*shdr4extnum);
-               if (size > cprm->limit
-                   || !dump_write(cprm->file, shdr4extnum,
-                                  sizeof(*shdr4extnum)))
+               if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
                        goto end_coredump;
        }