lkml.org 
[lkml]   [1998]   [Apr]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subjectsuser() -> capable() for linux/fs
This patch changes all suser() to capable() in linux/fs.

astor

--
Alexander Kjeldaas, Guardian Networks AS, Trondheim, Norway
http://www.guardian.no/
diff -urN /tmp/linux/fs/affs/namei.c lp97/fs/affs/namei.c
--- /tmp/linux/fs/affs/namei.c Tue Feb 24 07:01:26 1998
+++ lp97/fs/affs/namei.c Thu Apr 23 00:50:08 1998
@@ -245,7 +245,7 @@
if (S_ISDIR(inode->i_mode))
goto unlink_done;
if (current->fsuid != inode->i_uid &&
- current->fsuid != dir->i_uid && !fsuser())
+ current->fsuid != dir->i_uid && !capable(CAP_FOWNER))
goto unlink_done;

if ((retval = affs_remove_header(bh,inode)) < 0)
@@ -363,7 +363,7 @@

retval = -EPERM;
if (current->fsuid != inode->i_uid &&
- current->fsuid != dir->i_uid && !fsuser())
+ current->fsuid != dir->i_uid && !capable(CAP_FOWNER))
goto rmdir_done;
if (inode->i_dev != dir->i_dev)
goto rmdir_done;
diff -urN /tmp/linux/fs/attr.c lp97/fs/attr.c
--- /tmp/linux/fs/attr.c Sun Jan 4 09:53:41 1998
+++ lp97/fs/attr.c Wed Apr 22 22:47:11 1998
@@ -27,28 +27,28 @@
/* Make sure a caller can chown. */
if ((ia_valid & ATTR_UID) &&
(current->fsuid != inode->i_uid ||
- attr->ia_uid != inode->i_uid) && !fsuser())
+ attr->ia_uid != inode->i_uid) && !capable(CAP_CHOWN))
goto error;

/* Make sure caller can chgrp. */
if ((ia_valid & ATTR_GID) &&
(!in_group_p(attr->ia_gid) && attr->ia_gid != inode->i_gid) &&
- !fsuser())
+ !capable(CAP_CHOWN))
goto error;

/* Make sure a caller can chmod. */
if (ia_valid & ATTR_MODE) {
- if ((current->fsuid != inode->i_uid) && !fsuser())
+ if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
goto error;
/* Also check the setgid bit! */
if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid :
- inode->i_gid) && !fsuser())
+ inode->i_gid) && !capable(CAP_FSETID))
attr->ia_mode &= ~S_ISGID;
}

/* Check for setting the inode time. */
if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET)) {
- if (current->fsuid != inode->i_uid && !fsuser())
+ if (current->fsuid != inode->i_uid && !capable(CAP_FOWNER))
goto error;
}
fine:
@@ -75,7 +75,7 @@
inode->i_ctime = attr->ia_ctime;
if (ia_valid & ATTR_MODE) {
inode->i_mode = attr->ia_mode;
- if (!in_group_p(inode->i_gid) && !fsuser())
+ if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
inode->i_mode &= ~S_ISGID;
}
mark_inode_dirty(inode);
diff -urN /tmp/linux/fs/autofs/root.c lp97/fs/autofs/root.c
--- /tmp/linux/fs/autofs/root.c Sat Apr 4 19:45:14 1998
+++ lp97/fs/autofs/root.c Thu Apr 23 00:51:15 1998
@@ -478,7 +478,7 @@
_IOC_NR(cmd) - _IOC_NR(AUTOFS_IOC_FIRST) >= AUTOFS_IOC_COUNT )
return -ENOTTY;

- if ( !autofs_oz_mode(sbi) && !fsuser() )
+ if ( !autofs_oz_mode(sbi) && !capable(CAP_SYS_ADMIN) )
return -EPERM;

