seq_file: fix big-enough lseek() + read()
authorAlexey Dobriyan <adobriyan@gmail.com>
Thu, 5 Feb 2009 21:30:05 +0000 (00:30 +0300)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 5 Feb 2009 22:18:14 +0000 (14:18 -0800)
lseek() further than length of the file will leave stale ->index
(second-to-last during iteration). Next seq_read() will not notice
that ->f_pos is big enough to return 0, but will print last item
as if ->f_pos is pointing to it.

Introduced in commit cb510b8172602a66467f3551b4be1911f5a7c8c2
aka "seq_file: more atomicity in traverse()".

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/seq_file.c

index 2716c12eacf5062501634111ae1544f653342c62..5267098532bfc8a3a6c25026119a14c144d49f5c 100644 (file)
@@ -102,6 +102,7 @@ static int traverse(struct seq_file *m, loff_t offset)
                p = m->op->next(m, p, &index);
        }
        m->op->stop(m, p);
+       m->index = index;
        return error;
 
 Eoverflow: