From: Ulrich Drepper It has been discussed here before, that the user and group IDs as well as the auxiliary groups are a process property in POSIX and therefore a process group property in Linux. There has been some disagreement on how to implement this. As a first step I therefore created a patch which virtualizes access to the IDs and group informatin in the task struct. Andrew described the function names and from then on everything was straight forward. The changes are numerous (98k patch) and all over the place. But I think I caught most of the changes. Failures to do this will show up right away since the task structure element has been renamed. drivers/block/loop.c | 4 - drivers/char/agp/frontend.c | 2 drivers/net/tun.c | 2 drivers/usb/core/inode.c | 4 - fs/affs/inode.c | 4 - fs/affs/super.c | 4 - fs/attr.c | 7 + fs/autofs/inode.c | 4 - fs/autofs4/inode.c | 4 - fs/bfs/dir.c | 4 - fs/binfmt_elf.c | 12 +-- fs/cifs/cifsproto.h | 2 fs/cifs/connect.c | 4 - fs/cifs/dir.c | 2 fs/cifs/misc.c | 4 - fs/coda/cache.c | 6 - fs/coda/upcall.c | 2 fs/devpts/inode.c | 4 - fs/dquot.c | 2 fs/eventpoll.c | 4 - fs/exec.c | 29 ++++--- fs/ext2/acl.c | 4 - fs/ext2/balloc.c | 2 fs/ext2/ialloc.c | 4 - fs/ext2/ioctl.c | 4 - fs/ext3/acl.c | 4 - fs/ext3/balloc.c | 2 fs/ext3/ialloc.c | 4 - fs/ext3/ioctl.c | 4 - fs/fat/inode.c | 4 - fs/fcntl.c | 6 - fs/file_table.c | 8 +- fs/hfs/super.c | 4 - fs/hpfs/namei.c | 24 +++--- fs/hpfs/super.c | 4 - fs/hugetlbfs/inode.c | 18 ++-- fs/intermezzo/dir.c | 6 - fs/intermezzo/file.c | 10 +- fs/intermezzo/intermezzo_fs.h | 26 +++--- fs/intermezzo/journal.c | 48 ++++++------ fs/intermezzo/upcall.c | 2 fs/intermezzo/vfs.c | 4 - fs/jfs/acl.c | 2 fs/jfs/jfs_inode.c | 4 - fs/jfs/xattr.c | 2 fs/locks.c | 2 fs/minix/bitmap.c | 4 - fs/namei.c | 8 +- fs/ncpfs/ioctl.c | 30 +++---- fs/nfsd/auth.c | 12 +-- fs/nfsd/vfs.c | 2 fs/open.c | 19 ++-- fs/pipe.c | 4 - fs/posix_acl.c | 4 - fs/proc/array.c | 8 +- fs/proc/base.c | 16 ++-- fs/proc/inode.c | 4 - fs/quota.c | 2 fs/ramfs/inode.c | 4 - fs/reiserfs/ioctl.c | 4 - fs/reiserfs/namei.c | 4 - fs/smbfs/dir.c | 4 - fs/smbfs/inode.c | 2 fs/smbfs/proc.c | 2 fs/sysfs/inode.c | 4 - fs/sysv/ialloc.c | 4 - fs/udf/ialloc.c | 4 - fs/udf/namei.c | 2 fs/ufs/ialloc.c | 4 - fs/xfs/linux/xfs_iops.c | 2 fs/xfs/xfs_acl.c | 6 - fs/xfs/xfs_dfrag.c | 4 - fs/xfs/xfs_inode.c | 6 - fs/xfs/xfs_vnodeops.c | 11 +- include/linux/sched.h | 103 ++++++++++++++++++++++++- include/net/scm.h | 4 - ipc/msg.c | 4 - ipc/sem.c | 4 - ipc/shm.c | 8 +- ipc/util.c | 6 - kernel/ptrace.c | 12 +-- kernel/sched.c | 8 +- kernel/signal.c | 20 ++--- kernel/sys.c | 168 ++++++++++++++++++++++-------------------- kernel/sysctl.c | 2 kernel/timer.c | 8 +- kernel/uid16.c | 28 +++---- mm/oom_kill.c | 2 mm/shmem.c | 8 +- net/core/scm.c | 10 +- net/ipv6/ip6_flowlabel.c | 2 net/socket.c | 4 - net/sunrpc/auth.c | 16 ++-- net/sunrpc/auth_unix.c | 8 +- net/sunrpc/sched.c | 3 net/unix/af_unix.c | 12 +-- security/commoncap.c | 17 ++-- security/dummy.c | 19 ++-- 98 files changed, 547 insertions(+), 421 deletions(-) diff -puN drivers/block/loop.c~d-task-xid drivers/block/loop.c --- 25/drivers/block/loop.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/drivers/block/loop.c 2003-09-27 19:29:17.000000000 -0700 @@ -860,7 +860,7 @@ loop_set_status(struct loop_device *lo, int err; struct loop_func_table *xfer; - if (lo->lo_encrypt_key_size && lo->lo_key_owner != current->uid && + if (lo->lo_encrypt_key_size && lo->lo_key_owner != tsk_uid(current) && !capable(CAP_SYS_ADMIN)) return -EPERM; if (lo->lo_state != Lo_bound) @@ -911,7 +911,7 @@ loop_set_status(struct loop_device *lo, if (info->lo_encrypt_key_size) { memcpy(lo->lo_encrypt_key, info->lo_encrypt_key, info->lo_encrypt_key_size); - lo->lo_key_owner = current->uid; + lo->lo_key_owner = tsk_uid(current); } return 0; diff -puN drivers/char/agp/frontend.c~d-task-xid drivers/char/agp/frontend.c --- 25/drivers/char/agp/frontend.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/drivers/char/agp/frontend.c 2003-09-27 19:29:17.000000000 -0700 @@ -716,7 +716,7 @@ static int agp_open(struct inode *inode, set_bit(AGP_FF_ALLOW_CLIENT, &priv->access_flags); priv->my_pid = current->pid; - if ((current->uid == 0) || (current->suid == 0)) { + if ((tsk_uid(current) == 0) || (tsk_suid(current) == 0)) { /* Root priv, can be controller */ set_bit(AGP_FF_ALLOW_CONTROLLER, &priv->access_flags); } diff -puN drivers/net/tun.c~d-task-xid drivers/net/tun.c --- 25/drivers/net/tun.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/drivers/net/tun.c 2003-09-27 19:29:17.000000000 -0700 @@ -386,7 +386,7 @@ static int tun_set_iff(struct file *file /* Check permissions */ if (tun->owner != -1 && - current->euid != tun->owner && !capable(CAP_NET_ADMIN)) + tsk_euid(current) != tun->owner && !capable(CAP_NET_ADMIN)) return -EPERM; } else if (__dev_get_by_name(ifr->ifr_name)) diff -puN drivers/usb/core/inode.c~d-task-xid drivers/usb/core/inode.c --- 25/drivers/usb/core/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/drivers/usb/core/inode.c 2003-09-27 19:29:17.000000000 -0700 @@ -148,8 +148,8 @@ static struct inode *usbfs_get_inode (st if (inode) { inode->i_mode = mode; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = tsk_fsgid(current); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; diff -puN fs/affs/inode.c~d-task-xid fs/affs/inode.c --- 25/fs/affs/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/affs/inode.c 2003-09-27 19:29:17.000000000 -0700 @@ -317,8 +317,8 @@ affs_new_inode(struct inode *dir) mark_buffer_dirty_inode(bh, inode); affs_brelse(bh); - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = tsk_fsgid(current); inode->i_ino = block; inode->i_nlink = 1; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; diff -puN fs/affs/super.c~d-task-xid fs/affs/super.c --- 25/fs/affs/super.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/affs/super.c 2003-09-27 19:29:17.000000000 -0700 @@ -151,8 +151,8 @@ parse_options(char *options, uid_t *uid, /* Fill in defaults */ - *uid = current->uid; - *gid = current->gid; + *uid = tsk_uid(current); + *gid = tsk_gid(current); *reserved = 2; *root = -1; *blocksize = -1; diff -puN fs/attr.c~d-task-xid fs/attr.c --- 25/fs/attr.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/attr.c 2003-09-27 19:29:17.000000000 -0700 @@ -28,7 +28,7 @@ int inode_change_ok(struct inode *inode, /* Make sure a caller can chown. */ if ((ia_valid & ATTR_UID) && - (current->fsuid != inode->i_uid || + (tsk_fsuid(current) != inode->i_uid || attr->ia_uid != inode->i_uid) && !capable(CAP_CHOWN)) goto error; @@ -40,7 +40,8 @@ int inode_change_ok(struct inode *inode, /* Make sure a caller can chmod. */ if (ia_valid & ATTR_MODE) { - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if ((tsk_fsuid(current) != inode->i_uid) && + !capable(CAP_FOWNER)) goto error; /* Also check the setgid bit! */ if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid : @@ -50,7 +51,7 @@ int inode_change_ok(struct inode *inode, /* Check for setting the inode time. */ if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET)) { - if (current->fsuid != inode->i_uid && !capable(CAP_FOWNER)) + if (tsk_fsuid(current) != inode->i_uid && !capable(CAP_FOWNER)) goto error; } fine: diff -puN fs/autofs4/inode.c~d-task-xid fs/autofs4/inode.c --- 25/fs/autofs4/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/autofs4/inode.c 2003-09-27 19:29:17.000000000 -0700 @@ -99,8 +99,8 @@ static int parse_options(char *options, { char *this_char, *value; - *uid = current->uid; - *gid = current->gid; + *uid = tsk_uid(current); + *gid = tsk_gid(current); *pgrp = process_group(current); *minproto = AUTOFS_MIN_PROTO_VERSION; diff -puN fs/autofs/inode.c~d-task-xid fs/autofs/inode.c --- 25/fs/autofs/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/autofs/inode.c 2003-09-27 19:29:17.000000000 -0700 @@ -49,8 +49,8 @@ static int parse_options(char *options, { char *this_char, *value; - *uid = current->uid; - *gid = current->gid; + *uid = tsk_uid(current); + *gid = tsk_gid(current); *pgrp = process_group(current); *minproto = *maxproto = AUTOFS_PROTO_VERSION; diff -puN fs/bfs/dir.c~d-task-xid fs/bfs/dir.c --- 25/fs/bfs/dir.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/bfs/dir.c 2003-09-27 19:29:17.000000000 -0700 @@ -99,8 +99,8 @@ static int bfs_create(struct inode * dir } set_bit(ino, info->si_imap); info->si_freei--; - inode->i_uid = current->fsuid; - inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : tsk_fsgid(current); inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_blocks = inode->i_blksize = 0; inode->i_op = &bfs_file_inops; diff -puN fs/binfmt_elf.c~d-task-xid fs/binfmt_elf.c --- 25/fs/binfmt_elf.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/binfmt_elf.c 2003-09-27 19:29:17.000000000 -0700 @@ -188,10 +188,10 @@ create_elf_tables(struct linux_binprm *b NEW_AUX_ENT(AT_BASE, interp_load_addr); NEW_AUX_ENT(AT_FLAGS, 0); NEW_AUX_ENT(AT_ENTRY, exec->e_entry); - NEW_AUX_ENT(AT_UID, (elf_addr_t) tsk->uid); - NEW_AUX_ENT(AT_EUID, (elf_addr_t) tsk->euid); - NEW_AUX_ENT(AT_GID, (elf_addr_t) tsk->gid); - NEW_AUX_ENT(AT_EGID, (elf_addr_t) tsk->egid); + NEW_AUX_ENT(AT_UID, (elf_addr_t) tsk_uid(tsk)); + NEW_AUX_ENT(AT_EUID, (elf_addr_t) tsk_euid(tsk)); + NEW_AUX_ENT(AT_GID, (elf_addr_t) tsk_gid(tsk)); + NEW_AUX_ENT(AT_EGID, (elf_addr_t) tsk_egid(tsk)); NEW_AUX_ENT(AT_SECURE, (elf_addr_t) security_bprm_secureexec(bprm)); if (k_platform) { NEW_AUX_ENT(AT_PLATFORM, (elf_addr_t)(long)u_platform); @@ -1114,8 +1114,8 @@ static void fill_psinfo(struct elf_prpsi psinfo->pr_zomb = psinfo->pr_sname == 'Z'; psinfo->pr_nice = task_nice(p); psinfo->pr_flag = p->flags; - psinfo->pr_uid = NEW_TO_OLD_UID(p->uid); - psinfo->pr_gid = NEW_TO_OLD_GID(p->gid); + psinfo->pr_uid = NEW_TO_OLD_UID(tsk_uid(p)); + psinfo->pr_gid = NEW_TO_OLD_GID(tsk_gid(p)); strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname)); return; diff -puN fs/cifs/cifsproto.h~d-task-xid fs/cifs/cifsproto.h --- 25/fs/cifs/cifsproto.h~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/cifs/cifsproto.h 2003-09-27 19:29:17.000000000 -0700 @@ -36,7 +36,7 @@ extern int smb_send(struct socket *, str unsigned int /* length */ , struct sockaddr *); extern unsigned int _GetXid(void); extern void _FreeXid(unsigned int); -#define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__FUNCTION__, xid,current->fsuid)); +#define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__FUNCTION__, xid,tsk_fsuid(current))); #define FreeXid(curr_xid) {_FreeXid(curr_xid); cFYI(1,("CIFS VFS: leaving %s (xid = %d) rc = %d",__FUNCTION__,curr_xid,rc));} extern char *build_path_from_dentry(struct dentry *); extern char *build_wildcard_path_from_dentry(struct dentry *direntry); diff -puN fs/cifs/connect.c~d-task-xid fs/cifs/connect.c --- 25/fs/cifs/connect.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/cifs/connect.c 2003-09-27 19:29:17.000000000 -0700 @@ -350,8 +350,8 @@ parse_mount_options(char *options, const int temp_len; memset(vol,0,sizeof(struct smb_vol)); - vol->linux_uid = current->uid; /* current->euid instead? */ - vol->linux_gid = current->gid; + vol->linux_uid = tsk_uid(current); /* tsk_euid instead? */ + vol->linux_gid = tsk_gid(current); vol->dir_mode = S_IRWXUGO; /* 2767 perms indicate mandatory locking support */ vol->file_mode = S_IALLUGO & ~(S_ISUID | S_IXGRP); diff -puN fs/cifs/dir.c~d-task-xid fs/cifs/dir.c --- 25/fs/cifs/dir.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/cifs/dir.c 2003-09-27 19:29:17.000000000 -0700 @@ -277,7 +277,7 @@ int cifs_mknod(struct inode *inode, stru if (pTcon->ses->capabilities & CAP_UNIX) { rc = CIFSSMBUnixSetPerms(xid, pTcon, - full_path, mode, current->euid, current->egid, + full_path, mode, tsk_euid(current), tsk_egid(current), device_number, cifs_sb->local_nls); if(!rc) { rc = cifs_get_inode_info_unix(&newinode, full_path, diff -puN fs/cifs/misc.c~d-task-xid fs/cifs/misc.c --- 25/fs/cifs/misc.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/cifs/misc.c 2003-09-27 19:29:17.000000000 -0700 @@ -256,12 +256,12 @@ header_assemble(struct smb_hdr *buffer, /* BB Add support for establishing new tCon and SMB Session */ /* with userid/password pairs found on the smb session */ /* for other target tcp/ip addresses BB */ - if(current->uid != treeCon->ses->linux_uid) { + if(tsk_uid(current) != treeCon->ses->linux_uid) { cFYI(1,("Multiuser mode and UID did not match tcon uid ")); read_lock(&GlobalSMBSeslock); list_for_each(temp_item, &GlobalSMBSessionList) { ses = list_entry(temp_item, struct cifsSesInfo, cifsSessionList); - if(ses->linux_uid == current->uid) { + if(ses->linux_uid == tsk_uid(current)) { if(ses->server == treeCon->ses->server) { cFYI(1,("found matching uid substitute right smb_uid")); buffer->Uid = ses->Suid; diff -puN fs/coda/cache.c~d-task-xid fs/coda/cache.c --- 25/fs/coda/cache.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/coda/cache.c 2003-09-27 19:29:17.000000000 -0700 @@ -31,8 +31,8 @@ void coda_cache_enter(struct inode *inod struct coda_inode_info *cii = ITOC(inode); cii->c_cached_epoch = atomic_read(&permission_epoch); - if (cii->c_uid != current->fsuid) { - cii->c_uid = current->fsuid; + if (cii->c_uid != tsk_fsuid(current)) { + cii->c_uid = tsk_fsuid(current); cii->c_cached_perm = mask; } else cii->c_cached_perm |= mask; @@ -64,7 +64,7 @@ int coda_cache_check(struct inode *inode int hit; hit = (mask & cii->c_cached_perm) == mask && - cii->c_uid == current->fsuid && + cii->c_uid == tsk_fsuid(current) && cii->c_cached_epoch == atomic_read(&permission_epoch); return hit; diff -puN fs/coda/upcall.c~d-task-xid fs/coda/upcall.c --- 25/fs/coda/upcall.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/coda/upcall.c 2003-09-27 19:29:17.000000000 -0700 @@ -59,7 +59,7 @@ static void *alloc_upcall(int opcode, in memset(&inp->ih.cred, 0, sizeof(struct coda_cred)); inp->ih.cred.cr_fsuid = current->fsuid; #else - inp->ih.uid = current->fsuid; + inp->ih.uid = tsk_fsuid(current); #endif return (void*)inp; } diff -puN fs/devpts/inode.c~d-task-xid fs/devpts/inode.c --- 25/fs/devpts/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/devpts/inode.c 2003-09-27 19:29:17.000000000 -0700 @@ -147,8 +147,8 @@ void devpts_pty_new(int number, dev_t de return; inode->i_ino = number+2; inode->i_blksize = 1024; - inode->i_uid = config.setuid ? config.uid : current->fsuid; - inode->i_gid = config.setgid ? config.gid : current->fsgid; + inode->i_uid = config.setuid ? config.uid : tsk_fsuid(current); + inode->i_gid = config.setgid ? config.gid : tsk_fsgid(current); inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; init_special_inode(inode, S_IFCHR|config.mode, device); inode->i_op = &devpts_file_inode_operations; diff -puN fs/dquot.c~d-task-xid fs/dquot.c --- 25/fs/dquot.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/dquot.c 2003-09-27 19:29:17.000000000 -0700 @@ -643,7 +643,7 @@ static inline int need_print_warning(str { switch (dquot->dq_type) { case USRQUOTA: - return current->fsuid == dquot->dq_id; + return tsk_fsuid(current) == dquot->dq_id; case GRPQUOTA: return in_group_p(dquot->dq_id); } diff -puN fs/eventpoll.c~d-task-xid fs/eventpoll.c --- 25/fs/eventpoll.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/eventpoll.c 2003-09-27 19:29:17.000000000 -0700 @@ -1651,8 +1651,8 @@ static struct inode *ep_eventpoll_inode( */ inode->i_state = I_DIRTY; inode->i_mode = S_IRUSR | S_IWUSR; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = tsk_fsgid(current); inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; inode->i_blksize = PAGE_SIZE; return inode; diff -puN fs/exec.c~d-task-xid fs/exec.c --- 25/fs/exec.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/exec.c 2003-09-27 19:29:17.000000000 -0700 @@ -789,7 +789,8 @@ int flush_old_exec(struct linux_binprm * current->sas_ss_sp = current->sas_ss_size = 0; - if (current->euid == current->uid && current->egid == current->gid) + if (tsk_euid(current) == tsk_uid(current) && + tsk_egid(current) == tsk_gid(current)) current->mm->dumpable = 1; name = bprm->filename; for (i=0; (ch = *(name++)) != '\0';) { @@ -803,7 +804,8 @@ int flush_old_exec(struct linux_binprm * flush_thread(); - if (bprm->e_uid != current->euid || bprm->e_gid != current->egid || + if (bprm->e_uid != tsk_euid(current) || + bprm->e_gid != tsk_egid(current) || permission(bprm->file->f_dentry->d_inode,MAY_READ, NULL)) current->mm->dumpable = 0; @@ -851,8 +853,8 @@ int prepare_binprm(struct linux_binprm * if (bprm->file->f_op == NULL) return -EACCES; - bprm->e_uid = current->euid; - bprm->e_gid = current->egid; + bprm->e_uid = tsk_euid(current); + bprm->e_gid = tsk_egid(current); if(!(bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)) { /* Set-uid? */ @@ -896,7 +898,8 @@ int prepare_binprm(struct linux_binprm * void compute_creds(struct linux_binprm *bprm) { task_lock(current); - if (bprm->e_uid != current->uid || bprm->e_gid != current->gid) { + if (bprm->e_uid != tsk_uid(current) || + bprm->e_gid != tsk_gid(current)) { current->mm->dumpable = 0; if (must_not_trace_exec(current) @@ -904,14 +907,18 @@ void compute_creds(struct linux_binprm * || atomic_read(¤t->files->count) > 1 || atomic_read(¤t->sighand->count) > 1) { if(!capable(CAP_SETUID)) { - bprm->e_uid = current->uid; - bprm->e_gid = current->gid; + bprm->e_uid = tsk_uid(current); + bprm->e_gid = tsk_gid(current); } } } - current->suid = current->euid = current->fsuid = bprm->e_uid; - current->sgid = current->egid = current->fsgid = bprm->e_gid; + set_tsk_suid(current, bprm->e_uid); + set_tsk_euid(current, bprm->e_uid); + set_tsk_fsuid(current, bprm->e_uid); + set_tsk_sgid(current, bprm->e_gid); + set_tsk_egid(current, bprm->e_gid); + set_tsk_fsgid(current, bprm->e_gid); task_unlock(current); @@ -1190,7 +1197,7 @@ void format_corename(char *corename, con /* uid */ case 'u': rc = snprintf(out_ptr, out_end - out_ptr, - "%d", current->uid); + "%d", tsk_uid(current)); if (rc > out_end - out_ptr) goto out; out_ptr += rc; @@ -1198,7 +1205,7 @@ void format_corename(char *corename, con /* gid */ case 'g': rc = snprintf(out_ptr, out_end - out_ptr, - "%d", current->gid); + "%d", tsk_gid(current)); if (rc > out_end - out_ptr) goto out; out_ptr += rc; diff -puN fs/ext2/acl.c~d-task-xid fs/ext2/acl.c --- 25/fs/ext2/acl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ext2/acl.c 2003-09-27 19:29:17.000000000 -0700 @@ -294,7 +294,7 @@ ext2_permission(struct inode *inode, int /* Nobody gets write access to an immutable file */ if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode)) return -EACCES; - if (current->fsuid == inode->i_uid) { + if (tsk_fsuid(current) == inode->i_uid) { mode >>= 6; } else if (test_opt(inode->i_sb, POSIX_ACL)) { struct posix_acl *acl; @@ -497,7 +497,7 @@ ext2_xattr_set_acl(struct inode *inode, if (!test_opt(inode->i_sb, POSIX_ACL)) return -EOPNOTSUPP; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if (tsk_fsuid(current) != inode->i_uid && !capable(CAP_FOWNER)) return -EPERM; if (value) { diff -puN fs/ext2/balloc.c~d-task-xid fs/ext2/balloc.c --- 25/fs/ext2/balloc.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ext2/balloc.c 2003-09-27 19:29:17.000000000 -0700 @@ -112,7 +112,7 @@ static int reserve_blocks(struct super_b count = free_blocks; if (free_blocks < root_blocks + count && !capable(CAP_SYS_RESOURCE) && - sbi->s_resuid != current->fsuid && + sbi->s_resuid != tsk_fsuid(current) && (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { /* * We are too close to reserve and we are not privileged. diff -puN fs/ext2/ialloc.c~d-task-xid fs/ext2/ialloc.c --- 25/fs/ext2/ialloc.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ext2/ialloc.c 2003-09-27 19:29:17.000000000 -0700 @@ -590,7 +590,7 @@ got: spin_unlock(sb_bgl_lock(EXT2_SB(sb), group)); sb->s_dirt = 1; - inode->i_uid = current->fsuid; + inode->i_uid = tsk_fsuid(current); if (test_opt (sb, GRPID)) inode->i_gid = dir->i_gid; else if (dir->i_mode & S_ISGID) { @@ -598,7 +598,7 @@ got: if (S_ISDIR(mode)) mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = tsk_fsgid(current); inode->i_mode = mode; inode->i_ino = ino; diff -puN fs/ext2/ioctl.c~d-task-xid fs/ext2/ioctl.c --- 25/fs/ext2/ioctl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ext2/ioctl.c 2003-09-27 19:29:17.000000000 -0700 @@ -32,7 +32,7 @@ int ext2_ioctl (struct inode * inode, st if (IS_RDONLY(inode)) return -EROFS; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if (tsk_fsuid(current) != inode->i_uid && !capable(CAP_FOWNER)) return -EACCES; if (get_user(flags, (int *) arg)) @@ -66,7 +66,7 @@ int ext2_ioctl (struct inode * inode, st case EXT2_IOC_GETVERSION: return put_user(inode->i_generation, (int *) arg); case EXT2_IOC_SETVERSION: - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if (tsk_fsuid(current) != inode->i_uid && !capable(CAP_FOWNER)) return -EPERM; if (IS_RDONLY(inode)) return -EROFS; diff -puN fs/ext3/acl.c~d-task-xid fs/ext3/acl.c --- 25/fs/ext3/acl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ext3/acl.c 2003-09-27 19:29:17.000000000 -0700 @@ -299,7 +299,7 @@ ext3_permission(struct inode *inode, int /* Nobody gets write access to an immutable file */ if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode)) return -EACCES; - if (current->fsuid == inode->i_uid) { + if (tsk_fsuid(current) == inode->i_uid) { mode >>= 6; } else if (test_opt(inode->i_sb, POSIX_ACL)) { struct posix_acl *acl; @@ -516,7 +516,7 @@ ext3_xattr_set_acl(struct inode *inode, if (!test_opt(inode->i_sb, POSIX_ACL)) return -EOPNOTSUPP; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if (tsk_fsuid(current) != inode->i_uid && !capable(CAP_FOWNER)) return -EPERM; if (value) { diff -puN fs/ext3/balloc.c~d-task-xid fs/ext3/balloc.c --- 25/fs/ext3/balloc.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ext3/balloc.c 2003-09-27 19:29:17.000000000 -0700 @@ -514,7 +514,7 @@ ext3_new_block(handle_t *handle, struct free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); root_blocks = le32_to_cpu(es->s_r_blocks_count); if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) && - sbi->s_resuid != current->fsuid && + sbi->s_resuid != tsk_fsuid(current) && (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { *errp = -ENOSPC; return 0; diff -puN fs/ext3/ialloc.c~d-task-xid fs/ext3/ialloc.c --- 25/fs/ext3/ialloc.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ext3/ialloc.c 2003-09-27 19:29:17.000000000 -0700 @@ -538,7 +538,7 @@ got: percpu_counter_inc(&sbi->s_dirs_counter); sb->s_dirt = 1; - inode->i_uid = current->fsuid; + inode->i_uid = tsk_fsuid(current); if (test_opt (sb, GRPID)) inode->i_gid = dir->i_gid; else if (dir->i_mode & S_ISGID) { @@ -546,7 +546,7 @@ got: if (S_ISDIR(mode)) mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = tsk_fsgid(current); inode->i_mode = mode; inode->i_ino = ino; diff -puN fs/ext3/ioctl.c~d-task-xid fs/ext3/ioctl.c --- 25/fs/ext3/ioctl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ext3/ioctl.c 2003-09-27 19:29:17.000000000 -0700 @@ -37,7 +37,7 @@ int ext3_ioctl (struct inode * inode, st if (IS_RDONLY(inode)) return -EROFS; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if (tsk_fsuid(current) != inode->i_uid && !capable(CAP_FOWNER)) return -EACCES; if (get_user(flags, (int *) arg)) @@ -108,7 +108,7 @@ flags_err: __u32 generation; int err; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if (tsk_fsuid(current) != inode->i_uid && !capable(CAP_FOWNER)) return -EPERM; if (IS_RDONLY(inode)) return -EROFS; diff -puN fs/fat/inode.c~d-task-xid fs/fat/inode.c --- 25/fs/fat/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/fat/inode.c 2003-09-27 19:29:17.000000000 -0700 @@ -267,8 +267,8 @@ static int parse_options(char *options, opts->isvfat = is_vfat; - opts->fs_uid = current->uid; - opts->fs_gid = current->gid; + opts->fs_uid = tsk_uid(current); + opts->fs_gid = tsk_gid(current); opts->fs_fmask = opts->fs_dmask = current->fs->umask; opts->codepage = 0; opts->iocharset = NULL; diff -puN fs/fcntl.c~d-task-xid fs/fcntl.c --- 25/fs/fcntl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/fcntl.c 2003-09-27 19:29:17.000000000 -0700 @@ -269,7 +269,7 @@ int f_setown(struct file *filp, unsigned if (err) return err; - f_modown(filp, arg, current->uid, current->euid, force); + f_modown(filp, arg, tsk_uid(current), tsk_euid(current), force); return 0; } @@ -422,8 +422,8 @@ static inline int sigio_perm(struct task struct fown_struct *fown) { return ((fown->euid == 0) || - (fown->euid == p->suid) || (fown->euid == p->uid) || - (fown->uid == p->suid) || (fown->uid == p->uid)); + (fown->euid == tsk_suid(p)) || (fown->euid == tsk_uid(p)) || + (fown->uid == tsk_suid(p)) || (fown->uid == tsk_uid(p))); } static void send_sigio_to_task(struct task_struct *p, diff -puN fs/file_table.c~d-task-xid fs/file_table.c --- 25/fs/file_table.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/file_table.c 2003-09-27 19:29:17.000000000 -0700 @@ -78,8 +78,8 @@ static int old_max; } eventpoll_init_file(f); atomic_set(&f->f_count, 1); - f->f_uid = current->fsuid; - f->f_gid = current->fsgid; + f->f_uid = tsk_fsuid(current); + f->f_gid = tsk_fsgid(current); f->f_owner.lock = RW_LOCK_UNLOCKED; /* f->f_version: 0 */ INIT_LIST_HEAD(&f->f_list); @@ -114,8 +114,8 @@ int open_private_file(struct file *filp, filp->f_mode = (flags+1) & O_ACCMODE; atomic_set(&filp->f_count, 1); filp->f_dentry = dentry; - filp->f_uid = current->fsuid; - filp->f_gid = current->fsgid; + filp->f_uid = tsk_fsuid(current); + filp->f_gid = tsk_fsgid(current); filp->f_op = dentry->d_inode->i_fop; INIT_LIST_HEAD(&filp->f_list); error = security_file_alloc(filp); diff -puN fs/hfs/super.c~d-task-xid fs/hfs/super.c --- 25/fs/hfs/super.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/hfs/super.c 2003-09-27 19:29:17.000000000 -0700 @@ -225,8 +225,8 @@ static int parse_options(char *options, /* initialize the sb with defaults */ memset(hsb, 0, sizeof(*hsb)); hsb->magic = HFS_SB_MAGIC; - hsb->s_uid = current->uid; - hsb->s_gid = current->gid; + hsb->s_uid = tsk_uid(current); + hsb->s_gid = tsk_gid(current); hsb->s_umask = current->fs->umask; hsb->s_type = 0x3f3f3f3f; /* == '????' */ hsb->s_creator = 0x3f3f3f3f; /* == '????' */ diff -puN fs/hpfs/namei.c~d-task-xid fs/hpfs/namei.c --- 25/fs/hpfs/namei.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/hpfs/namei.c 2003-09-27 19:29:17.000000000 -0700 @@ -80,11 +80,11 @@ int hpfs_mkdir(struct inode *dir, struct result->i_atime.tv_nsec = 0; hpfs_i(result)->i_ea_size = 0; if (dee.read_only) result->i_mode &= ~0222; - if (result->i_uid != current->fsuid || - result->i_gid != current->fsgid || + if (result->i_uid != tsk_fsuid(current) || + result->i_gid != tsk_fsgid(current) || result->i_mode != (mode | S_IFDIR)) { - result->i_uid = current->fsuid; - result->i_gid = current->fsgid; + result->i_uid = tsk_fsuid(current); + result->i_gid = tsk_fsgid(current); result->i_mode = mode | S_IFDIR; hpfs_write_inode_nolock(result); } @@ -158,11 +158,11 @@ int hpfs_create(struct inode *dir, struc result->i_data.a_ops = &hpfs_aops; hpfs_i(result)->mmu_private = 0; } - if (result->i_uid != current->fsuid || - result->i_gid != current->fsgid || + if (result->i_uid != tsk_fsuid(current) || + result->i_gid != tsk_fsgid(current) || result->i_mode != (mode | S_IFREG)) { - result->i_uid = current->fsuid; - result->i_gid = current->fsgid; + result->i_uid = tsk_fsuid(current); + result->i_gid = tsk_fsgid(current); result->i_mode = mode | S_IFREG; hpfs_write_inode_nolock(result); } @@ -228,8 +228,8 @@ int hpfs_mknod(struct inode *dir, struct hpfs_i(result)->i_ea_size = 0; /*if (result->i_blocks == -1) result->i_blocks = 1; if (result->i_size == -1) result->i_size = 0;*/ - result->i_uid = current->fsuid; - result->i_gid = current->fsgid; + result->i_uid = tsk_fsuid(current); + result->i_gid = tsk_fsgid(current); result->i_nlink = 1; result->i_size = 0; result->i_blocks = 1; @@ -302,8 +302,8 @@ int hpfs_symlink(struct inode *dir, stru /*if (result->i_blocks == -1) result->i_blocks = 1; if (result->i_size == -1) result->i_size = 0;*/ result->i_mode = S_IFLNK | 0777; - result->i_uid = current->fsuid; - result->i_gid = current->fsgid; + result->i_uid = tsk_fsuid(current); + result->i_gid = tsk_fsgid(current); result->i_blocks = 1; result->i_size = strlen(symlink); result->i_op = &page_symlink_inode_operations; diff -puN fs/hpfs/super.c~d-task-xid fs/hpfs/super.c --- 25/fs/hpfs/super.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/hpfs/super.c 2003-09-27 19:29:17.000000000 -0700 @@ -452,8 +452,8 @@ static int hpfs_fill_super(struct super_ init_MUTEX(&sbi->hpfs_creation_de); init_waitqueue_head(&sbi->sb_iget_q); - uid = current->uid; - gid = current->gid; + uid = tsk_uid(current); + gid = tsk_gid(current); umask = current->fs->umask; lowercase = 0; conv = CONV_BINARY; diff -puN fs/hugetlbfs/inode.c~d-task-xid fs/hugetlbfs/inode.c --- 25/fs/hugetlbfs/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/hugetlbfs/inode.c 2003-09-27 19:29:17.000000000 -0700 @@ -412,8 +412,9 @@ static struct inode *hugetlbfs_get_inode static int hugetlbfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) { - struct inode *inode = hugetlbfs_get_inode(dir->i_sb, current->fsuid, - current->fsgid, mode, dev); + struct inode *inode = hugetlbfs_get_inode(dir->i_sb, + tsk_fsuid(current), + tsk_fsgid(current), mode, dev); int error = -ENOSPC; if (inode) { @@ -445,8 +446,9 @@ static int hugetlbfs_symlink(struct inod struct inode *inode; int error = -ENOSPC; - inode = hugetlbfs_get_inode(dir->i_sb, current->fsuid, - current->fsgid, S_IFLNK|S_IRWXUGO, 0); + inode = hugetlbfs_get_inode(dir->i_sb, tsk_fsuid(current), + tsk_fsgid(current), + S_IFLNK|S_IRWXUGO, 0); if (inode) { int l = strlen(symname)+1; error = page_symlink(inode, symname, l); @@ -655,8 +657,8 @@ hugetlbfs_fill_super(struct super_block config.nr_blocks = -1; /* No limit on size by default */ config.nr_inodes = -1; /* No limit on number of inodes by default */ - config.uid = current->fsuid; - config.gid = current->fsgid; + config.uid = tsk_fsuid(current); + config.gid = tsk_fsgid(current); config.mode = 0755; ret = hugetlbfs_parse_options(data, &config); @@ -762,8 +764,8 @@ struct file *hugetlb_zero_setup(size_t s goto out_dentry; error = -ENOSPC; - inode = hugetlbfs_get_inode(root->d_sb, current->fsuid, - current->fsgid, S_IFREG | S_IRWXUGO, 0); + inode = hugetlbfs_get_inode(root->d_sb, tsk_fsuid(current), + tsk_fsgid(current), S_IFREG | S_IRWXUGO, 0); if (!inode) goto out_file; diff -puN fs/intermezzo/dir.c~d-task-xid fs/intermezzo/dir.c --- 25/fs/intermezzo/dir.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/intermezzo/dir.c 2003-09-27 19:29:17.000000000 -0700 @@ -126,7 +126,7 @@ struct dentry *presto_tmpfs_ilookup(stru inline int presto_can_ilookup(void) { - return (current->euid == izo_authorized_uid || + return (tsk_euid(current) == izo_authorized_uid || capable(CAP_DAC_READ_SEARCH)); } @@ -142,7 +142,7 @@ struct dentry *presto_iget_ilookup(struc if ( !presto_can_ilookup() ) { CERROR("ilookup denied: euid %u, authorized_uid %u\n", - current->euid, izo_authorized_uid); + tsk_euid(current), izo_authorized_uid); return ERR_PTR(-EPERM); } error = -ENOENT; @@ -900,7 +900,7 @@ int presto_ioctl(struct inode *inode, st } } - if (current->euid != 0 && current->euid != izo_authorized_uid) { + if (tsk_euid(current) != 0 && tsk_euid(current) != izo_authorized_uid) { EXIT; return -EPERM; } diff -puN fs/intermezzo/file.c~d-task-xid fs/intermezzo/file.c --- 25/fs/intermezzo/file.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/intermezzo/file.c 2003-09-27 19:29:17.000000000 -0700 @@ -213,14 +213,14 @@ static int presto_file_open(struct inode /* LOCK: XXX check that the kernel lock protects this alloc */ fdata->fd_do_lml = 0; fdata->fd_bytes_written = 0; - fdata->fd_fsuid = current->fsuid; - fdata->fd_fsgid = current->fsgid; + fdata->fd_fsuid = tsk_fsuid(current); + fdata->fd_fsgid = tsk_fsgid(current); fdata->fd_mode = file->f_dentry->d_inode->i_mode; fdata->fd_uid = file->f_dentry->d_inode->i_uid; fdata->fd_gid = file->f_dentry->d_inode->i_gid; - fdata->fd_ngroups = current->ngroups; - for (i=0 ; i < current->ngroups ; i++) - fdata->fd_groups[i] = current->groups[i]; + fdata->fd_ngroups = tsk_ngroups(current); + for (i=0 ; i < tsk_ngroups(current) ; i++) + fdata->fd_groups[i] = tsk_groups(current)[i]; if (!ISLENTO(minor)) fdata->fd_info.flags = LENTO_FL_KML; else { diff -puN fs/intermezzo/intermezzo_fs.h~d-task-xid fs/intermezzo/intermezzo_fs.h --- 25/fs/intermezzo/intermezzo_fs.h~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/intermezzo/intermezzo_fs.h 2003-09-27 19:29:17.000000000 -0700 @@ -165,13 +165,13 @@ static inline void push_ctxt(struct run_ save->fs = get_fs(); save->pwd = dget(current->fs->pwd); save->pwdmnt = mntget(current->fs->pwdmnt); - save->fsgid = current->fsgid; - save->fsuid = current->fsuid; + save->fsgid = tsk_fsgid(current); + save->fsuid = tsk_fsuid(current); save->root = current->fs->root; save->rootmnt = current->fs->rootmnt; - save->ngroups = current->ngroups; - for (i = 0; i< current->ngroups; i++) - save->groups[i] = current->groups[i]; + save->ngroups = tsk_ngroups(current); + for (i = 0; i< tsk_ngroups(current); i++) + save->groups[i] = tsk_groups(current)[i]; set_fs(new->fs); lock_kernel(); @@ -179,12 +179,12 @@ static inline void push_ctxt(struct run_ if (new->root) set_fs_root(current->fs, new->rootmnt, new->root); unlock_kernel(); - current->fsuid = new->fsuid; - current->fsgid = new->fsgid; + set_tsk_fsuid(current, new->fsuid); + set_tsk_fsgid(current, new->fsgid); if (new->ngroups > 0) { - current->ngroups = new->ngroups; + set_tsk_ngroups(current, new->ngroups); for (i = 0; i< new->ngroups; i++) - current->groups[i] = new->groups[i]; + tsk_groups(current)[i] = new->groups[i]; } } @@ -199,11 +199,11 @@ static inline void pop_ctxt(struct run_c if (saved->root) set_fs_root(current->fs, saved->rootmnt, saved->root); unlock_kernel(); - current->fsuid = saved->fsuid; - current->fsgid = saved->fsgid; - current->ngroups = saved->ngroups; + set_tsk_fsuid(current, saved->fsuid); + set_tsk_fsgid(current, saved->fsgid); + set_tsk_ngroups(current, saved->ngroups); for (i = 0; i< saved->ngroups; i++) - current->groups[i] = saved->groups[i]; + tsk_groups(current)[i] = saved->groups[i]; mntput(saved->pwdmnt); dput(saved->pwd); diff -puN fs/intermezzo/journal.c~d-task-xid fs/intermezzo/journal.c --- 25/fs/intermezzo/journal.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/intermezzo/journal.c 2003-09-27 19:29:17.000000000 -0700 @@ -317,7 +317,7 @@ journal_log_prefix_with_groups_and_ids(c p.len = cpu_to_le32(rec->size); p.version = KML_MAJOR_VERSION | KML_MINOR_VERSION; p.pid = cpu_to_le32(current->pid); - p.auid = cpu_to_le32(current->uid); + p.auid = cpu_to_le32(tsk_uid(current)); p.fsuid = cpu_to_le32(fsuid); p.fsgid = cpu_to_le32(fsgid); p.ngroups = cpu_to_le32(ngroups); @@ -337,14 +337,14 @@ journal_log_prefix(char *buf, int opcode int i; /* convert 16 bit gid's to 32 bit gid's */ - for (i=0; ingroups; i++) - groups[i] = (__u32) current->groups[i]; + for (i=0; ingroups, + (__u32)tsk_ngroups(current), groups, - (__u32)current->fsuid, - (__u32)current->fsgid); + (__u32)tsk_fsuid(current), + (__u32)tsk_fsgid(current)); } static inline char * @@ -353,8 +353,8 @@ journal_log_prefix_with_groups(char *buf { return journal_log_prefix_with_groups_and_ids(buf, opcode, rec, ngroups, groups, - (__u32)current->fsuid, - (__u32)current->fsgid); + (__u32)tsk_fsuid(current), + (__u32)tsk_fsgid(current)); } static inline char *log_dentry_version(char *buf, struct dentry *dentry) @@ -1320,7 +1320,7 @@ int presto_write_lml_close(struct rec_in pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); ino = cpu_to_le64(dentry->d_inode->i_ino); generation = cpu_to_le32(dentry->d_inode->i_generation); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + sizeof(*new_file_ver) + sizeof(ino) + sizeof(generation) + sizeof(pathlen) + sizeof(remote_ino) + sizeof(remote_generation) + @@ -1530,7 +1530,7 @@ int presto_journal_setattr(struct rec_in BUFF_ALLOC(buffer, NULL); path = presto_path(dentry, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + sizeof(*old_ver) + sizeof(valid) + sizeof(mode) + sizeof(uid) + sizeof(gid) + sizeof(fsize) + sizeof(mtime) + sizeof(ctime) + sizeof(flags) + @@ -1601,7 +1601,7 @@ int presto_get_fileid(int minor, struct BUFF_ALLOC(buffer, NULL); path = presto_path(dentry, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + sizeof(pathlen) + size_round(le32_to_cpu(pathlen)) + sizeof(struct kml_suffix); @@ -1660,7 +1660,7 @@ int presto_journal_create(struct rec_inf BUFF_ALLOC(buffer, NULL); path = presto_path(dentry, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + 3 * sizeof(*tgt_dir_ver) + sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(pathlen) + sizeof(struct kml_suffix); @@ -1716,7 +1716,7 @@ int presto_journal_symlink(struct rec_in BUFF_ALLOC(buffer, NULL); path = presto_path(dentry, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + 3 * sizeof(*tgt_dir_ver) + sizeof(uid) + sizeof(gid) + sizeof(pathlen) + sizeof(targetlen) + sizeof(struct kml_suffix); @@ -1774,7 +1774,7 @@ int presto_journal_mkdir(struct rec_info BUFF_ALLOC(buffer, NULL); path = presto_path(dentry, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + 3 * sizeof(*tgt_dir_ver) + sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(pathlen) + sizeof(struct kml_suffix); @@ -1829,7 +1829,7 @@ presto_journal_rmdir(struct rec_info *re BUFF_ALLOC(buffer, NULL); path = presto_path(dir, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + 3 * sizeof(*tgt_dir_ver) + sizeof(pathlen) + sizeof(llen) + sizeof(*rb) + sizeof(struct kml_suffix); @@ -1892,7 +1892,7 @@ presto_journal_mknod(struct rec_info *re BUFF_ALLOC(buffer, NULL); path = presto_path(dentry, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + 3 * sizeof(*tgt_dir_ver) + sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(lmajor) + sizeof(lminor) + sizeof(pathlen) + @@ -1952,7 +1952,7 @@ presto_journal_link(struct rec_info *rec BUFF_ALLOC(buffer, srcbuffer); path = presto_path(tgt, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + 3 * sizeof(*tgt_dir_ver) + sizeof(srcpathlen) + sizeof(pathlen) + sizeof(struct kml_suffix); @@ -2010,7 +2010,7 @@ int presto_journal_rename(struct rec_inf BUFF_ALLOC(buffer, srcbuffer); path = presto_path(tgt, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + 4 * sizeof(*src_dir_ver) + sizeof(srcpathlen) + sizeof(pathlen) + sizeof(struct kml_suffix); @@ -2070,7 +2070,7 @@ int presto_journal_unlink(struct rec_inf BUFF_ALLOC(buffer, NULL); path = presto_path(dir, root, buffer, PAGE_SIZE); pathlen = cpu_to_le32(MYPATHLEN(buffer, path)); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * tsk_ngroups(current) + sizeof(struct kml_prefix_hdr) + 3 * sizeof(*tgt_dir_ver) + sizeof(pathlen) + sizeof(llen) + sizeof(*rb) + sizeof(old_targetlen) + sizeof(struct kml_suffix); @@ -2149,14 +2149,14 @@ presto_journal_close(struct rec_info *re open_fsuid = fd->fd_fsuid; open_fsgid = fd->fd_fsgid; } else { - open_ngroups = current->ngroups; - for (i=0; ingroups; i++) - open_groups[i] = (__u32) current->groups[i]; + open_ngroups = tsk_ngroups(current); + for (i=0; id_inode->i_mode; open_uid = dentry->d_inode->i_uid; open_gid = dentry->d_inode->i_gid; - open_fsuid = current->fsuid; - open_fsgid = current->fsgid; + open_fsuid = tsk_fsuid(current); + open_fsgid = tsk_fsgid(current); } BUFF_ALLOC(buffer, NULL); path = presto_path(dentry, root, buffer, PAGE_SIZE); diff -puN fs/intermezzo/upcall.c~d-task-xid fs/intermezzo/upcall.c --- 25/fs/intermezzo/upcall.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/intermezzo/upcall.c 2003-09-27 19:29:17.000000000 -0700 @@ -96,7 +96,7 @@ static struct izo_upcall_hdr *upc_pack(_ hdr->u_version = IZO_UPC_VERSION; hdr->u_opc = opcode; hdr->u_pid = current->pid; - hdr->u_uid = current->fsuid; + hdr->u_uid = tsk_fsuid(current); if (path) { /*XXX Robert: please review what len to pass in for diff -puN fs/intermezzo/vfs.c~d-task-xid fs/intermezzo/vfs.c --- 25/fs/intermezzo/vfs.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/intermezzo/vfs.c 2003-09-27 19:29:17.000000000 -0700 @@ -121,9 +121,9 @@ static inline int check_sticky(struct in { if (!(dir->i_mode & S_ISVTX)) return 0; - if (inode->i_uid == current->fsuid) + if (inode->i_uid == tsk_fsuid(current)) return 0; - if (dir->i_uid == current->fsuid) + if (dir->i_uid == tsk_fsuid(current)) return 0; return !capable(CAP_FOWNER); } diff -puN fs/jfs/acl.c~d-task-xid fs/jfs/acl.c --- 25/fs/jfs/acl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/jfs/acl.c 2003-09-27 19:29:17.000000000 -0700 @@ -147,7 +147,7 @@ int jfs_permission(struct inode * inode, return -EACCES; } - if (current->fsuid == inode->i_uid) { + if (tsk_fsuid(current) == inode->i_uid) { mode >>= 6; goto check_mode; } diff -puN fs/jfs/jfs_inode.c~d-task-xid fs/jfs/jfs_inode.c --- 25/fs/jfs/jfs_inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/jfs/jfs_inode.c 2003-09-27 19:29:17.000000000 -0700 @@ -52,13 +52,13 @@ struct inode *ialloc(struct inode *paren return NULL; } - inode->i_uid = current->fsuid; + inode->i_uid = tsk_fsuid(current); if (parent->i_mode & S_ISGID) { inode->i_gid = parent->i_gid; if (S_ISDIR(mode)) mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = tsk_fsgid(current); inode->i_mode = mode; if (S_ISDIR(mode)) diff -puN fs/jfs/xattr.c~d-task-xid fs/jfs/xattr.c --- 25/fs/jfs/xattr.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/jfs/xattr.c 2003-09-27 19:29:17.000000000 -0700 @@ -653,7 +653,7 @@ static int can_set_system_xattr(struct i struct posix_acl *acl; int rc; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if ((tsk_fsuid(current) != inode->i_uid) && !capable(CAP_FOWNER)) return -EPERM; /* diff -puN fs/locks.c~d-task-xid fs/locks.c --- 25/fs/locks.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/locks.c 2003-09-27 19:29:17.000000000 -0700 @@ -1194,7 +1194,7 @@ int fcntl_setlease(unsigned int fd, stru dentry = filp->f_dentry; inode = dentry->d_inode; - if ((current->fsuid != inode->i_uid) && !capable(CAP_LEASE)) + if ((tsk_fsuid(current) != inode->i_uid) && !capable(CAP_LEASE)) return -EACCES; if (!S_ISREG(inode->i_mode)) return -EINVAL; diff -puN fs/minix/bitmap.c~d-task-xid fs/minix/bitmap.c --- 25/fs/minix/bitmap.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/minix/bitmap.c 2003-09-27 19:29:17.000000000 -0700 @@ -247,8 +247,8 @@ struct inode * minix_new_inode(const str iput(inode); return NULL; } - inode->i_uid = current->fsuid; - inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : tsk_fsgid(current); inode->i_ino = j; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_blocks = inode->i_blksize = 0; diff -puN fs/namei.c~d-task-xid fs/namei.c --- 25/fs/namei.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/namei.c 2003-09-27 19:29:17.000000000 -0700 @@ -174,7 +174,7 @@ int vfs_permission(struct inode * inode, return -EACCES; } - if (current->fsuid == inode->i_uid) + if (tsk_fsuid(current) == inode->i_uid) mode >>= 6; else if (in_group_p(inode->i_gid)) mode >>= 3; @@ -309,7 +309,7 @@ static inline int exec_permission_lite(s if ((inode->i_op && inode->i_op->permission)) return -EAGAIN; - if (current->fsuid == inode->i_uid) + if (tsk_fsuid(current) == inode->i_uid) mode >>= 6; else if (in_group_p(inode->i_gid)) mode >>= 3; @@ -982,9 +982,9 @@ static inline int check_sticky(struct in { if (!(dir->i_mode & S_ISVTX)) return 0; - if (inode->i_uid == current->fsuid) + if (inode->i_uid == tsk_fsuid(current)) return 0; - if (dir->i_uid == current->fsuid) + if (dir->i_uid == tsk_fsuid(current)) return 0; return !capable(CAP_FOWNER); } diff -puN fs/ncpfs/ioctl.c~d-task-xid fs/ncpfs/ioctl.c --- 25/fs/ncpfs/ioctl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ncpfs/ioctl.c 2003-09-27 19:29:17.000000000 -0700 @@ -41,7 +41,7 @@ int ncp_ioctl(struct inode *inode, struc case NCP_IOC_NCPREQUEST: if ((permission(inode, MAY_WRITE, NULL) != 0) - && (current->uid != server->m.mounted_uid)) { + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } if (copy_from_user(&request, (struct ncp_ioctl_request *) arg, @@ -100,7 +100,7 @@ int ncp_ioctl(struct inode *inode, struc struct ncp_fs_info info; if ((permission(inode, MAY_WRITE, NULL) != 0) - && (current->uid != server->m.mounted_uid)) { + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } if (copy_from_user(&info, (struct ncp_fs_info *) arg, @@ -128,7 +128,7 @@ int ncp_ioctl(struct inode *inode, struc struct ncp_fs_info_v2 info2; if ((permission(inode, MAY_WRITE, NULL) != 0) - && (current->uid != server->m.mounted_uid)) { + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } if (copy_from_user(&info2, (struct ncp_fs_info_v2 *) arg, @@ -156,7 +156,7 @@ int ncp_ioctl(struct inode *inode, struc unsigned long tmp = server->m.mounted_uid; if ( (permission(inode, MAY_READ, NULL) != 0) - && (current->uid != server->m.mounted_uid)) + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -170,7 +170,7 @@ int ncp_ioctl(struct inode *inode, struc struct ncp_setroot_ioctl sr; if ( (permission(inode, MAY_READ, NULL) != 0) - && (current->uid != server->m.mounted_uid)) + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -250,7 +250,7 @@ int ncp_ioctl(struct inode *inode, struc #ifdef CONFIG_NCPFS_PACKET_SIGNING case NCP_IOC_SIGN_INIT: if ((permission(inode, MAY_WRITE, NULL) != 0) - && (current->uid != server->m.mounted_uid)) + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -273,7 +273,7 @@ int ncp_ioctl(struct inode *inode, struc case NCP_IOC_SIGN_WANTED: if ( (permission(inode, MAY_READ, NULL) != 0) - && (current->uid != server->m.mounted_uid)) + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -286,7 +286,7 @@ int ncp_ioctl(struct inode *inode, struc int newstate; if ( (permission(inode, MAY_WRITE, NULL) != 0) - && (current->uid != server->m.mounted_uid)) + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -307,7 +307,7 @@ int ncp_ioctl(struct inode *inode, struc #ifdef CONFIG_NCPFS_IOCTL_LOCKING case NCP_IOC_LOCKUNLOCK: if ( (permission(inode, MAY_WRITE, NULL) != 0) - && (current->uid != server->m.mounted_uid)) + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -379,7 +379,7 @@ outrel: #endif /* CONFIG_NCPFS_IOCTL_LOCKING */ case NCP_IOC_GETOBJECTNAME: - if (current->uid != server->m.mounted_uid) { + if (tsk_uid(current) != server->m.mounted_uid) { return -EACCES; } { @@ -405,7 +405,7 @@ outrel: return 0; } case NCP_IOC_SETOBJECTNAME: - if (current->uid != server->m.mounted_uid) { + if (tsk_uid(current) != server->m.mounted_uid) { return -EACCES; } { @@ -449,7 +449,7 @@ outrel: return 0; } case NCP_IOC_GETPRIVATEDATA: - if (current->uid != server->m.mounted_uid) { + if (tsk_uid(current) != server->m.mounted_uid) { return -EACCES; } { @@ -473,7 +473,7 @@ outrel: return 0; } case NCP_IOC_SETPRIVATEDATA: - if (current->uid != server->m.mounted_uid) { + if (tsk_uid(current) != server->m.mounted_uid) { return -EACCES; } { @@ -609,7 +609,7 @@ outrel: #endif /* CONFIG_NCPFS_NLS */ case NCP_IOC_SETDENTRYTTL: if ((permission(inode, MAY_WRITE, NULL) != 0) && - (current->uid != server->m.mounted_uid)) + (tsk_uid(current) != server->m.mounted_uid)) return -EACCES; { u_int32_t user; @@ -638,7 +638,7 @@ outrel: so we have this out of switch */ if (cmd == NCP_IOC_GETMOUNTUID) { if ((permission(inode, MAY_READ, NULL) != 0) - && (current->uid != server->m.mounted_uid)) { + && (tsk_uid(current) != server->m.mounted_uid)) { return -EACCES; } if (put_user(NEW_TO_OLD_UID(server->m.mounted_uid), (__kernel_uid_t *) arg)) diff -puN fs/nfsd/auth.c~d-task-xid fs/nfsd/auth.c --- 25/fs/nfsd/auth.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/nfsd/auth.c 2003-09-27 19:29:17.000000000 -0700 @@ -32,20 +32,20 @@ nfsd_setuser(struct svc_rqst *rqstp, str } if (cred->cr_uid != (uid_t) -1) - current->fsuid = cred->cr_uid; + set_tsk_fsuid(current, cred->cr_uid); else - current->fsuid = exp->ex_anon_uid; + set_tsk_fsuid(current, exp->ex_anon_uid); if (cred->cr_gid != (gid_t) -1) - current->fsgid = cred->cr_gid; + set_tsk_fsgid(current, cred->cr_gid); else - current->fsgid = exp->ex_anon_gid; + set_tsk_fsgid(current, exp->ex_anon_gid); for (i = 0; i < NGROUPS; i++) { gid_t group = cred->cr_groups[i]; if (group == (gid_t) NOGROUP) break; - current->groups[i] = group; + tsk_groups(current)[i] = group; } - current->ngroups = i; + set_tsk_ngroups(current, i); if ((cred->cr_uid)) { cap_t(current->cap_effective) &= ~CAP_NFSD_MASK; diff -puN fs/nfsd/vfs.c~d-task-xid fs/nfsd/vfs.c --- 25/fs/nfsd/vfs.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/nfsd/vfs.c 2003-09-27 19:29:17.000000000 -0700 @@ -1581,7 +1581,7 @@ nfsd_permission(struct svc_export *exp, * with NFSv3. */ if ((acc & MAY_OWNER_OVERRIDE) && - inode->i_uid == current->fsuid) + inode->i_uid == tsk_fsuid(current)) return 0; err = permission(inode, acc & (MAY_READ|MAY_WRITE|MAY_EXEC), NULL); diff -puN fs/open.c~d-task-xid fs/open.c --- 25/fs/open.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/open.c 2003-09-27 19:29:18.000000000 -0700 @@ -372,7 +372,7 @@ asmlinkage long sys_utime(char __user * if (IS_IMMUTABLE(inode)) goto dput_and_out; - if (current->fsuid != inode->i_uid && + if (tsk_fsuid(current) != inode->i_uid && (error = permission(inode,MAY_WRITE,&nd)) != 0) goto dput_and_out; } @@ -425,7 +425,7 @@ long do_utimes(char __user * filename, s if (IS_IMMUTABLE(inode)) goto dput_and_out; - if (current->fsuid != inode->i_uid && + if (tsk_fsuid(current) != inode->i_uid && (error = permission(inode,MAY_WRITE,&nd)) != 0) goto dput_and_out; } @@ -463,12 +463,13 @@ asmlinkage long sys_access(const char __ if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */ return -EINVAL; - old_fsuid = current->fsuid; - old_fsgid = current->fsgid; + old_fsuid = tsk_fsuid(current); + old_fsgid = tsk_fsgid(current); old_cap = current->cap_effective; - current->fsuid = current->uid; - current->fsgid = current->gid; + /* FIXME: this is broken if the IDs are shared between threads. */ + set_tsk_fsuid(current, tsk_uid(current)); + set_tsk_fsgid(current, tsk_gid(current)); /* * Clear the capabilities if we switch to a non-root user @@ -478,7 +479,7 @@ asmlinkage long sys_access(const char __ * value below. We should hold task_capabilities_lock, * but we cannot because user_path_walk can sleep. */ - if (current->uid) + if (tsk_uid(current)) cap_clear(current->cap_effective); else current->cap_effective = current->cap_permitted; @@ -493,8 +494,8 @@ asmlinkage long sys_access(const char __ path_release(&nd); } - current->fsuid = old_fsuid; - current->fsgid = old_fsgid; + set_tsk_fsuid(current, old_fsuid); + set_tsk_fsgid(current, old_fsgid); current->cap_effective = old_cap; return res; diff -puN fs/pipe.c~d-task-xid fs/pipe.c --- 25/fs/pipe.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/pipe.c 2003-09-27 19:29:18.000000000 -0700 @@ -523,8 +523,8 @@ static struct inode * get_pipe_inode(voi */ inode->i_state = I_DIRTY; inode->i_mode = S_IFIFO | S_IRUSR | S_IWUSR; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = tsk_fsgid(current); inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; inode->i_blksize = PAGE_SIZE; return inode; diff -puN fs/posix_acl.c~d-task-xid fs/posix_acl.c --- 25/fs/posix_acl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/posix_acl.c 2003-09-27 19:29:18.000000000 -0700 @@ -220,11 +220,11 @@ posix_acl_permission(struct inode *inode switch(pa->e_tag) { case ACL_USER_OBJ: /* (May have been checked already) */ - if (inode->i_uid == current->fsuid) + if (inode->i_uid == tsk_fsuid(current)) goto check_perm; break; case ACL_USER: - if (pa->e_id == current->fsuid) + if (pa->e_id == tsk_fsuid(current)) goto mask; break; case ACL_GROUP_OBJ: diff -puN fs/proc/array.c~d-task-xid fs/proc/array.c --- 25/fs/proc/array.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/proc/array.c 2003-09-27 19:29:18.000000000 -0700 @@ -166,8 +166,8 @@ static inline char * task_state(struct t p->tgid, p->pid, p->pid ? p->real_parent->pid : 0, p->pid && p->ptrace ? p->parent->pid : 0, - p->uid, p->euid, p->suid, p->fsuid, - p->gid, p->egid, p->sgid, p->fsgid); + tsk_uid(p), tsk_euid(p), tsk_suid(p), tsk_fsuid(p), + tsk_gid(p), tsk_egid(p), tsk_sgid(p), tsk_fsgid(p)); read_unlock(&tasklist_lock); task_lock(p); buffer += sprintf(buffer, @@ -176,8 +176,8 @@ static inline char * task_state(struct t p->files ? p->files->max_fds : 0); task_unlock(p); - for (g = 0; g < p->ngroups; g++) - buffer += sprintf(buffer, "%d ", p->groups[g]); + for (g = 0; g < tsk_ngroups(p); g++) + buffer += sprintf(buffer, "%d ", tsk_groups(p)[g]); buffer += sprintf(buffer, "\n"); return buffer; diff -puN fs/proc/base.c~d-task-xid fs/proc/base.c --- 25/fs/proc/base.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/proc/base.c 2003-09-27 19:29:18.000000000 -0700 @@ -648,7 +648,7 @@ static int proc_pid_follow_link(struct d /* We don't need a base pointer in the /proc filesystem */ path_release(nd); - if (current->fsuid != inode->i_uid && !capable(CAP_DAC_OVERRIDE)) + if (tsk_fsuid(current) != inode->i_uid && !capable(CAP_DAC_OVERRIDE)) goto out; error = proc_check_root(inode); if (error) @@ -695,7 +695,7 @@ static int proc_pid_readlink(struct dent lock_kernel(); - if (current->fsuid != inode->i_uid && !capable(CAP_DAC_OVERRIDE)) + if (tsk_fsuid(current) != inode->i_uid && !capable(CAP_DAC_OVERRIDE)) goto out; error = proc_check_root(inode); if (error) @@ -906,8 +906,8 @@ static struct inode *proc_pid_make_inode inode->i_uid = 0; inode->i_gid = 0; if (ino == PROC_TGID_INO || ino == PROC_TID_INO || task_dumpable(task)) { - inode->i_uid = task->euid; - inode->i_gid = task->egid; + inode->i_uid = tsk_euid(task); + inode->i_gid = tsk_egid(task); } security_task_to_inode(task, inode); @@ -936,8 +936,8 @@ static int pid_revalidate(struct dentry struct task_struct *task = proc_task(inode); if (pid_alive(task)) { if (proc_type(inode) == PROC_TGID_INO || proc_type(inode) == PROC_TID_INO || task_dumpable(task)) { - inode->i_uid = task->euid; - inode->i_gid = task->egid; + inode->i_uid = tsk_euid(task); + inode->i_gid = tsk_egid(task); } else { inode->i_uid = 0; inode->i_gid = 0; @@ -967,8 +967,8 @@ static int tid_fd_revalidate(struct dent spin_unlock(&files->file_lock); put_files_struct(files); if (task_dumpable(task)) { - inode->i_uid = task->euid; - inode->i_gid = task->egid; + inode->i_uid = tsk_euid(task); + inode->i_gid = tsk_egid(task); } else { inode->i_uid = 0; inode->i_gid = 0; diff -puN fs/proc/inode.c~d-task-xid fs/proc/inode.c --- 25/fs/proc/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/proc/inode.c 2003-09-27 19:29:18.000000000 -0700 @@ -139,8 +139,8 @@ static int parse_options(char *options,u { char *this_char,*value; - *uid = current->uid; - *gid = current->gid; + *uid = tsk_uid(current); + *gid = tsk_gid(current); if (!options) return 1; while ((this_char = strsep(&options,",")) != NULL) { diff -puN fs/quota.c~d-task-xid fs/quota.c --- 25/fs/quota.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/quota.c 2003-09-27 19:29:18.000000000 -0700 @@ -92,7 +92,7 @@ static int check_quotactl_valid(struct s } /* Check privileges */ if (cmd == Q_GETQUOTA || cmd == Q_XGETQUOTA) { - if (((type == USRQUOTA && current->euid != id) || + if (((type == USRQUOTA && tsk_euid(current) != id) || (type == GRPQUOTA && !in_egroup_p(id))) && !capable(CAP_SYS_ADMIN)) return -EPERM; diff -puN fs/ramfs/inode.c~d-task-xid fs/ramfs/inode.c --- 25/fs/ramfs/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ramfs/inode.c 2003-09-27 19:29:18.000000000 -0700 @@ -54,8 +54,8 @@ static struct inode *ramfs_get_inode(str if (inode) { inode->i_mode = mode; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = tsk_fsgid(current); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mapping->a_ops = &ramfs_aops; diff -puN fs/reiserfs/ioctl.c~d-task-xid fs/reiserfs/ioctl.c --- 25/fs/reiserfs/ioctl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/reiserfs/ioctl.c 2003-09-27 19:29:18.000000000 -0700 @@ -41,7 +41,7 @@ int reiserfs_ioctl (struct inode * inode if (IS_RDONLY(inode)) return -EROFS; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if ((tsk_fsuid(current) != inode->i_uid) && !capable(CAP_FOWNER)) return -EPERM; if (get_user(flags, (int *) arg)) @@ -68,7 +68,7 @@ int reiserfs_ioctl (struct inode * inode case REISERFS_IOC_GETVERSION: return put_user(inode->i_generation, (int *) arg); case REISERFS_IOC_SETVERSION: - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if ((tsk_fsuid(current) != inode->i_uid) && !capable(CAP_FOWNER)) return -EPERM; if (IS_RDONLY(inode)) return -EROFS; diff -puN fs/reiserfs/namei.c~d-task-xid fs/reiserfs/namei.c --- 25/fs/reiserfs/namei.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/reiserfs/namei.c 2003-09-27 19:29:18.000000000 -0700 @@ -545,7 +545,7 @@ static int new_inode_init(struct inode * /* the quota init calls have to know who to charge the quota to, so ** we have to set uid and gid here */ - inode->i_uid = current->fsuid; + inode->i_uid = tsk_fsuid(current); inode->i_mode = mode; if (dir->i_mode & S_ISGID) { @@ -553,7 +553,7 @@ static int new_inode_init(struct inode * if (S_ISDIR(mode)) inode->i_mode |= S_ISGID; } else { - inode->i_gid = current->fsgid; + inode->i_gid = tsk_fsgid(current); } return 0 ; } diff -puN fs/smbfs/dir.c~d-task-xid fs/smbfs/dir.c --- 25/fs/smbfs/dir.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/smbfs/dir.c 2003-09-27 19:29:18.000000000 -0700 @@ -658,8 +658,8 @@ smb_make_node(struct inode *dir, struct attr.ia_valid = ATTR_MODE | ATTR_UID | ATTR_GID; attr.ia_mode = mode; - attr.ia_uid = current->euid; - attr.ia_gid = current->egid; + attr.ia_uid = tsk_euid(current); + attr.ia_gid = tsk_egid(current); if (!new_valid_dev(dev)) return -EINVAL; diff -puN fs/smbfs/inode.c~d-task-xid fs/smbfs/inode.c --- 25/fs/smbfs/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/smbfs/inode.c 2003-09-27 19:29:18.000000000 -0700 @@ -562,7 +562,7 @@ int smb_fill_super(struct super_block *s if (parse_options(mnt, raw_data)) goto out_bad_option; } - mnt->mounted_uid = current->uid; + mnt->mounted_uid = tsk_uid(current); smb_setcodepage(server, &mnt->codepage); /* diff -puN fs/smbfs/proc.c~d-task-xid fs/smbfs/proc.c --- 25/fs/smbfs/proc.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/smbfs/proc.c 2003-09-27 19:29:18.000000000 -0700 @@ -863,7 +863,7 @@ smb_newconn(struct smb_sb_info *server, goto out; error = -EACCES; - if (current->uid != server->mnt->mounted_uid && + if (tsk_uid(current) != server->mnt->mounted_uid && !capable(CAP_SYS_ADMIN)) goto out; diff -puN fs/sysfs/inode.c~d-task-xid fs/sysfs/inode.c --- 25/fs/sysfs/inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/sysfs/inode.c 2003-09-27 19:29:18.000000000 -0700 @@ -29,8 +29,8 @@ struct inode * sysfs_new_inode(mode_t mo struct inode * inode = new_inode(sysfs_sb); if (inode) { inode->i_mode = mode; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = tsk_fsgid(current); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; diff -puN fs/sysv/ialloc.c~d-task-xid fs/sysv/ialloc.c --- 25/fs/sysv/ialloc.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/sysv/ialloc.c 2003-09-27 19:29:18.000000000 -0700 @@ -165,9 +165,9 @@ struct inode * sysv_new_inode(const stru if (S_ISDIR(mode)) mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = tsk_fsgid(current); - inode->i_uid = current->fsuid; + inode->i_uid = tsk_fsuid(current); inode->i_ino = fs16_to_cpu(sbi, ino); inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_blocks = inode->i_blksize = 0; diff -puN fs/udf/ialloc.c~d-task-xid fs/udf/ialloc.c --- 25/fs/udf/ialloc.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/udf/ialloc.c 2003-09-27 19:29:18.000000000 -0700 @@ -119,7 +119,7 @@ struct inode * udf_new_inode (struct ino mark_buffer_dirty(UDF_SB_LVIDBH(sb)); } inode->i_mode = mode; - inode->i_uid = current->fsuid; + inode->i_uid = tsk_fsuid(current); if (dir->i_mode & S_ISGID) { inode->i_gid = dir->i_gid; @@ -127,7 +127,7 @@ struct inode * udf_new_inode (struct ino mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = tsk_fsgid(current); UDF_I_LOCATION(inode).logicalBlockNum = block; UDF_I_LOCATION(inode).partitionReferenceNum = UDF_I_LOCATION(dir).partitionReferenceNum; diff -puN fs/udf/namei.c~d-task-xid fs/udf/namei.c --- 25/fs/udf/namei.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/udf/namei.c 2003-09-27 19:29:18.000000000 -0700 @@ -686,7 +686,7 @@ static int udf_mknod(struct inode * dir, if (!inode) goto out; - inode->i_uid = current->fsuid; + inode->i_uid = tsk_fsuid(current); init_special_inode(inode, mode, rdev); if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) { diff -puN fs/ufs/ialloc.c~d-task-xid fs/ufs/ialloc.c --- 25/fs/ufs/ialloc.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/ufs/ialloc.c 2003-09-27 19:29:18.000000000 -0700 @@ -256,13 +256,13 @@ cg_found: sb->s_dirt = 1; inode->i_mode = mode; - inode->i_uid = current->fsuid; + inode->i_uid = tsk_fsuid(current); if (dir->i_mode & S_ISGID) { inode->i_gid = dir->i_gid; if (S_ISDIR(mode)) inode->i_mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = tsk_fsgid(current); inode->i_ino = cg * uspi->s_ipg + bit; inode->i_blksize = PAGE_SIZE; /* This is the optimal IO size (for stat), not the fs block size */ diff -puN fs/xfs/linux/xfs_iops.c~d-task-xid fs/xfs/linux/xfs_iops.c --- 25/fs/xfs/linux/xfs_iops.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/xfs/linux/xfs_iops.c 2003-09-27 19:29:18.000000000 -0700 @@ -603,7 +603,7 @@ capable_user_xattr( !capable(CAP_SYS_ADMIN)) return 0; if (S_ISDIR(inode->i_mode) && (inode->i_mode & S_ISVTX) && - (current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + (tsk_fsuid(current) != inode->i_uid) && !capable(CAP_FOWNER)) return 0; return 1; } diff -puN fs/xfs/xfs_acl.c~d-task-xid fs/xfs/xfs_acl.c --- 25/fs/xfs/xfs_acl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/xfs/xfs_acl.c 2003-09-27 19:29:18.000000000 -0700 @@ -400,7 +400,7 @@ xfs_acl_allow_set( VOP_GETATTR(vp, &va, 0, NULL, error); if (error) return error; - if (va.va_uid != current->fsuid && !capable(CAP_FOWNER)) + if (va.va_uid != tsk_fsuid(current) && !capable(CAP_FOWNER)) return EPERM; return error; } @@ -510,13 +510,13 @@ xfs_acl_access( switch (fap->acl_entry[i].ae_tag) { case ACL_USER_OBJ: seen_userobj = 1; - if (fuid != current->fsuid) + if (fuid != tsk_fsuid(current)) continue; matched.ae_tag = ACL_USER_OBJ; matched.ae_perm = allows; break; case ACL_USER: - if (fap->acl_entry[i].ae_id != current->fsuid) + if (fap->acl_entry[i].ae_id != tsk_fsuid(current)) continue; matched.ae_tag = ACL_USER; matched.ae_perm = allows; diff -puN fs/xfs/xfs_dfrag.c~d-task-xid fs/xfs/xfs_dfrag.c --- 25/fs/xfs/xfs_dfrag.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/xfs/xfs_dfrag.c 2003-09-27 19:29:18.000000000 -0700 @@ -153,12 +153,12 @@ xfs_swapext( if ((error = _MAC_XFS_IACCESS(tip, MACWRITE, NULL))) { goto error0; } - if ((current->fsuid != ip->i_d.di_uid) && + if ((tsk_fsuid(current) != ip->i_d.di_uid) && (error = xfs_iaccess(ip, IWRITE, NULL)) && !capable_cred(NULL, CAP_FOWNER)) { goto error0; } - if ((current->fsuid != tip->i_d.di_uid) && + if ((tsk_fsuid(current) != tip->i_d.di_uid) && (error = xfs_iaccess(tip, IWRITE, NULL)) && !capable_cred(NULL, CAP_FOWNER)) { goto error0; diff -puN fs/xfs/xfs_inode.c~d-task-xid fs/xfs/xfs_inode.c --- 25/fs/xfs/xfs_inode.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/xfs/xfs_inode.c 2003-09-27 19:29:18.000000000 -0700 @@ -1142,8 +1142,8 @@ xfs_ialloc( ip->i_d.di_onlink = 0; ip->i_d.di_nlink = nlink; ASSERT(ip->i_d.di_nlink == nlink); - ip->i_d.di_uid = current->fsuid; - ip->i_d.di_gid = current->fsgid; + ip->i_d.di_uid = tsk_fsuid(current); + ip->i_d.di_gid = tsk_fsgid(current); ip->i_d.di_projid = prid; memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); @@ -3524,7 +3524,7 @@ xfs_iaccess( if ((error = _ACL_XFS_IACCESS(ip, mode, cr)) != -1) return error ? XFS_ERROR(error) : 0; - if (current->fsuid != ip->i_d.di_uid) { + if (tsk_fsuid(current) != ip->i_d.di_uid) { mode >>= 3; if (!in_group_p((gid_t)ip->i_d.di_gid)) mode >>= 3; diff -puN fs/xfs/xfs_vnodeops.c~d-task-xid fs/xfs/xfs_vnodeops.c --- 25/fs/xfs/xfs_vnodeops.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/fs/xfs/xfs_vnodeops.c 2003-09-27 19:29:18.000000000 -0700 @@ -433,7 +433,7 @@ xfs_setattr( } /* boolean: are we the file owner? */ - file_owner = (current->fsuid == ip->i_d.di_uid); + file_owner = (tsk_fsuid(current) == ip->i_d.di_uid); /* * Change various properties of a file. @@ -2003,7 +2003,8 @@ xfs_create( /* * Make sure that we have allocated dquot(s) on disk. */ - error = XFS_QM_DQVOPALLOC(mp, dp, current->fsuid, current->fsgid, + error = XFS_QM_DQVOPALLOC(mp, dp, tsk_fsuid(current), + tsk_fsgid(current), XFS_QMOPT_QUOTALL|XFS_QMOPT_INHERIT, &udqp, &gdqp); if (error) goto std_return; @@ -2898,7 +2899,8 @@ xfs_mkdir( /* * Make sure that we have allocated dquot(s) on disk. */ - error = XFS_QM_DQVOPALLOC(mp, dp, current->fsuid, current->fsgid, + error = XFS_QM_DQVOPALLOC(mp, dp, tsk_fsuid(current), + tsk_fsgid(current), XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp); if (error) goto std_return; @@ -3455,7 +3457,8 @@ xfs_symlink( /* * Make sure that we have allocated dquot(s) on disk. */ - error = XFS_QM_DQVOPALLOC(mp, dp, current->fsuid, current->fsgid, + error = XFS_QM_DQVOPALLOC(mp, dp, tsk_fsuid(current), + tsk_fsgid(current), XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp); if (error) goto std_return; diff -puN include/linux/sched.h~d-task-xid include/linux/sched.h --- 25/include/linux/sched.h~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/include/linux/sched.h 2003-09-27 19:29:18.000000000 -0700 @@ -400,10 +400,10 @@ struct task_struct { /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */ unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap; /* process credentials */ - uid_t uid,euid,suid,fsuid; - gid_t gid,egid,sgid,fsgid; - int ngroups; - gid_t groups[NGROUPS]; + uid_t __uid,__euid,__suid,__fsuid; + gid_t __gid,__egid,__sgid,__fsgid; + int __ngroups; + gid_t __groups[NGROUPS]; kernel_cap_t cap_effective, cap_inheritable, cap_permitted; int keep_capabilities:1; struct user_struct *user; @@ -470,6 +470,101 @@ static inline pid_t process_group(struct return tsk->group_leader->__pgrp; } +static inline uid_t tsk_uid(struct task_struct *tsk) +{ + return tsk->__uid; +} + +static inline uid_t tsk_euid(struct task_struct *tsk) +{ + return tsk->__euid; +} + +static inline uid_t tsk_suid(struct task_struct *tsk) +{ + return tsk->__suid; +} + +static inline uid_t tsk_fsuid(struct task_struct *tsk) +{ + return tsk->__fsuid; +} + +static inline gid_t tsk_gid(struct task_struct *tsk) +{ + return tsk->__gid; +} + +static inline gid_t tsk_egid(struct task_struct *tsk) +{ + return tsk->__egid; +} + +static inline gid_t tsk_sgid(struct task_struct *tsk) +{ + return tsk->__sgid; +} + +static inline gid_t tsk_fsgid(struct task_struct *tsk) +{ + return tsk->__fsgid; +} + +static inline int tsk_ngroups(struct task_struct *tsk) +{ + return tsk->__ngroups; +} + +static inline gid_t *tsk_groups(struct task_struct *tsk) +{ + return tsk->__groups; +} + +static inline void set_tsk_uid(struct task_struct *tsk, uid_t uid) +{ + tsk->__uid = uid; +} + +static inline void set_tsk_euid(struct task_struct *tsk, uid_t uid) +{ + tsk->__euid = uid; +} + +static inline void set_tsk_suid(struct task_struct *tsk, uid_t uid) +{ + tsk->__suid = uid; +} + +static inline void set_tsk_fsuid(struct task_struct *tsk, uid_t uid) +{ + tsk->__fsuid = uid; +} + +static inline void set_tsk_gid(struct task_struct *tsk, gid_t gid) +{ + tsk->__gid = gid; +} + +static inline void set_tsk_egid(struct task_struct *tsk, gid_t gid) +{ + tsk->__egid = gid; +} + +static inline void set_tsk_sgid(struct task_struct *tsk, gid_t gid) +{ + tsk->__sgid = gid; +} + +static inline void set_tsk_fsgid(struct task_struct *tsk, gid_t gid) +{ + tsk->__fsgid = gid; +} + +static inline void set_tsk_ngroups(struct task_struct *tsk, int ngroups) +{ + tsk->__ngroups = ngroups; +} + extern void __put_task_struct(struct task_struct *tsk); #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) #define put_task_struct(tsk) \ diff -puN include/net/scm.h~d-task-xid include/net/scm.h --- 25/include/net/scm.h~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/include/net/scm.h 2003-09-27 19:29:18.000000000 -0700 @@ -37,8 +37,8 @@ static __inline__ int scm_send(struct so struct scm_cookie *scm) { memset(scm, 0, sizeof(*scm)); - scm->creds.uid = current->uid; - scm->creds.gid = current->gid; + scm->creds.uid = tsk_uid(current); + scm->creds.gid = tsk_gid(current); scm->creds.pid = current->pid; if (msg->msg_controllen <= 0) return 0; diff -puN ipc/msg.c~d-task-xid ipc/msg.c --- 25/ipc/msg.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/ipc/msg.c 2003-09-27 19:29:18.000000000 -0700 @@ -545,8 +545,8 @@ asmlinkage long sys_msgctl (int msqid, i goto out_unlock_up; ipcp = &msq->q_perm; err = -EPERM; - if (current->euid != ipcp->cuid && - current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) + if (tsk_euid(current) != ipcp->cuid && + tsk_euid(current) != ipcp->uid && !capable(CAP_SYS_ADMIN)) /* We _could_ check for CAP_CHOWN above, but we don't */ goto out_unlock_up; diff -puN ipc/sem.c~d-task-xid ipc/sem.c --- 25/ipc/sem.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/ipc/sem.c 2003-09-27 19:29:18.000000000 -0700 @@ -741,8 +741,8 @@ static int semctl_down(int semid, int se } ipcp = &sma->sem_perm; - if (current->euid != ipcp->cuid && - current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) { + if (tsk_euid(current) != ipcp->cuid && + tsk_euid(current) != ipcp->uid && !capable(CAP_SYS_ADMIN)) { err=-EPERM; goto out_unlock; } diff -puN ipc/shm.c~d-task-xid ipc/shm.c --- 25/ipc/shm.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/ipc/shm.c 2003-09-27 19:29:18.000000000 -0700 @@ -556,8 +556,8 @@ asmlinkage long sys_shmctl (int shmid, i if(err) goto out_unlock_up; - if (current->euid != shp->shm_perm.uid && - current->euid != shp->shm_perm.cuid && + if (tsk_euid(current) != shp->shm_perm.uid && + tsk_euid(current) != shp->shm_perm.cuid && !capable(CAP_SYS_ADMIN)) { err=-EPERM; goto out_unlock_up; @@ -593,8 +593,8 @@ asmlinkage long sys_shmctl (int shmid, i if(err) goto out_unlock_up; err=-EPERM; - if (current->euid != shp->shm_perm.uid && - current->euid != shp->shm_perm.cuid && + if (tsk_euid(current) != shp->shm_perm.uid && + tsk_euid(current) != shp->shm_perm.cuid && !capable(CAP_SYS_ADMIN)) { goto out_unlock_up; } diff -puN ipc/util.c~d-task-xid ipc/util.c --- 25/ipc/util.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/ipc/util.c 2003-09-27 19:29:18.000000000 -0700 @@ -185,8 +185,8 @@ found: if (id > ids->max_id) ids->max_id = id; - new->cuid = new->uid = current->euid; - new->gid = new->cgid = current->egid; + new->cuid = new->uid = tsk_euid(current); + new->gid = new->cgid = tsk_egid(current); new->seq = ids->seq++; if(ids->seq > ids->seq_max) @@ -371,7 +371,7 @@ int ipcperms (struct kern_ipc_perm *ipcp requested_mode = (flag >> 6) | (flag >> 3) | flag; granted_mode = ipcp->mode; - if (current->euid == ipcp->cuid || current->euid == ipcp->uid) + if (tsk_euid(current) == ipcp->cuid || tsk_euid(current) == ipcp->uid) granted_mode >>= 6; else if (in_group_p(ipcp->cgid) || in_group_p(ipcp->gid)) granted_mode >>= 3; diff -puN kernel/ptrace.c~d-task-xid kernel/ptrace.c --- 25/kernel/ptrace.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/kernel/ptrace.c 2003-09-27 19:29:18.000000000 -0700 @@ -88,12 +88,12 @@ int ptrace_attach(struct task_struct *ta goto bad; if (!task->mm) goto bad; - if(((current->uid != task->euid) || - (current->uid != task->suid) || - (current->uid != task->uid) || - (current->gid != task->egid) || - (current->gid != task->sgid) || - (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE)) + if(((tsk_uid(current) != tsk_euid(task)) || + (tsk_uid(current) != tsk_suid(task)) || + (tsk_uid(current) != tsk_uid(task)) || + (tsk_gid(current) != tsk_egid(task)) || + (tsk_gid(current) != tsk_sgid(task)) || + (tsk_gid(current) != tsk_gid(task))) && !capable(CAP_SYS_PTRACE)) goto bad; rmb(); if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE)) diff -puN kernel/sched.c~d-task-xid kernel/sched.c --- 25/kernel/sched.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/kernel/sched.c 2003-09-27 19:29:18.000000000 -0700 @@ -2009,7 +2009,8 @@ static int setscheduler(pid_t pid, int p if ((policy == SCHED_FIFO || policy == SCHED_RR) && !capable(CAP_SYS_NICE)) goto out_unlock; - if ((current->euid != p->euid) && (current->euid != p->uid) && + if ((tsk_euid(current) != tsk_euid(p)) && + (tsk_euid(current) != tsk_uid(p)) && !capable(CAP_SYS_NICE)) goto out_unlock; @@ -2175,8 +2176,9 @@ asmlinkage long sys_sched_setaffinity(pi read_unlock(&tasklist_lock); retval = -EPERM; - if ((current->euid != p->euid) && (current->euid != p->uid) && - !capable(CAP_SYS_NICE)) + if ((tsk_euid(current) != tsk_euid(p)) && + (tsk_euid(current) != tsk_uid(p)) && + !capable(CAP_SYS_NICE)) goto out_unlock; retval = set_cpus_allowed(p, new_mask); diff -puN kernel/signal.c~d-task-xid kernel/signal.c --- 25/kernel/signal.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/kernel/signal.c 2003-09-27 19:29:18.000000000 -0700 @@ -594,8 +594,10 @@ static int check_kill_permission(int sig if ((!info || ((unsigned long)info != 1 && (unsigned long)info != 2 && SI_FROMUSER(info))) && ((sig != SIGCONT) || (current->session != t->session)) - && (current->euid ^ t->suid) && (current->euid ^ t->uid) - && (current->uid ^ t->suid) && (current->uid ^ t->uid) + && (tsk_euid(current) ^ tsk_suid(t)) + && (tsk_euid(current) ^ tsk_uid(t)) + && (tsk_uid(current) ^ tsk_suid(t)) + && (tsk_uid(current) ^ tsk_uid(t)) && !capable(CAP_KILL)) return error; return security_task_kill(t, info, sig); @@ -717,7 +719,7 @@ static int send_signal(int sig, struct s q->info.si_errno = 0; q->info.si_code = SI_USER; q->info.si_pid = current->pid; - q->info.si_uid = current->uid; + q->info.si_uid = tsk_uid(current); break; case 1: q->info.si_signo = sig; @@ -1415,7 +1417,7 @@ void do_notify_parent(struct task_struct info.si_signo = sig; info.si_errno = 0; info.si_pid = tsk->pid; - info.si_uid = tsk->uid; + info.si_uid = tsk_uid(tsk); /* FIXME: find out whether or not this is supposed to be c*time. */ info.si_utime = tsk->utime; @@ -1504,7 +1506,7 @@ do_notify_parent_cldstop(struct task_str info.si_signo = SIGCHLD; info.si_errno = 0; info.si_pid = tsk->pid; - info.si_uid = tsk->uid; + info.si_uid = tsk_uid(tsk); /* FIXME: find out whether or not this is supposed to be c*time. */ info.si_utime = tsk->utime; @@ -1753,7 +1755,7 @@ relock: info->si_errno = 0; info->si_code = SI_USER; info->si_pid = current->parent->pid; - info->si_uid = current->parent->uid; + info->si_uid = tsk_uid(current->parent); } /* If the (new) signal is now blocked, requeue it. */ @@ -2148,7 +2150,7 @@ sys_kill(int pid, int sig) info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->tgid; - info.si_uid = current->uid; + info.si_uid = tsk_uid(current); return kill_something_info(sig, &info, pid); } @@ -2177,7 +2179,7 @@ asmlinkage long sys_tgkill(int tgid, int info.si_errno = 0; info.si_code = SI_TKILL; info.si_pid = current->tgid; - info.si_uid = current->uid; + info.si_uid = tsk_uid(current); read_lock(&tasklist_lock); p = find_task_by_pid(pid); @@ -2217,7 +2219,7 @@ sys_tkill(int pid, int sig) info.si_errno = 0; info.si_code = SI_TKILL; info.si_pid = current->tgid; - info.si_uid = current->uid; + info.si_uid = tsk_uid(current); read_lock(&tasklist_lock); p = find_task_by_pid(pid); diff -puN kernel/sys.c~d-task-xid kernel/sys.c --- 25/kernel/sys.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/kernel/sys.c 2003-09-27 19:29:18.000000000 -0700 @@ -240,8 +240,8 @@ static int set_one_prio(struct task_stru { int no_nice; - if (p->uid != current->euid && - p->uid != current->uid && !capable(CAP_SYS_NICE)) { + if (tsk_uid(p) != tsk_euid(current) && + tsk_uid(p) != tsk_uid(current) && !capable(CAP_SYS_NICE)) { error = -EPERM; goto out; } @@ -304,7 +304,7 @@ asmlinkage long sys_setpriority(int whic goto out_unlock; do_each_thread(g, p) - if (p->uid == who) + if (tsk_uid(p) == who) error = set_one_prio(p, niceval, error); while_each_thread(g, p); break; @@ -363,7 +363,7 @@ asmlinkage long sys_getpriority(int whic goto out_unlock; do_each_thread(g, p) - if (p->uid == who) { + if (tsk_uid(p) == who) { niceval = 20 - task_nice(p); if (niceval > retval) retval = niceval; @@ -515,8 +515,8 @@ void ctrl_alt_del(void) */ asmlinkage long sys_setregid(gid_t rgid, gid_t egid) { - int old_rgid = current->gid; - int old_egid = current->egid; + int old_rgid = tsk_gid(current); + int old_egid = tsk_egid(current); int new_rgid = old_rgid; int new_egid = old_egid; int retval; @@ -527,7 +527,7 @@ asmlinkage long sys_setregid(gid_t rgid, if (rgid != (gid_t) -1) { if ((old_rgid == rgid) || - (current->egid==rgid) || + (tsk_egid(current) == rgid) || capable(CAP_SETGID)) new_rgid = rgid; else @@ -535,8 +535,8 @@ asmlinkage long sys_setregid(gid_t rgid, } if (egid != (gid_t) -1) { if ((old_rgid == egid) || - (current->egid == egid) || - (current->sgid == egid) || + (tsk_egid(current) == egid) || + (tsk_sgid(current) == egid) || capable(CAP_SETGID)) new_egid = egid; else { @@ -550,10 +550,10 @@ asmlinkage long sys_setregid(gid_t rgid, } if (rgid != (gid_t) -1 || (egid != (gid_t) -1 && egid != old_rgid)) - current->sgid = new_egid; - current->fsgid = new_egid; - current->egid = new_egid; - current->gid = new_rgid; + set_tsk_sgid(current, new_egid); + set_tsk_fsgid(current, new_egid); + set_tsk_egid(current, new_egid); + set_tsk_gid(current, new_rgid); return 0; } @@ -564,7 +564,7 @@ asmlinkage long sys_setregid(gid_t rgid, */ asmlinkage long sys_setgid(gid_t gid) { - int old_egid = current->egid; + int old_egid = tsk_egid(current); int retval; retval = security_task_setgid(gid, (gid_t)-1, (gid_t)-1, LSM_SETID_ID); @@ -578,16 +578,20 @@ asmlinkage long sys_setgid(gid_t gid) current->mm->dumpable=0; wmb(); } - current->gid = current->egid = current->sgid = current->fsgid = gid; + set_tsk_gid(current, gid); + set_tsk_egid(current, gid); + set_tsk_sgid(current, gid); + set_tsk_fsgid(current, gid); } - else if ((gid == current->gid) || (gid == current->sgid)) + else if ((gid == tsk_gid(current)) || (gid == tsk_sgid(current))) { if(old_egid != gid) { current->mm->dumpable=0; wmb(); } - current->egid = current->fsgid = gid; + set_tsk_egid(current, gid); + set_tsk_fsgid(current, gid); } else return -EPERM; @@ -616,7 +620,7 @@ static int set_user(uid_t new_ruid, int current->mm->dumpable = 0; wmb(); } - current->uid = new_ruid; + set_tsk_uid(current, new_ruid); return 0; } @@ -644,14 +648,14 @@ asmlinkage long sys_setreuid(uid_t ruid, if (retval) return retval; - new_ruid = old_ruid = current->uid; - new_euid = old_euid = current->euid; - old_suid = current->suid; + new_ruid = old_ruid = tsk_uid(current); + new_euid = old_euid = tsk_euid(current); + old_suid = tsk_suid(current); if (ruid != (uid_t) -1) { new_ruid = ruid; if ((old_ruid != ruid) && - (current->euid != ruid) && + (tsk_euid(current) != ruid) && !capable(CAP_SETUID)) return -EPERM; } @@ -659,8 +663,8 @@ asmlinkage long sys_setreuid(uid_t ruid, if (euid != (uid_t) -1) { new_euid = euid; if ((old_ruid != euid) && - (current->euid != euid) && - (current->suid != euid) && + (tsk_euid(current) != euid) && + (tsk_suid(current) != euid) && !capable(CAP_SETUID)) return -EPERM; } @@ -673,11 +677,12 @@ asmlinkage long sys_setreuid(uid_t ruid, current->mm->dumpable=0; wmb(); } - current->fsuid = current->euid = new_euid; + set_tsk_fsuid(current, new_euid); + set_tsk_euid(current, new_euid); if (ruid != (uid_t) -1 || (euid != (uid_t) -1 && euid != old_ruid)) - current->suid = current->euid; - current->fsuid = current->euid; + set_tsk_suid(current, new_euid); + set_tsk_fsuid(current, new_euid); return security_task_post_setuid(old_ruid, old_euid, old_suid, LSM_SETID_RE); } @@ -697,7 +702,7 @@ asmlinkage long sys_setreuid(uid_t ruid, */ asmlinkage long sys_setuid(uid_t uid) { - int old_euid = current->euid; + int old_euid = tsk_euid(current); int old_ruid, old_suid, new_ruid, new_suid; int retval; @@ -705,15 +710,15 @@ asmlinkage long sys_setuid(uid_t uid) if (retval) return retval; - old_ruid = new_ruid = current->uid; - old_suid = current->suid; + old_ruid = new_ruid = tsk_uid(current); + old_suid = tsk_suid(current); new_suid = old_suid; if (capable(CAP_SETUID)) { if (uid != old_ruid && set_user(uid, old_euid != uid) < 0) return -EAGAIN; new_suid = uid; - } else if ((uid != current->uid) && (uid != new_suid)) + } else if ((uid != tsk_uid(current)) && (uid != new_suid)) return -EPERM; if (old_euid != uid) @@ -721,8 +726,9 @@ asmlinkage long sys_setuid(uid_t uid) current->mm->dumpable = 0; wmb(); } - current->fsuid = current->euid = uid; - current->suid = new_suid; + set_tsk_fsuid(current, uid); + set_tsk_euid(current, uid); + set_tsk_suid(current, new_suid); return security_task_post_setuid(old_ruid, old_euid, old_suid, LSM_SETID_ID); } @@ -734,9 +740,9 @@ asmlinkage long sys_setuid(uid_t uid) */ asmlinkage long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid) { - int old_ruid = current->uid; - int old_euid = current->euid; - int old_suid = current->suid; + int old_ruid = tsk_uid(current); + int old_euid = tsk_euid(current); + int old_suid = tsk_suid(current); int retval; retval = security_task_setuid(ruid, euid, suid, LSM_SETID_RES); @@ -744,31 +750,32 @@ asmlinkage long sys_setresuid(uid_t ruid return retval; if (!capable(CAP_SETUID)) { - if ((ruid != (uid_t) -1) && (ruid != current->uid) && - (ruid != current->euid) && (ruid != current->suid)) + if ((ruid != (uid_t) -1) && (ruid != tsk_uid(current)) && + (ruid != tsk_euid(current)) && (ruid != tsk_suid(current))) return -EPERM; - if ((euid != (uid_t) -1) && (euid != current->uid) && - (euid != current->euid) && (euid != current->suid)) + if ((euid != (uid_t) -1) && (euid != tsk_uid(current)) && + (euid != tsk_euid(current)) && (euid != tsk_suid(current))) return -EPERM; - if ((suid != (uid_t) -1) && (suid != current->uid) && - (suid != current->euid) && (suid != current->suid)) + if ((suid != (uid_t) -1) && (suid != tsk_uid(current)) && + (suid != tsk_euid(current)) && (suid != tsk_suid(current))) return -EPERM; } if (ruid != (uid_t) -1) { - if (ruid != current->uid && set_user(ruid, euid != current->euid) < 0) + if (ruid != tsk_uid(current) && + set_user(ruid, euid != tsk_euid(current)) < 0) return -EAGAIN; } if (euid != (uid_t) -1) { - if (euid != current->euid) + if (euid != tsk_euid(current)) { current->mm->dumpable = 0; wmb(); } - current->euid = euid; + set_tsk_euid(current, euid); } - current->fsuid = current->euid; + set_tsk_fsuid(current, tsk_euid(current)); if (suid != (uid_t) -1) - current->suid = suid; + set_tsk_suid(current, suid); return security_task_post_setuid(old_ruid, old_euid, old_suid, LSM_SETID_RES); } @@ -777,9 +784,9 @@ asmlinkage long sys_getresuid(uid_t *rui { int retval; - if (!(retval = put_user(current->uid, ruid)) && - !(retval = put_user(current->euid, euid))) - retval = put_user(current->suid, suid); + if (!(retval = put_user(tsk_uid(current), ruid)) && + !(retval = put_user(tsk_euid(current), euid))) + retval = put_user(tsk_suid(current), suid); return retval; } @@ -796,29 +803,29 @@ asmlinkage long sys_setresgid(gid_t rgid return retval; if (!capable(CAP_SETGID)) { - if ((rgid != (gid_t) -1) && (rgid != current->gid) && - (rgid != current->egid) && (rgid != current->sgid)) + if ((rgid != (gid_t) -1) && (rgid != tsk_gid(current)) && + (rgid != tsk_egid(current)) && (rgid != tsk_sgid(current))) return -EPERM; - if ((egid != (gid_t) -1) && (egid != current->gid) && - (egid != current->egid) && (egid != current->sgid)) + if ((egid != (gid_t) -1) && (egid != tsk_gid(current)) && + (egid != tsk_egid(current)) && (egid != tsk_sgid(current))) return -EPERM; - if ((sgid != (gid_t) -1) && (sgid != current->gid) && - (sgid != current->egid) && (sgid != current->sgid)) + if ((sgid != (gid_t) -1) && (sgid != tsk_gid(current)) && + (sgid != tsk_egid(current)) && (sgid != tsk_sgid(current))) return -EPERM; } if (egid != (gid_t) -1) { - if (egid != current->egid) + if (egid != tsk_egid(current)) { current->mm->dumpable = 0; wmb(); } - current->egid = egid; + set_tsk_egid(current, egid); } - current->fsgid = current->egid; + set_tsk_fsgid(current, tsk_egid(current)); if (rgid != (gid_t) -1) - current->gid = rgid; + set_tsk_gid(current, rgid); if (sgid != (gid_t) -1) - current->sgid = sgid; + set_tsk_sgid(current, sgid); return 0; } @@ -826,9 +833,9 @@ asmlinkage long sys_getresgid(gid_t *rgi { int retval; - if (!(retval = put_user(current->gid, rgid)) && - !(retval = put_user(current->egid, egid))) - retval = put_user(current->sgid, sgid); + if (!(retval = put_user(tsk_gid(current), rgid)) && + !(retval = put_user(tsk_egid(current), egid))) + retval = put_user(tsk_sgid(current), sgid); return retval; } @@ -844,12 +851,12 @@ asmlinkage long sys_setfsuid(uid_t uid) { int old_fsuid; - old_fsuid = current->fsuid; + old_fsuid = tsk_fsuid(current); if (security_task_setuid(uid, (uid_t)-1, (uid_t)-1, LSM_SETID_FS)) return old_fsuid; - if (uid == current->uid || uid == current->euid || - uid == current->suid || uid == current->fsuid || + if (uid == tsk_uid(current) || uid == tsk_euid(current) || + uid == tsk_suid(current) || uid == tsk_fsuid(current) || capable(CAP_SETUID)) { if (uid != old_fsuid) @@ -857,7 +864,7 @@ asmlinkage long sys_setfsuid(uid_t uid) current->mm->dumpable = 0; wmb(); } - current->fsuid = uid; + set_tsk_fsuid(current, uid); } security_task_post_setuid(old_fsuid, (uid_t)-1, (uid_t)-1, LSM_SETID_FS); @@ -872,12 +879,12 @@ asmlinkage long sys_setfsgid(gid_t gid) { int old_fsgid; - old_fsgid = current->fsgid; + old_fsgid = tsk_fsgid(current); if (security_task_setgid(gid, (gid_t)-1, (gid_t)-1, LSM_SETID_FS)) return old_fsgid; - if (gid == current->gid || gid == current->egid || - gid == current->sgid || gid == current->fsgid || + if (gid == tsk_gid(current) || gid == tsk_egid(current) || + gid == tsk_sgid(current) || gid == tsk_fsgid(current) || capable(CAP_SETGID)) { if (gid != old_fsgid) @@ -885,7 +892,7 @@ asmlinkage long sys_setfsgid(gid_t gid) current->mm->dumpable = 0; wmb(); } - current->fsgid = gid; + set_tsk_fsgid(current, gid); } return old_fsgid; } @@ -1083,11 +1090,12 @@ asmlinkage long sys_getgroups(int gidset if (gidsetsize < 0) return -EINVAL; - i = current->ngroups; + i = tsk_ngroups(current); if (gidsetsize) { if (i > gidsetsize) return -EINVAL; - if (copy_to_user(grouplist, current->groups, sizeof(gid_t)*i)) + if (copy_to_user(grouplist, tsk_groups(current), + sizeof(gid_t)*i)) return -EFAULT; } return i; @@ -1112,17 +1120,17 @@ asmlinkage long sys_setgroups(int gidset retval = security_task_setgroups(gidsetsize, groups); if (retval) return retval; - memcpy(current->groups, groups, gidsetsize * sizeof(gid_t)); - current->ngroups = gidsetsize; + memcpy(tsk_groups(current), groups, gidsetsize * sizeof(gid_t)); + set_tsk_ngroups(current, gidsetsize); return 0; } static int supplemental_group_member(gid_t grp) { - int i = current->ngroups; + int i = tsk_ngroups(current); if (i) { - gid_t *groups = current->groups; + gid_t *groups = tsk_groups(current); do { if (*groups == grp) return 1; @@ -1139,7 +1147,7 @@ static int supplemental_group_member(gid int in_group_p(gid_t grp) { int retval = 1; - if (grp != current->fsgid) + if (grp != tsk_fsgid(current)) retval = supplemental_group_member(grp); return retval; } @@ -1147,7 +1155,7 @@ int in_group_p(gid_t grp) int in_egroup_p(gid_t grp) { int retval = 1; - if (grp != current->egid) + if (grp != tsk_egid(current)) retval = supplemental_group_member(grp); return retval; } diff -puN kernel/sysctl.c~d-task-xid kernel/sysctl.c --- 25/kernel/sysctl.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/kernel/sysctl.c 2003-09-27 19:29:18.000000000 -0700 @@ -885,7 +885,7 @@ asmlinkage long sys_sysctl(struct __sysc static int test_perm(int mode, int op) { - if (!current->euid) + if (!tsk_euid(current)) mode >>= 6; else if (in_egroup_p(0)) mode >>= 3; diff -puN kernel/timer.c~d-task-xid kernel/timer.c --- 25/kernel/timer.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/kernel/timer.c 2003-09-27 19:29:18.000000000 -0700 @@ -926,25 +926,25 @@ asmlinkage long sys_getppid(void) asmlinkage long sys_getuid(void) { /* Only we change this so SMP safe */ - return current->uid; + return tsk_uid(current); } asmlinkage long sys_geteuid(void) { /* Only we change this so SMP safe */ - return current->euid; + return tsk_euid(current); } asmlinkage long sys_getgid(void) { /* Only we change this so SMP safe */ - return current->gid; + return tsk_gid(current); } asmlinkage long sys_getegid(void) { /* Only we change this so SMP safe */ - return current->egid; + return tsk_egid(current); } #endif diff -puN kernel/uid16.c~d-task-xid kernel/uid16.c --- 25/kernel/uid16.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/kernel/uid16.c 2003-09-27 19:29:18.000000000 -0700 @@ -73,9 +73,9 @@ asmlinkage long sys_getresuid16(old_uid_ { int retval; - if (!(retval = put_user(high2lowuid(current->uid), ruid)) && - !(retval = put_user(high2lowuid(current->euid), euid))) - retval = put_user(high2lowuid(current->suid), suid); + if (!(retval = put_user(high2lowuid(tsk_uid(current)), ruid)) && + !(retval = put_user(high2lowuid(tsk_euid(current)), euid))) + retval = put_user(high2lowuid(tsk_suid(current)), suid); return retval; } @@ -90,9 +90,9 @@ asmlinkage long sys_getresgid16(old_gid_ { int retval; - if (!(retval = put_user(high2lowgid(current->gid), rgid)) && - !(retval = put_user(high2lowgid(current->egid), egid))) - retval = put_user(high2lowgid(current->sgid), sgid); + if (!(retval = put_user(high2lowgid(tsk_gid(current)), rgid)) && + !(retval = put_user(high2lowgid(tsk_egid(current)), egid))) + retval = put_user(high2lowgid(tsk_sgid(current)), sgid); return retval; } @@ -114,12 +114,12 @@ asmlinkage long sys_getgroups16(int gids if (gidsetsize < 0) return -EINVAL; - i = current->ngroups; + i = tsk_ngroups(current); if (gidsetsize) { if (i > gidsetsize) return -EINVAL; for(j=0;jgroups[j]; + groups[j] = tsk_groups(current)[j]; if (copy_to_user(grouplist, groups, sizeof(old_gid_t)*i)) return -EFAULT; } @@ -143,27 +143,27 @@ asmlinkage long sys_setgroups16(int gids i = security_task_setgroups(gidsetsize, new_groups); if (i) return i; - memcpy(current->groups, new_groups, gidsetsize * sizeof(gid_t)); - current->ngroups = gidsetsize; + memcpy(tsk_groups(current), new_groups, gidsetsize * sizeof(gid_t)); + set_tsk_ngroups(current, gidsetsize); return 0; } asmlinkage long sys_getuid16(void) { - return high2lowuid(current->uid); + return high2lowuid(tsk_uid(current)); } asmlinkage long sys_geteuid16(void) { - return high2lowuid(current->euid); + return high2lowuid(tsk_euid(current)); } asmlinkage long sys_getgid16(void) { - return high2lowgid(current->gid); + return high2lowgid(tsk_gid(current)); } asmlinkage long sys_getegid16(void) { - return high2lowgid(current->egid); + return high2lowgid(tsk_egid(current)); } diff -puN mm/oom_kill.c~d-task-xid mm/oom_kill.c --- 25/mm/oom_kill.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/mm/oom_kill.c 2003-09-27 19:29:18.000000000 -0700 @@ -92,7 +92,7 @@ static int badness(struct task_struct *p * less likely that we kill those. */ if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_ADMIN) || - p->uid == 0 || p->euid == 0) + tsk_uid(p) == 0 || tsk_euid(p) == 0) points /= 4; /* diff -puN mm/shmem.c~d-task-xid mm/shmem.c --- 25/mm/shmem.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/mm/shmem.c 2003-09-27 19:29:18.000000000 -0700 @@ -1051,8 +1051,8 @@ shmem_get_inode(struct super_block *sb, inode = new_inode(sb); if (inode) { inode->i_mode = mode; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = tsk_fsgid(current); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mapping->a_ops = &shmem_aops; @@ -1673,8 +1673,8 @@ static int shmem_fill_super(struct super struct dentry *root; unsigned long blocks, inodes; int mode = S_IRWXUGO | S_ISVTX; - uid_t uid = current->fsuid; - gid_t gid = current->fsgid; + uid_t uid = tsk_fsuid(current); + gid_t gid = tsk_fsgid(current); struct shmem_sb_info *sbinfo; int err = -ENOMEM; diff -puN net/core/scm.c~d-task-xid net/core/scm.c --- 25/net/core/scm.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/net/core/scm.c 2003-09-27 19:29:18.000000000 -0700 @@ -42,10 +42,12 @@ static __inline__ int scm_check_creds(struct ucred *creds) { if ((creds->pid == current->tgid || capable(CAP_SYS_ADMIN)) && - ((creds->uid == current->uid || creds->uid == current->euid || - creds->uid == current->suid) || capable(CAP_SETUID)) && - ((creds->gid == current->gid || creds->gid == current->egid || - creds->gid == current->sgid) || capable(CAP_SETGID))) { + ((creds->uid == tsk_uid(current) || + creds->uid == tsk_euid(current) || + creds->uid == tsk_suid(current)) || capable(CAP_SETUID)) && + ((creds->gid == tsk_gid(current) || + creds->gid == tsk_egid(current) || + creds->gid == tsk_sgid(current)) || capable(CAP_SETGID))) { return 0; } return -EPERM; diff -puN net/ipv6/ip6_flowlabel.c~d-task-xid net/ipv6/ip6_flowlabel.c --- 25/net/ipv6/ip6_flowlabel.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/net/ipv6/ip6_flowlabel.c 2003-09-27 19:29:18.000000000 -0700 @@ -342,7 +342,7 @@ fl_create(struct in6_flowlabel_req *freq fl->owner = current->pid; break; case IPV6_FL_S_USER: - fl->owner = current->euid; + fl->owner = tsk_euid(current); break; default: err = -EINVAL; diff -puN net/socket.c~d-task-xid net/socket.c --- 25/net/socket.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/net/socket.c 2003-09-27 19:29:18.000000000 -0700 @@ -468,8 +468,8 @@ struct socket *sock_alloc(void) inode->i_mode = S_IFSOCK|S_IRWXUGO; inode->i_sock = 1; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = tsk_fsuid(current); + inode->i_gid = tsk_fsgid(current); get_cpu_var(sockets_in_use)++; put_cpu_var(sockets_in_use); diff -puN net/sunrpc/auth.c~d-task-xid net/sunrpc/auth.c --- 25/net/sunrpc/auth.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/net/sunrpc/auth.c 2003-09-27 19:29:18.000000000 -0700 @@ -247,10 +247,10 @@ struct rpc_cred * rpcauth_lookupcred(struct rpc_auth *auth, int taskflags) { struct auth_cred acred = { - .uid = current->fsuid, - .gid = current->fsgid, - .ngroups = current->ngroups, - .groups = current->groups, + .uid = tsk_fsuid(current), + .gid = tsk_fsgid(current), + .ngroups = tsk_ngroups(current), + .groups = tsk_groups(current), }; dprintk("RPC: looking up %s cred\n", auth->au_ops->au_name); @@ -262,10 +262,10 @@ rpcauth_bindcred(struct rpc_task *task) { struct rpc_auth *auth = task->tk_auth; struct auth_cred acred = { - .uid = current->fsuid, - .gid = current->fsgid, - .ngroups = current->ngroups, - .groups = current->groups, + .uid = tsk_fsuid(current), + .gid = tsk_fsgid(current), + .ngroups = tsk_ngroups(current), + .groups = tsk_groups(current), }; dprintk("RPC: %4d looking up %s cred\n", diff -puN net/sunrpc/auth_unix.c~d-task-xid net/sunrpc/auth_unix.c --- 25/net/sunrpc/auth_unix.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/net/sunrpc/auth_unix.c 2003-09-27 19:29:18.000000000 -0700 @@ -88,8 +88,8 @@ unx_create_cred(struct rpc_auth *auth, s cred->uc_uid = acred->uid; cred->uc_gid = acred->gid; - cred->uc_puid = current->uid; - cred->uc_pgid = current->gid; + cred->uc_puid = tsk_uid(current); + cred->uc_pgid = tsk_gid(current); for (i = 0; i < groups; i++) cred->uc_gids[i] = (gid_t) acred->groups[i]; if (i < NFS_NGROUPS) @@ -122,8 +122,8 @@ unx_match(struct auth_cred *acred, struc if (cred->uc_uid != acred->uid || cred->uc_gid != acred->gid - || cred->uc_puid != current->uid - || cred->uc_pgid != current->gid) + || cred->uc_puid != tsk_uid(current) + || cred->uc_pgid != tsk_gid(current)) return 0; groups = acred->ngroups; diff -puN net/sunrpc/sched.c~d-task-xid net/sunrpc/sched.c --- 25/net/sunrpc/sched.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/net/sunrpc/sched.c 2003-09-27 19:29:18.000000000 -0700 @@ -718,7 +718,8 @@ rpc_init_task(struct rpc_task *task, str task->tk_flags = flags; task->tk_exit = callback; init_waitqueue_head(&task->tk_wait); - if (current->uid != current->fsuid || current->gid != current->fsgid) + if (tsk_uid(current) != tsk_fsuid(current) || + tsk_gid(current) != tsk_fsgid(current)) task->tk_flags |= RPC_TASK_SETUID; /* Initialize retry counters */ diff -puN net/unix/af_unix.c~d-task-xid net/unix/af_unix.c --- 25/net/unix/af_unix.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/net/unix/af_unix.c 2003-09-27 19:29:18.000000000 -0700 @@ -449,8 +449,8 @@ static int unix_listen(struct socket *so sk->sk_state = TCP_LISTEN; /* set credentials so connect can copy them */ sk->sk_peercred.pid = current->pid; - sk->sk_peercred.uid = current->euid; - sk->sk_peercred.gid = current->egid; + sk->sk_peercred.uid = tsk_euid(current); + sk->sk_peercred.gid = tsk_egid(current); err = 0; out_unlock: @@ -984,8 +984,8 @@ restart: newsk->sk_state = TCP_ESTABLISHED; newsk->sk_type = SOCK_STREAM; newsk->sk_peercred.pid = current->pid; - newsk->sk_peercred.uid = current->euid; - newsk->sk_peercred.gid = current->egid; + newsk->sk_peercred.uid = tsk_euid(current); + newsk->sk_peercred.gid = tsk_egid(current); newu = unix_sk(newsk); newsk->sk_sleep = &newu->peer_wait; otheru = unix_sk(other); @@ -1046,8 +1046,8 @@ static int unix_socketpair(struct socket unix_peer(ska)=skb; unix_peer(skb)=ska; ska->sk_peercred.pid = skb->sk_peercred.pid = current->pid; - ska->sk_peercred.uid = skb->sk_peercred.uid = current->euid; - ska->sk_peercred.gid = skb->sk_peercred.gid = current->egid; + ska->sk_peercred.uid = skb->sk_peercred.uid = tsk_euid(current); + ska->sk_peercred.gid = skb->sk_peercred.gid = tsk_egid(current); if (ska->sk_type != SOCK_DGRAM) { ska->sk_state = TCP_ESTABLISHED; diff -puN security/commoncap.c~d-task-xid security/commoncap.c --- 25/security/commoncap.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/security/commoncap.c 2003-09-27 19:29:18.000000000 -0700 @@ -103,7 +103,7 @@ int cap_bprm_set_security (struct linux_ */ if (!issecure (SECURE_NOROOT)) { - if (bprm->e_uid == 0 || current->uid == 0) { + if (bprm->e_uid == 0 || tsk_uid(current) == 0) { cap_set_full (bprm->cap_inheritable); cap_set_full (bprm->cap_permitted); } @@ -167,8 +167,8 @@ int cap_bprm_secureexec (struct linux_bi test between the old and new capability sets. For now, it simply preserves the legacy decision algorithm used by the old userland. */ - return (current->euid != current->uid || - current->egid != current->gid); + return (tsk_euid(current) != tsk_uid(current) || + tsk_egid(current) != tsk_gid(current)); } /* moved from kernel/sys.c. */ @@ -205,15 +205,16 @@ static inline void cap_emulate_setxuid ( int old_suid) { if ((old_ruid == 0 || old_euid == 0 || old_suid == 0) && - (current->uid != 0 && current->euid != 0 && current->suid != 0) && + (tsk_uid(current) != 0 && tsk_euid(current) != 0 && + tsk_suid(current) != 0) && !current->keep_capabilities) { cap_clear (current->cap_permitted); cap_clear (current->cap_effective); } - if (old_euid == 0 && current->euid != 0) { + if (old_euid == 0 && tsk_euid(current) != 0) { cap_clear (current->cap_effective); } - if (old_euid != 0 && current->euid == 0) { + if (old_euid != 0 && tsk_euid(current) == 0) { current->cap_effective = current->cap_permitted; } } @@ -242,11 +243,11 @@ int cap_task_post_setuid (uid_t old_ruid */ if (!issecure (SECURE_NO_SETUID_FIXUP)) { - if (old_fsuid == 0 && current->fsuid != 0) { + if (old_fsuid == 0 && tsk_fsuid(current) != 0) { cap_t (current->cap_effective) &= ~CAP_FS_MASK; } - if (old_fsuid != 0 && current->fsuid == 0) { + if (old_fsuid != 0 && tsk_fsuid(current) == 0) { cap_t (current->cap_effective) |= (cap_t (current->cap_permitted) & CAP_FS_MASK); diff -puN security/dummy.c~d-task-xid security/dummy.c --- 25/security/dummy.c~d-task-xid 2003-09-27 19:29:17.000000000 -0700 +++ 25-akpm/security/dummy.c 2003-09-27 19:29:18.000000000 -0700 @@ -35,11 +35,11 @@ static int dummy_capget (struct task_str { *effective = *inheritable = *permitted = 0; if (!issecure(SECURE_NOROOT)) { - if (target->euid == 0) { + if (tsk_euid(target) == 0) { *permitted |= (~0 & ~CAP_FS_MASK); *effective |= (~0 & ~CAP_TO_MASK(CAP_SETPCAP) & ~CAP_FS_MASK); } - if (target->fsuid == 0) { + if (tsk_fsuid(target) == 0) { *permitted |= CAP_FS_MASK; *effective |= CAP_FS_MASK; } @@ -70,7 +70,7 @@ static int dummy_acct (struct file *file static int dummy_capable (struct task_struct *tsk, int cap) { - if (cap_is_fs_cap (cap) ? tsk->fsuid == 0 : tsk->euid == 0) + if (cap_is_fs_cap (cap) ? tsk_fsuid(tsk) == 0 : tsk_euid(tsk) == 0) /* capability granted */ return 0; @@ -95,7 +95,7 @@ static int dummy_quota_on (struct file * static int dummy_syslog (int type) { - if ((type != 3) && current->euid) + if ((type != 3) && tsk_euid(current)) return -EPERM; return 0; } @@ -128,7 +128,7 @@ static int dummy_vm_enough_memory(long p /* * Leave the last 3% for root */ - if (current->euid) + if (tsk_euid(current)) free -= free / 32; if (free > pages) @@ -179,8 +179,8 @@ static int dummy_bprm_secureexec (struct in the AT_SECURE field to decide whether secure mode is required. Hence, this logic is required to preserve the legacy decision algorithm used by the old userland. */ - return (current->euid != current->uid || - current->egid != current->gid); + return (tsk_euid(current) != tsk_uid(current) || + tsk_egid(current) != tsk_gid(current)); } static int dummy_sb_alloc_security (struct super_block *sb) @@ -575,7 +575,8 @@ static int dummy_task_prctl (int option, static void dummy_task_reparent_to_init (struct task_struct *p) { - p->euid = p->fsuid = 0; + set_tsk_euid(p, 0); + set_tsk_fsuid(p, 0); return; } @@ -685,7 +686,7 @@ static int dummy_sem_semop (struct sem_a static int dummy_netlink_send (struct sk_buff *skb) { - if (current->euid == 0) + if (tsk_euid(current) == 0) cap_raise (NETLINK_CB (skb).eff_cap, CAP_NET_ADMIN); else NETLINK_CB (skb).eff_cap = 0; _