switch(cmd) {
diff -urN /tmp/linux/fs/buffer.c lp97/fs/buffer.c
--- /tmp/linux/fs/buffer.c Tue Apr 7 02:48:34 1998
+++ lp97/fs/buffer.c Wed Apr 22 22:50:50 1998
@@ -1871,7 +1871,7 @@
int i, error = -EPERM;

lock_kernel();
- if (!suser())
+ if (!capable(CAP_SYS_ADMIN))
goto out;

if (func == 1) {
diff -urN /tmp/linux/fs/dquot.c lp97/fs/dquot.c
--- /tmp/linux/fs/dquot.c Thu Mar 5 20:55:06 1998
+++ lp97/fs/dquot.c Wed Apr 22 22:54:24 1998
@@ -375,7 +375,8 @@
if (inodes <= 0 || dquot->dq_flags & DQ_FAKE)
return(QUOTA_OK);
if (dquot->dq_ihardlimit &&
- (dquot->dq_curinodes + inodes) > dquot->dq_ihardlimit && !fsuser()) {
+ (dquot->dq_curinodes + inodes) > dquot->dq_ihardlimit &&
+ !capable(CAP_SYS_RESOURCE)) {
if ((dquot->dq_flags & DQ_INODES) == 0 &&
need_print_warning(type, dquot)) {
sprintf(quotamessage, "%s: write failed, %s file limit reached\r\n",
@@ -387,7 +388,8 @@
}
if (dquot->dq_isoftlimit &&
(dquot->dq_curinodes + inodes) > dquot->dq_isoftlimit &&
- dquot->dq_itime && CURRENT_TIME >= dquot->dq_itime && !fsuser()) {
+ dquot->dq_itime && CURRENT_TIME >= dquot->dq_itime &&
+ !capable(CAP_SYS_RESOURCE)) {
if (need_print_warning(type, dquot)) {
sprintf(quotamessage, "%s: warning, %s file quota exceeded too long.\r\n",
dquot->dq_mnt->mnt_dirname, quotatypes[type]);
@@ -397,7 +399,8 @@
}
if (dquot->dq_isoftlimit &&
(dquot->dq_curinodes + inodes) > dquot->dq_isoftlimit &&
- dquot->dq_itime == 0 && !fsuser()) {
+ dquot->dq_itime == 0 &&
+ !capable(CAP_SYS_RESOURCE)) {
if (need_print_warning(type, dquot)) {
sprintf(quotamessage, "%s: warning, %s file quota exceeded\r\n",
dquot->dq_mnt->mnt_dirname, quotatypes[type]);
@@ -413,7 +416,8 @@
if (blocks <= 0 || dquot->dq_flags & DQ_FAKE)
return(QUOTA_OK);
if (dquot->dq_bhardlimit &&
- (dquot->dq_curblocks + blocks) > dquot->dq_bhardlimit && !fsuser()) {
+ (dquot->dq_curblocks + blocks) > dquot->dq_bhardlimit &&
+ !capable(CAP_SYS_RESOURCE)) {
if ((dquot->dq_flags & DQ_BLKS) == 0 &&
need_print_warning(type, dquot)) {
sprintf(quotamessage, "%s: write failed, %s disk limit reached.\r\n",
@@ -425,7 +429,8 @@
}
if (dquot->dq_bsoftlimit &&
(dquot->dq_curblocks + blocks) > dquot->dq_bsoftlimit &&
- dquot->dq_btime && CURRENT_TIME >= dquot->dq_btime && !fsuser()) {
+ dquot->dq_btime && CURRENT_TIME >= dquot->dq_btime &&
+ !capable(CAP_SYS_RESOURCE)) {
if (need_print_warning(type, dquot)) {
sprintf(quotamessage, "%s: write failed, %s disk quota exceeded too long.\r\n",
dquot->dq_mnt->mnt_dirname, quotatypes[type]);
@@ -435,7 +440,8 @@
}
if (dquot->dq_bsoftlimit &&
(dquot->dq_curblocks + blocks) > dquot->dq_bsoftlimit &&
- dquot->dq_btime == 0 && !fsuser()) {
+ dquot->dq_btime == 0 &&
+ !capable(CAP_SYS_RESOURCE)) {
if (need_print_warning(type, dquot)) {
sprintf(quotamessage, "%s: warning, %s disk quota exceeded\r\n",
dquot->dq_mnt->mnt_dirname, quotatypes[type]);
@@ -1039,11 +1045,12 @@
break;
case Q_GETQUOTA:
if (((type == USRQUOTA && current->uid != id) ||
- (type == GRPQUOTA && in_group_p(id))) && !fsuser())
+ (type == GRPQUOTA && in_group_p(id))) &&
+ !capable(CAP_SYS_ADMIN))
goto out;
break;
default:
- if (!fsuser())
+ if (!capable(CAP_SYS_ADMIN))
goto out;
}

diff -urN /tmp/linux/fs/exec.c lp97/fs/exec.c
--- /tmp/linux/fs/exec.c Thu Apr 2 19:04:00 1998
+++ lp97/fs/exec.c Wed Apr 22 23:24:59 1998
@@ -564,7 +564,7 @@
int prepare_binprm(struct linux_binprm *bprm)
{
int mode;
- int retval,id_change;
+ int retval,id_change,cap_change;
struct inode * inode = bprm->dentry->d_inode;

mode = inode->i_mode;
@@ -584,7 +584,7 @@

bprm->e_uid = current->euid;
bprm->e_gid = current->egid;
- id_change = 0;
+ id_change = cap_change = 0;

/* Set-uid? */
if (mode & S_ISUID) {
@@ -641,19 +641,22 @@
(current->cap_inheritable.cap &
bprm->cap_inheritable.cap)) &
~current->cap_permitted.cap) {
- id_change = 1;
+ cap_change = 1;
}

- if (id_change) {
+ if (id_change || cap_change) {
/* We can't suid-execute if we're sharing parts of the executable */
/* or if we're being traced (or if suid execs are not allowed) */
/* (current->mm->count > 1 is ok, as we'll get a new mm anyway) */
- if (IS_NOSUID(inode)
+ if (IS_NOSUID(inode)
|| (current->flags & PF_PTRACED)
|| (current->fs->count > 1)
|| (atomic_read(&current->sig->count) > 1)
|| (current->files->count > 1)) {
- if (!suser())
+ if (id_change && !capable(CAP_SETUID))
+ return -EPERM;
+ /* This should almost never be allowed */
+ if (cap_change && !capable(CAP_SETPCAP))
return -EPERM;
}
}
diff -urN /tmp/linux/fs/ext2/acl.c lp97/fs/ext2/acl.c
--- /tmp/linux/fs/ext2/acl.c Mon Dec 22 02:41:24 1997
+++ lp97/fs/ext2/acl.c Thu Apr 23 00:09:45 1998
@@ -51,8 +51,11 @@
* Access is always granted for root. We now check last,
* though, for BSD process accounting correctness
*/
- if (((mode & mask & S_IRWXO) == mask) || fsuser())
+ if (((mode & mask & S_IRWXO) == mask) || capable(CAP_DAC_OVERRIDE))
return 0;
- else
- return -EACCES;
+ if ((mask == S_IROTH) ||
+ (S_ISDIR(mode) && !(mask & ~(S_IROTH | S_IXOTH))))
+ if (capable(CAP_DAC_READ_SEARCH))
+ return 0;
+ return -EACCES;
}
diff -urN /tmp/linux/fs/ext2/balloc.c lp97/fs/ext2/balloc.c
--- /tmp/linux/fs/ext2/balloc.c Thu Apr 2 23:39:52 1998
+++ lp97/fs/ext2/balloc.c Thu Apr 23 00:16:18 1998
@@ -383,7 +383,8 @@
if (le32_to_cpu(es->s_free_blocks_count) <= le32_to_cpu(es->s_r_blocks_count) &&
((sb->u.ext2_sb.s_resuid != current->fsuid) &&
(sb->u.ext2_sb.s_resgid == 0 ||
- !in_group_p (sb->u.ext2_sb.s_resgid)) && !fsuser())) {
+ !in_group_p (sb->u.ext2_sb.s_resgid)) &&
+ !capable(CAP_SYS_RESOURCE))) {
unlock_super (sb);
return 0;
}
diff -urN /tmp/linux/fs/ext2/file.c lp97/fs/ext2/file.c
--- /tmp/linux/fs/ext2/file.c Wed Apr 8 20:36:53 1998
+++ lp97/fs/ext2/file.c Thu Apr 23 00:17:09 1998
@@ -144,7 +144,7 @@

/* was any of the uid bits set? */
mode &= inode->i_mode;
- if (mode && !suser()) {
+ if (mode && !capable(CAP_FSETID)) {
inode->i_mode &= ~mode;
mark_inode_dirty(inode);
}
diff -urN /tmp/linux/fs/ext2/inode.c lp97/fs/ext2/inode.c
--- /tmp/linux/fs/ext2/inode.c Thu Apr 2 23:39:52 1998
+++ lp97/fs/ext2/inode.c Thu Apr 23 00:20:02 1998
@@ -726,9 +726,9 @@
(ATTR_FLAG_APPEND | ATTR_FLAG_IMMUTABLE)) ^
(inode->u.ext2_i.i_flags &
(EXT2_APPEND_FL | EXT2_IMMUTABLE_FL))) {
- if (!fsuser())
+ if (!capable(CAP_LINUX_IMMUTABLE))
goto out;
- } else if ((current->fsuid != inode->i_uid) && !fsuser())
+ } else if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
goto out;

retval = inode_change_ok(inode, iattr);
diff -urN /tmp/linux/fs/ext2/ioctl.c lp97/fs/ext2/ioctl.c
--- /tmp/linux/fs/ext2/ioctl.c Thu Apr 2 23:39:52 1998
+++ lp97/fs/ext2/ioctl.c Wed Apr 22 23:57:34 1998
@@ -39,10 +39,11 @@
(inode->u.ext2_i.i_flags &
(EXT2_APPEND_FL | EXT2_IMMUTABLE_FL))) {
/* This test looks nicer. Thanks to Pauline Middelink */
- if (!fsuser())
+ if (!capable(CAP_LINUX_IMMUTABLE))
return -EPERM;
} else
- if ((current->fsuid != inode->i_uid) && !fsuser())
+ if ((current->fsuid != inode->i_uid) &&
+ !capable(CAP_FOWNER))
return -EPERM;
if (IS_RDONLY(inode))
return -EROFS;
@@ -70,7 +71,7 @@
case EXT2_IOC_GETVERSION:
return put_user(inode->u.ext2_i.i_version, (int *) arg);
case EXT2_IOC_SETVERSION:
- if ((current->fsuid != inode->i_uid) && !fsuser())
+ if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
return -EPERM;
if (IS_RDONLY(inode))
return -EROFS;
diff -urN /tmp/linux/fs/ext2/namei.c lp97/fs/ext2/namei.c
--- /tmp/linux/fs/ext2/namei.c Thu Apr 2 23:39:51 1998
+++ lp97/fs/ext2/namei.c Thu Apr 23 00:22:37 1998
@@ -630,7 +630,7 @@
retval = -EPERM;
if ((dir->i_mode & S_ISVTX) &&
current->fsuid != inode->i_uid &&
- current->fsuid != dir->i_uid && !fsuser())
+ current->fsuid != dir->i_uid && !capable(CAP_FOWNER))
goto end_rmdir;
if (inode == dir) /* we may not delete ".", but "../dir" is ok */
goto end_rmdir;
@@ -724,7 +724,7 @@
goto end_unlink;
if ((dir->i_mode & S_ISVTX) &&
current->fsuid != inode->i_uid &&
- current->fsuid != dir->i_uid && !fsuser())
+ current->fsuid != dir->i_uid && !capable(CAP_FOWNER))
goto end_unlink;

retval = -EIO;
@@ -922,7 +922,7 @@
retval = -EPERM;
if ((old_dir->i_mode & S_ISVTX) &&
current->fsuid != old_inode->i_uid &&
- current->fsuid != old_dir->i_uid && !fsuser())
+ current->fsuid != old_dir->i_uid && !capable(CAP_FOWNER))
goto end_rename;
if (IS_APPEND(old_inode) || IS_IMMUTABLE(old_inode))
goto end_rename;
@@ -963,7 +963,7 @@
if (new_inode) {
if ((new_dir->i_mode & S_ISVTX) &&
current->fsuid != new_inode->i_uid &&
- current->fsuid != new_dir->i_uid && !fsuser())
+ current->fsuid != new_dir->i_uid && !capable(CAP_FOWNER))
goto end_rename;
if (IS_APPEND(new_inode) || IS_IMMUTABLE(new_inode))
goto end_rename;
diff -urN /tmp/linux/fs/minix/namei.c lp97/fs/minix/namei.c
--- /tmp/linux/fs/minix/namei.c Wed Feb 4 20:08:53 1998
+++ lp97/fs/minix/namei.c Thu Apr 23 00:45:52 1998
@@ -416,7 +416,7 @@

if ((dir->i_mode & S_ISVTX) &&
current->fsuid != inode->i_uid &&
- current->fsuid != dir->i_uid && !fsuser())
+ current->fsuid != dir->i_uid && !capable(CAP_FOWNER))
goto end_rmdir;
if (inode->i_dev != dir->i_dev)
goto end_rmdir;
@@ -482,7 +482,7 @@
}
if ((dir->i_mode & S_ISVTX) &&
current->fsuid != inode->i_uid &&
- current->fsuid != dir->i_uid && !fsuser())
+ current->fsuid != dir->i_uid && !capable(CAP_FOWNER))
goto end_unlink;
if (de->inode != inode->i_ino) {
retval = -ENOENT;
@@ -641,7 +641,7 @@
retval = -EPERM;
if ((old_dir->i_mode & S_ISVTX) &&
current->fsuid != old_inode->i_uid &&
- current->fsuid != old_dir->i_uid && !fsuser())
+ current->fsuid != old_dir->i_uid && !capable(CAP_FOWNER))
goto end_rename;
new_inode = new_dentry->d_inode;
new_bh = minix_find_entry(new_dir, new_dentry->d_name.name,
@@ -673,7 +673,7 @@
retval = -EPERM;
if (new_inode && (new_dir->i_mode & S_ISVTX) &&
current->fsuid != new_inode->i_uid &&
- current->fsuid != new_dir->i_uid && !fsuser())
+ current->fsuid != new_dir->i_uid && !capable(CAP_FOWNER))
goto end_rename;
if (S_ISDIR(old_inode->i_mode)) {
retval = -ENOTDIR;
diff -urN /tmp/linux/fs/namei.c lp97/fs/namei.c
--- /tmp/linux/fs/namei.c Tue Jan 13 00:03:28 1998
+++ lp97/fs/namei.c Thu Apr 23 00:09:43 1998
@@ -191,8 +191,13 @@
mode >>= 6;
else if (in_group_p(inode->i_gid))
mode >>= 3;
- if (((mode & mask & 0007) == mask) || fsuser())
+ if (((mode & mask & S_IRWXO) == mask) || capable(CAP_DAC_OVERRIDE))
return 0;
+ /* read and search access */
+ if ((mask == S_IROTH) ||
+ (S_ISDIR(mode) && !(mask & ~(S_IROTH | S_IXOTH))))
+ if (capable(CAP_DAC_READ_SEARCH))
+ return 0;
return -EACCES;
}

