]>
Commit | Line | Data |
---|---|---|
f1a82baa GKH |
1 | From cf5eebae2cd28d37581507668605f4d23cd7218d Mon Sep 17 00:00:00 2001 |
2 | From: Miklos Szeredi <mszeredi@redhat.com> | |
3 | Date: Wed, 15 Nov 2017 11:34:58 +0100 | |
4 | Subject: seq_file: fix incomplete reset on read from zero offset | |
5 | ||
6 | From: Miklos Szeredi <mszeredi@redhat.com> | |
7 | ||
8 | commit cf5eebae2cd28d37581507668605f4d23cd7218d upstream. | |
9 | ||
10 | When resetting iterator on a zero offset we need to discard any data | |
11 | already in the buffer (count), and private state of the iterator (version). | |
12 | ||
13 | For example this bug results in first line being repeated in /proc/mounts | |
14 | if doing a zero size read before a non-zero size read. | |
15 | ||
16 | Reported-by: Rich Felker <dalias@libc.org> | |
17 | Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> | |
18 | Fixes: e522751d605d ("seq_file: reset iterator to first record for zero offset") | |
19 | Cc: <stable@vger.kernel.org> # v4.10 | |
20 | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> | |
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
22 | ||
23 | --- | |
24 | fs/seq_file.c | 5 ++++- | |
25 | 1 file changed, 4 insertions(+), 1 deletion(-) | |
26 | ||
27 | --- a/fs/seq_file.c | |
28 | +++ b/fs/seq_file.c | |
29 | @@ -181,8 +181,11 @@ ssize_t seq_read(struct file *file, char | |
30 | * if request is to read from zero offset, reset iterator to first | |
31 | * record as it might have been already advanced by previous requests | |
32 | */ | |
33 | - if (*ppos == 0) | |
34 | + if (*ppos == 0) { | |
35 | m->index = 0; | |
36 | + m->version = 0; | |
37 | + m->count = 0; | |
38 | + } | |
39 | ||
40 | /* Don't assume *ppos is where we left it */ | |
41 | if (unlikely(*ppos != m->read_pos)) { |