mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-16 10:17:32 +00:00
coredump: only charge written data against RLIMIT_CORE
Commit 9b56d54380ad ("dump_skip(): dump_seek() replacement taking coredump_params") introduced a regression with regard to RLIMIT_CORE. Previously, when a core dump was sparse, only the data that was actually written out would count against the limit. Now, the sparse ranges are also included, which leads to truncated core dumps when the actual disk usage is still well below the limit. Restore the old behavior by only counting what gets emitted and ignoring what gets skipped. Signed-off-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
a008393951
commit
2c4cb04300
@ -782,7 +782,7 @@ int dump_emit(struct coredump_params *cprm, const void *addr, int nr)
|
||||
struct file *file = cprm->file;
|
||||
loff_t pos = file->f_pos;
|
||||
ssize_t n;
|
||||
if (pos + nr > cprm->limit)
|
||||
if (cprm->written + nr > cprm->limit)
|
||||
return 0;
|
||||
while (nr) {
|
||||
if (dump_interrupted())
|
||||
@ -791,6 +791,7 @@ int dump_emit(struct coredump_params *cprm, const void *addr, int nr)
|
||||
if (n <= 0)
|
||||
return 0;
|
||||
file->f_pos = pos;
|
||||
cprm->written += n;
|
||||
nr -= n;
|
||||
}
|
||||
return 1;
|
||||
@ -802,8 +803,6 @@ int dump_skip(struct coredump_params *cprm, size_t nr)
|
||||
static char zeroes[PAGE_SIZE];
|
||||
struct file *file = cprm->file;
|
||||
if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
|
||||
if (file->f_pos + nr > cprm->limit)
|
||||
return 0;
|
||||
if (dump_interrupted() ||
|
||||
file->f_op->llseek(file, nr, SEEK_CUR) < 0)
|
||||
return 0;
|
||||
|
@ -64,6 +64,7 @@ struct coredump_params {
|
||||
struct file *file;
|
||||
unsigned long limit;
|
||||
unsigned long mm_flags;
|
||||
loff_t written;
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user