]> git.hungrycats.org Git - linux/commitdiff
[PATCH] sendfile calls lock_verify_area with wrong parameters
authorAndrew Morton <akpm@osdl.org>
Tue, 20 Jan 2004 11:13:47 +0000 (03:13 -0800)
committerLinus Torvalds <torvalds@home.osdl.org>
Tue, 20 Jan 2004 11:13:47 +0000 (03:13 -0800)
From: Manfred Spraul <manfred@colorfullife.com>

sendfile supports reading from a given start offset for in_file, like
pread.  But for the locks_verify_area call, in_file->f_pos is always used,
even if a start offset is used.  Result: wrong area is checked for
mandatory locks.

fs/read_write.c

index a3cc592ff8538f76cad43b94ab42f93615704e74..3fe9b8732601be27e59ad365ac7cec4eda9767e3 100644 (file)
@@ -559,7 +559,9 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
                goto fput_in;
        if (!in_file->f_op || !in_file->f_op->sendfile)
                goto fput_in;
-       retval = locks_verify_area(FLOCK_VERIFY_READ, in_inode, in_file, in_file->f_pos, count);
+       if (!ppos)
+               ppos = &in_file->f_pos;
+       retval = locks_verify_area(FLOCK_VERIFY_READ, in_inode, in_file, *ppos, count);
        if (retval)
                goto fput_in;
 
@@ -588,9 +590,6 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
        if (retval)
                goto fput_out;
 
-       if (!ppos)
-               ppos = &in_file->f_pos;
-
        if (!max)
                max = min(in_inode->i_sb->s_maxbytes, out_inode->i_sb->s_maxbytes);