Messages in this thread Patch in this message | | | From | Jiaxing Wang <> | Subject | [PATCH] seq_file:update file->f_pos when lseek() to m->read_pos | Date | Sat, 29 Jun 2013 17:11:35 +0800 |
| |
After pread(), file->f_pos and m->read_pos get different, and lseek() to m->read_pos did not update file->f_pos, then a subsequent read may read from a wrong position, the following program shows the problem:
char str1[32] = { 0 }; char str2[32] = { 0 }; int poffset = 10; int count = 20;
/*open any seq file*/ int fd = open("/proc/modules", O_RDONLY);
pread(fd, str1, count, poffset); printf("pread:%s\n", str1);
/*seek to where m->read_pos is*/ lseek(fd, poffset+count, SEEK_SET);
/*supposed to read from poffset+count, but this read from position 0*/ read(fd, str2, count); printf("read:%s\n", str2);
Signed-off-by: Jiaxing Wang <hello.wjx@gmail.com> --- fs/seq_file.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/seq_file.c b/fs/seq_file.c index 774c1eb..4b22b26 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -328,7 +328,8 @@ loff_t seq_lseek(struct file *file, loff_t offset, int whence) m->read_pos = offset; retval = file->f_pos = offset; } - } + } else + file->f_pos = offset; } file->f_version = m->version; mutex_unlock(&m->lock); -- 1.8.1.2
| |