Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 174404
b: refs/heads/master
c: 4a58579
h: refs/heads/master
v: v3
  • Loading branch information
Akira Fujita authored and Theodore Ts'o committed Dec 7, 2009
1 parent 56bfc75 commit d446e75
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b436b9bef84de6893e86346d8fbf7104bc520645
refs/heads/master: 4a58579b9e4e2a35d57e6c9c8483e52f6f1b7fd6
30 changes: 18 additions & 12 deletions trunk/fs/ext4/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,32 +221,38 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
struct file *donor_filp;
int err;

if (!(filp->f_mode & FMODE_READ) ||
!(filp->f_mode & FMODE_WRITE))
return -EBADF;

if (copy_from_user(&me,
(struct move_extent __user *)arg, sizeof(me)))
return -EFAULT;
me.moved_len = 0;

donor_filp = fget(me.donor_fd);
if (!donor_filp)
return -EBADF;

if (!capable(CAP_DAC_OVERRIDE)) {
if ((current->real_cred->fsuid != inode->i_uid) ||
!(inode->i_mode & S_IRUSR) ||
!(donor_filp->f_dentry->d_inode->i_mode &
S_IRUSR)) {
fput(donor_filp);
return -EACCES;
}
if (!(donor_filp->f_mode & FMODE_WRITE)) {
err = -EBADF;
goto mext_out;
}

me.moved_len = 0;
err = mnt_want_write(filp->f_path.mnt);
if (err)
goto mext_out;

err = ext4_move_extents(filp, donor_filp, me.orig_start,
me.donor_start, me.len, &me.moved_len);
fput(donor_filp);
mnt_drop_write(filp->f_path.mnt);
if (me.moved_len > 0)
file_remove_suid(donor_filp);

if (copy_to_user((struct move_extent *)arg, &me, sizeof(me)))
return -EFAULT;

err = -EFAULT;
mext_out:
fput(donor_filp);
return err;
}

Expand Down
7 changes: 7 additions & 0 deletions trunk/fs/ext4/move_extent.c
Original file line number Diff line number Diff line change
Expand Up @@ -957,6 +957,13 @@ mext_check_arguments(struct inode *orig_inode,
return -EINVAL;
}

if (donor_inode->i_mode & (S_ISUID|S_ISGID)) {
ext4_debug("ext4 move extent: suid or sgid is set"
" to donor file [ino:orig %lu, donor %lu]\n",
orig_inode->i_ino, donor_inode->i_ino);
return -EINVAL;
}

/* Ext4 move extent does not support swapfile */
if (IS_SWAPFILE(orig_inode) || IS_SWAPFILE(donor_inode)) {
ext4_debug("ext4 move extent: The argument files should "
Expand Down

0 comments on commit d446e75

Please sign in to comment.