Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 186313
b: refs/heads/master
c: 05f47fd
h: refs/heads/master
i:
  186311: 86c4076
v: v3
  • Loading branch information
Daisuke HATAYAMA authored and Linus Torvalds committed Mar 6, 2010
1 parent 67a3f75 commit 51d42ea
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 29 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 12bac0d9f4dbf3445a0319beee848d15fa32775e
refs/heads/master: 05f47fda9fc5b17bfab189e9d54228025befc996
31 changes: 24 additions & 7 deletions trunk/fs/binfmt_aout.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,16 +69,32 @@ static int dump_write(struct file *file, const void *addr, int nr)
return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
}

static int dump_seek(struct file *file, loff_t off)
{
if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
if (file->f_op->llseek(file, off, SEEK_CUR) < 0)
return 0;
} else {
char *buf = (char *)get_zeroed_page(GFP_KERNEL);
if (!buf)
return 0;
while (off > 0) {
unsigned long n = off;
if (n > PAGE_SIZE)
n = PAGE_SIZE;
if (!dump_write(file, buf, n))
return 0;
off -= n;
}
free_page((unsigned long)buf);
}
return 1;
}

#define DUMP_WRITE(addr, nr) \
if (!dump_write(file, (void *)(addr), (nr))) \
goto end_coredump;

#define DUMP_SEEK(offset) \
if (file->f_op->llseek) { \
if (file->f_op->llseek(file,(offset),0) != (offset)) \
goto end_coredump; \
} else file->f_pos = (offset)

/*
* Routine writes a core dump image in the current directory.
* Currently only a stub-function.
Expand Down Expand Up @@ -132,7 +148,8 @@ static int aout_core_dump(struct coredump_params *cprm)
/* struct user */
DUMP_WRITE(&dump,sizeof(dump));
/* Now dump all of the user data. Include malloced stuff as well */
DUMP_SEEK(PAGE_SIZE);
if (!dump_seek(cprm->file, PAGE_SIZE - sizeof(dump)))
goto end_coredump;
/* now we start writing out the user space info */
set_fs(USER_DS);
/* Dump the data area */
Expand Down
59 changes: 38 additions & 21 deletions trunk/fs/binfmt_elf_fdpic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1226,11 +1226,22 @@ static int dump_write(struct file *file, const void *addr, int nr)

static int dump_seek(struct file *file, loff_t off)
{
if (file->f_op->llseek) {
if (file->f_op->llseek(file, off, SEEK_SET) != off)
if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
if (file->f_op->llseek(file, off, SEEK_CUR) < 0)
return 0;
} else {
file->f_pos = off;
char *buf = (char *)get_zeroed_page(GFP_KERNEL);
if (!buf)
return 0;
while (off > 0) {
unsigned long n = off;
if (n > PAGE_SIZE)
n = PAGE_SIZE;
if (!dump_write(file, buf, n))
return 0;
off -= n;
}
free_page((unsigned long)buf);
}
return 1;
}
Expand Down Expand Up @@ -1313,30 +1324,35 @@ static int notesize(struct memelfnote *en)

/* #define DEBUG */

#define DUMP_WRITE(addr, nr) \
do { if (!dump_write(file, (addr), (nr))) return 0; } while(0)
#define DUMP_SEEK(off) \
do { if (!dump_seek(file, (off))) return 0; } while(0)
#define DUMP_WRITE(addr, nr, foffset) \
do { if (!dump_write(file, (addr), (nr))) return 0; *foffset += (nr); } while(0)

static int writenote(struct memelfnote *men, struct file *file)
static int alignfile(struct file *file, loff_t *foffset)
{
struct elf_note en;
static const char buf[4] = { 0, };
DUMP_WRITE(buf, roundup(*foffset, 4) - *foffset, foffset);
return 1;
}

static int writenote(struct memelfnote *men, struct file *file,
loff_t *foffset)
{
struct elf_note en;
en.n_namesz = strlen(men->name) + 1;
en.n_descsz = men->datasz;
en.n_type = men->type;

DUMP_WRITE(&en, sizeof(en));
DUMP_WRITE(men->name, en.n_namesz);
/* XXX - cast from long long to long to avoid need for libgcc.a */
DUMP_SEEK(roundup((unsigned long)file->f_pos, 4)); /* XXX */
DUMP_WRITE(men->data, men->datasz);
DUMP_SEEK(roundup((unsigned long)file->f_pos, 4)); /* XXX */
DUMP_WRITE(&en, sizeof(en), foffset);
DUMP_WRITE(men->name, en.n_namesz, foffset);
if (!alignfile(file, foffset))
return 0;
DUMP_WRITE(men->data, men->datasz, foffset);
if (!alignfile(file, foffset))
return 0;

return 1;
}
#undef DUMP_WRITE
#undef DUMP_SEEK

#define DUMP_WRITE(addr, nr) \
if ((size += (nr)) > cprm->limit || \
Expand Down Expand Up @@ -1552,7 +1568,7 @@ static int elf_fdpic_dump_segments(struct file *file, size_t *size,
err = -EIO;
kunmap(page);
page_cache_release(page);
} else if (!dump_seek(file, file->f_pos + PAGE_SIZE))
} else if (!dump_seek(file, PAGE_SIZE))
err = -EFBIG;
if (err)
goto out;
Expand Down Expand Up @@ -1605,7 +1621,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
int i;
struct vm_area_struct *vma;
struct elfhdr *elf = NULL;
loff_t offset = 0, dataoff;
loff_t offset = 0, dataoff, foffset;
int numnote;
struct memelfnote *notes = NULL;
struct elf_prstatus *prstatus = NULL; /* NT_PRSTATUS */
Expand Down Expand Up @@ -1730,6 +1746,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
DUMP_WRITE(elf, sizeof(*elf));
offset += sizeof(*elf); /* Elf header */
offset += (segs+1) * sizeof(struct elf_phdr); /* Program headers */
foffset = offset;

/* Write notes phdr entry */
{
Expand Down Expand Up @@ -1786,7 +1803,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)

/* write out the notes section */
for (i = 0; i < numnote; i++)
if (!writenote(notes + i, cprm->file))
if (!writenote(notes + i, cprm->file, &foffset))
goto end_coredump;

/* write out the thread status notes section */
Expand All @@ -1795,11 +1812,11 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
list_entry(t, struct elf_thread_status, list);

for (i = 0; i < tmp->num_notes; i++)
if (!writenote(&tmp->notes[i], cprm->file))
if (!writenote(&tmp->notes[i], cprm->file, &foffset))
goto end_coredump;
}

if (!dump_seek(cprm->file, dataoff))
if (!dump_seek(cprm->file, dataoff - foffset))
goto end_coredump;

if (elf_fdpic_dump_segments(cprm->file, &size, &cprm->limit,
Expand Down

0 comments on commit 51d42ea

Please sign in to comment.