@@ -701,7 +706,7 @@

lock_kernel();
error = -EPERM;
- if (S_ISDIR(mode) || (!S_ISFIFO(mode) && !fsuser()))
+ if (S_ISDIR(mode) || (!S_ISFIFO(mode) && !capable(CAP_SYS_ADMIN)))
goto out;
error = -EINVAL;
switch (mode & S_IFMT) {
diff -urN /tmp/linux/fs/nfsd/nfsctl.c lp97/fs/nfsd/nfsctl.c
--- /tmp/linux/fs/nfsd/nfsctl.c Mon Jan 12 23:39:48 1998
+++ lp97/fs/nfsd/nfsctl.c Thu Apr 23 00:52:52 1998
@@ -148,7 +148,7 @@
if (!initialized)
nfsd_init();
err = -EPERM;
- if (!suser()) {
+ if (!capable(CAP_SYS_ADMIN)) {
goto done;
}
err = -EFAULT;
diff -urN /tmp/linux/fs/open.c lp97/fs/open.c
--- /tmp/linux/fs/open.c Tue Mar 10 22:28:05 1998
+++ lp97/fs/open.c Wed Apr 22 23:51:57 1998
@@ -411,7 +411,7 @@
goto dput_and_out;

error = -EPERM;
- if (!fsuser())
+ if (!capable(CAP_SYS_CHROOT))
goto dput_and_out;

/* exchange dentries */
@@ -833,7 +833,7 @@
int ret = -EPERM;

lock_kernel();
- if (!suser())
+ if (!capable(CAP_SYS_TTY_CONFIG))
goto out;
/* If there is a controlling tty, hang it up */
if (current->tty)
diff -urN /tmp/linux/fs/proc/array.c lp97/fs/proc/array.c
--- /tmp/linux/fs/proc/array.c Thu Mar 12 00:53:18 1998
+++ lp97/fs/proc/array.c Mon Apr 20 23:56:14 1998
@@ -764,6 +764,15 @@
return buffer;
}

+extern inline char *task_cap(struct task_struct *p, char *buffer)
+{
+ buffer += sprintf(buffer, "CapInh:\t%08x\n", p->cap_inheritable.cap);
+ buffer += sprintf(buffer, "CapPrm:\t%08x\n", p->cap_permitted.cap);
+ buffer += sprintf(buffer, "CapEff:\t%08x\n", p->cap_effective.cap);
+ return buffer;
+}
+
+
static int get_status(int pid, char * buffer)
{
char * orig = buffer;
@@ -778,6 +787,7 @@
buffer = task_state(tsk, buffer);
buffer = task_mem(tsk, buffer);
buffer = task_sig(tsk, buffer);
+ buffer = task_cap(tsk, buffer);
return buffer - orig;
}

diff -urN /tmp/linux/fs/proc/inode.c lp97/fs/proc/inode.c
--- /tmp/linux/fs/proc/inode.c Thu Apr 23 00:59:26 1998
+++ lp97/fs/proc/inode.c Thu Apr 23 00:25:15 1998
@@ -145,8 +145,13 @@
mode >>= 6;
else if (in_group_p(inode->i_gid))
mode >>= 3;
- if (((mode & mask & 0007) == mask) || fsuser())
+ if (((mode & mask & S_IRWXO) == mask) || capable(CAP_DAC_OVERRIDE))
return 0;
+ /* read and search access */
+ if ((mask == S_IROTH) ||
+ (S_ISDIR(mode) && !(mask & ~(S_IROTH | S_IXOTH))))
+ if (capable(CAP_DAC_READ_SEARCH))
+ return 0;
return -EACCES;
}

