Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.25-rc7 /fs/read_write.c

Filename:/fs/read_write.c
Lines Added:25
Lines Deleted:40
Also changed in: (Previous) 2.6.25-rc6  2.6.25-rc5  2.6.25-rc4  2.6.25-rc3  2.6.25-rc2  2.6.25-rc1 
(Following) 2.6.25-rc8  2.6.25-rc9  2.6.25  2.6.25-git4  2.6.25-git5  2.6.25-git6 

Location
[  2.6.25-rc7
  [  fs
     o  read_write.c

Patch

diff --git a/fs/read_write.c b/fs/read_write.c
index ea1f94c..49a9871 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -197,25 +197,27 @@ int rw_verify_area(int read_write, struct file *file, loff_t *ppos, size_t count
 {
    struct inode *inode;
    loff_t pos;
+   int retval = -EINVAL;
 
    inode = file->f_path.dentry->d_inode;
    if (unlikely((ssize_t) count < 0))
-      goto Einval;
+      return retval;
    pos = *ppos;
    if (unlikely((pos < 0) || (loff_t) (pos + count) < 0))
-      goto Einval;
+      return retval;
 
    if (unlikely(inode->i_flock && mandatory_lock(inode))) {
-      int retval = locks_mandatory_area(
+      retval = locks_mandatory_area(
          read_write == READ ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE,
          inode, file, pos, count);
       if (retval < 0)
          return retval;
    }
+   retval = security_file_permission(file,
+            read_write == READ ? MAY_READ : MAY_WRITE);
+   if (retval)
+      return retval;
    return count > MAX_RW_COUNT ? MAX_RW_COUNT : count;
-
-Einval:
-   return -EINVAL;
 }
 
 static void wait_on_retry_sync_kiocb(struct kiocb *iocb)
@@ -267,18 +269,15 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
    ret = rw_verify_area(READ, file, pos, count);
    if (ret >= 0) {
       count = ret;
-      ret = security_file_permission (file, MAY_READ);
-      if (!ret) {
-         if (file->f_op->read)
-            ret = file->f_op->read(file, buf, count, pos);
-         else
-            ret = do_sync_read(file, buf, count, pos);
-         if (ret > 0) {
-            fsnotify_access(file->f_path.dentry);
-            add_rchar(current, ret);
-         }
-         inc_syscr(current);
+      if (file->f_op->read)
+         ret = file->f_op->read(file, buf, count, pos);
+      else
+         ret = do_sync_read(file, buf, count, pos);
+      if (ret > 0) {
+         fsnotify_access(file->f_path.dentry);
+         add_rchar(current, ret);
       }
+      inc_syscr(current);
    }
 
    return ret;
@@ -325,18 +324,15 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
    ret = rw_verify_area(WRITE, file, pos, count);
    if (ret >= 0) {
       count = ret;
-      ret = security_file_permission (file, MAY_WRITE);
-      if (!ret) {
-         if (file->f_op->write)
-            ret = file->f_op->write(file, buf, count, pos);
-         else
-            ret = do_sync_write(file, buf, count, pos);
-         if (ret > 0) {
-            fsnotify_modify(file->f_path.dentry);
-            add_wchar(current, ret);
-         }
-         inc_syscw(current);
+      if (file->f_op->write)
+         ret = file->f_op->write(file, buf, count, pos);
+      else
+         ret = do_sync_write(file, buf, count, pos);
+      if (ret > 0) {
+         fsnotify_modify(file->f_path.dentry);
+         add_wchar(current, ret);
       }
+      inc_syscw(current);
    }
 
    return ret;
@@ -370,7 +366,6 @@ asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
 
    return ret;
 }
-EXPORT_UNUSED_SYMBOL_GPL(sys_read); /* to be deleted for 2.6.25 */
 
 asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)
 {
@@ -450,6 +445,7 @@ unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to)
    }
    return seg;
 }
+EXPORT_SYMBOL(iov_shorten);
 
 ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov,
       unsigned long nr_segs, size_t len, loff_t *ppos, iov_fn_t fn)
@@ -603,9 +599,6 @@ static ssize_t do_readv_writev(int type, struct file *file,
    ret = rw_verify_area(type, file, pos, tot_len);
    if (ret < 0)
       goto out;
-   ret = security_file_permission(file, type == READ ? MAY_READ : MAY_WRITE);
-   if (ret)
-      goto out;
 
    fnv = NULL;
    if (type == READ) {
@@ -737,10 +730,6 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
       goto fput_in;
    count = retval;
 
-   retval = security_file_permission (in_file, MAY_READ);
-   if (retval)
-      goto fput_in;
-
    /*
     * Get output file, and verify that it is ok..
     */
@@ -759,10 +748,6 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
       goto fput_out;
    count = retval;
 
-   retval = security_file_permission (out_file, MAY_WRITE);
-   if (retval)
-      goto fput_out;
-
    if (!max)
       max = min(in_inode->i_sb->s_maxbytes, out_inode->i_sb->s_maxbytes);
 


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.