diff -urN /tmp/linux/fs/smbfs/proc.c lp97/fs/smbfs/proc.c
--- /tmp/linux/fs/smbfs/proc.c Mon Mar 2 21:37:44 1998
+++ lp97/fs/smbfs/proc.c Thu Apr 23 00:49:43 1998
@@ -630,7 +630,8 @@
goto out;

error = -EACCES;
- if (current->uid != server->mnt->mounted_uid && !suser())
+ if (current->uid != server->mnt->mounted_uid &&
+ !capable(CAP_SYS_ADMIN))
goto out;

error = -EBADF;
diff -urN /tmp/linux/fs/super.c lp97/fs/super.c
--- /tmp/linux/fs/super.c Sat Apr 4 19:45:18 1998
+++ lp97/fs/super.c Wed Apr 22 23:52:25 1998
@@ -743,7 +743,7 @@
struct dentry * dentry;
int retval;

- if (!suser())
+ if (!capable(CAP_SYS_ADMIN))
return -EPERM;

lock_kernel();
@@ -985,7 +985,7 @@
struct file dummy; /* allows read-write or read-only flag */

lock_kernel();
- if (!suser())
+ if (!capable(CAP_SYS_ADMIN))
goto out;
if ((new_flags &
(MS_MGC_MSK | MS_REMOUNT)) == (MS_MGC_VAL | MS_REMOUNT)) {
diff -urN /tmp/linux/fs/sysv/namei.c lp97/fs/sysv/namei.c
--- /tmp/linux/fs/sysv/namei.c Wed Feb 4 20:08:53 1998
+++ lp97/fs/sysv/namei.c Thu Apr 23 00:47:58 1998
@@ -419,7 +419,7 @@

if ((dir->i_mode & S_ISVTX) &&
current->fsuid != inode->i_uid &&
- current->fsuid != dir->i_uid && !fsuser())
+ current->fsuid != dir->i_uid && !capable(CAP_FOWNER))
goto end_rmdir;
if (inode->i_dev != dir->i_dev)
goto end_rmdir;
@@ -484,7 +484,7 @@
}
if ((dir->i_mode & S_ISVTX) &&
current->fsuid != inode->i_uid &&
- current->fsuid != dir->i_uid && !fsuser())
+ current->fsuid != dir->i_uid && !capable(CAP_FOWNER))
goto end_unlink;
if (de->inode != inode->i_ino) {
retval = -ENOENT;
@@ -643,7 +643,7 @@
retval = -EPERM;
if ((old_dir->i_mode & S_ISVTX) &&
current->fsuid != old_inode->i_uid &&
- current->fsuid != old_dir->i_uid && !fsuser())
+ current->fsuid != old_dir->i_uid && !capable(CAP_FOWNER))
goto end_rename;
new_inode = new_dentry->d_inode;
new_bh = sysv_find_entry(new_dir, new_dentry->d_name.name,
@@ -675,7 +675,7 @@
retval = -EPERM;
if (new_inode && (new_dir->i_mode & S_ISVTX) &&
current->fsuid != new_inode->i_uid &&
- current->fsuid != new_dir->i_uid && !fsuser())
+ current->fsuid != new_dir->i_uid && !capable(CAP_FOWNER))
goto end_rename;
if (S_ISDIR(old_inode->i_mode)) {
retval = -ENOTDIR;
diff -urN /tmp/linux/fs/umsdos/namei.c lp97/fs/umsdos/namei.c
--- /tmp/linux/fs/umsdos/namei.c Wed Apr 8 20:39:46 1998
+++ lp97/fs/umsdos/namei.c Thu Apr 23 00:47:16 1998
@@ -350,14 +350,14 @@
Printk (("ret %d ",ret));
if (ret == 0){
/* check sticky bit on old_dir */
- if ( !(old_dir->i_mode & S_ISVTX) || fsuser() ||
+ if ( !(old_dir->i_mode & S_ISVTX) || capable(CAP_FOWNER) ||
current->fsuid == old_info.entry.uid ||
current->fsuid == old_dir->i_uid ) {
/* Does new_name already exist? */
PRINTK(("new findentry "));
ret = umsdos_findentry(new_dir,&new_info,0);
if (ret != 0 || /* if destination file exists, are we allowed to replace it ? */
- !(new_dir->i_mode & S_ISVTX) || fsuser() ||
+ !(new_dir->i_mode & S_ISVTX) || capable(CAP_FOWNER) ||
current->fsuid == new_info.entry.uid ||
current->fsuid == new_dir->i_uid ) {
PRINTK (("new newentry "));
@@ -933,7 +933,7 @@
umsdos_real_lookup (dir, tdentry); /* fill inode part */
Printk (("isempty %d i_count %d ",empty,sdir->i_count));
/* check sticky bit */
- if ( !(dir->i_mode & S_ISVTX) || fsuser() ||
+ if ( !(dir->i_mode & S_ISVTX) || capable(CAP_FOWNER) ||
current->fsuid == sdir->i_uid ||
current->fsuid == dir->i_uid ) {
if (empty == 1){
@@ -1024,7 +1024,7 @@
if (ret == 0){
Printk (("UMSDOS_unlink %.*s ",info.fake.len,info.fake.fname));
/* check sticky bit */
- if ( !(dir->i_mode & S_ISVTX) || fsuser() ||
+ if ( !(dir->i_mode & S_ISVTX) || capable(CAP_FOWNER) ||
current->fsuid == info.entry.uid ||
current->fsuid == dir->i_uid ) {
if (info.entry.flags & UMSDOS_HLINK){
\
 
 \ /
  Last update: 2005-03-22 13:42    [W:0.044 / U:0.196 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site