diff -u --recursive --new-file linux-2.5.3/arch/alpha/kernel/osf_sys.c linux-2.5.3-fixup_cred/arch/alpha/kernel/osf_sys.c --- linux-2.5.3/arch/alpha/kernel/osf_sys.c Sat Nov 3 02:39:20 2001 +++ linux-2.5.3-fixup_cred/arch/alpha/kernel/osf_sys.c Sat Feb 2 16:05:57 2002 @@ -195,16 +195,16 @@ int a5, struct pt_regs regs) { struct task_struct * tsk = current; - (®s)->r20 = tsk->euid; - return tsk->uid; + (®s)->r20 = task_euid(tsk); + return task_uid(tsk); } asmlinkage unsigned long sys_getxgid(int a0, int a1, int a2, int a3, int a4, int a5, struct pt_regs regs) { struct task_struct * tsk = current; - (®s)->r20 = tsk->egid; - return tsk->gid; + (®s)->r20 = task_egid(tsk); + return task_gid(tsk); } asmlinkage unsigned long sys_getxpid(int a0, int a1, int a2, int a3, int a4, diff -u --recursive --new-file linux-2.5.3/arch/alpha/kernel/signal.c linux-2.5.3-fixup_cred/arch/alpha/kernel/signal.c --- linux-2.5.3/arch/alpha/kernel/signal.c Fri Nov 9 22:45:35 2001 +++ linux-2.5.3-fixup_cred/arch/alpha/kernel/signal.c Sat Feb 2 16:05:57 2002 @@ -662,7 +662,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/arm/kernel/signal.c linux-2.5.3-fixup_cred/arch/arm/kernel/signal.c --- linux-2.5.3/arch/arm/kernel/signal.c Sat Jan 5 22:04:30 2002 +++ linux-2.5.3-fixup_cred/arch/arm/kernel/signal.c Sat Feb 2 16:05:59 2002 @@ -585,7 +585,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/cris/kernel/signal.c linux-2.5.3-fixup_cred/arch/cris/kernel/signal.c --- linux-2.5.3/arch/cris/kernel/signal.c Mon Oct 8 20:43:54 2001 +++ linux-2.5.3-fixup_cred/arch/cris/kernel/signal.c Sat Feb 2 16:06:01 2002 @@ -626,7 +626,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/i386/kernel/signal.c linux-2.5.3-fixup_cred/arch/i386/kernel/signal.c --- linux-2.5.3/arch/i386/kernel/signal.c Tue Jan 29 00:11:45 2002 +++ linux-2.5.3-fixup_cred/arch/i386/kernel/signal.c Sat Feb 2 16:05:56 2002 @@ -628,7 +628,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/ia64/kernel/perfmon.c linux-2.5.3-fixup_cred/arch/ia64/kernel/perfmon.c --- linux-2.5.3/arch/ia64/kernel/perfmon.c Tue Jan 15 19:56:35 2002 +++ linux-2.5.3-fixup_cred/arch/ia64/kernel/perfmon.c Sat Feb 2 16:06:00 2002 @@ -1265,8 +1265,8 @@ { /* stolen from bad_signal() */ return (current->session != task->session) - && (current->euid ^ task->suid) && (current->euid ^ task->uid) - && (current->uid ^ task->suid) && (current->uid ^ task->uid); + && (task_euid(current) ^ task_suid(task)) && (task_euid(current) ^ task_uid(task)) + && (task_uid(current) ^ task_suid(task)) && (task_uid(current) ^ task_uid(task)); } asmlinkage int diff -u --recursive --new-file linux-2.5.3/arch/ia64/kernel/signal.c linux-2.5.3-fixup_cred/arch/ia64/kernel/signal.c --- linux-2.5.3/arch/ia64/kernel/signal.c Fri Nov 9 23:26:17 2001 +++ linux-2.5.3-fixup_cred/arch/ia64/kernel/signal.c Sat Feb 2 16:06:00 2002 @@ -282,7 +282,7 @@ si.si_errno = 0; si.si_code = SI_KERNEL; si.si_pid = current->pid; - si.si_uid = current->uid; + si.si_uid = task_uid(current); si.si_addr = sc; force_sig_info(SIGSEGV, &si, current); return retval; @@ -409,7 +409,7 @@ si.si_errno = 0; si.si_code = SI_KERNEL; si.si_pid = current->pid; - si.si_uid = current->uid; + si.si_uid = task_uid(current); si.si_addr = frame; force_sig_info(SIGSEGV, &si, current); return 0; @@ -525,7 +525,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/m68k/kernel/signal.c linux-2.5.3-fixup_cred/arch/m68k/kernel/signal.c --- linux-2.5.3/arch/m68k/kernel/signal.c Thu Jan 25 00:21:28 2001 +++ linux-2.5.3-fixup_cred/arch/m68k/kernel/signal.c Sat Feb 2 16:06:48 2002 @@ -1081,8 +1081,8 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; - info.si_uid16 = high2lowuid(current->p_pptr->uid); + info.si_uid = task_uid(current->p_pptr); + info.si_uid16 = high2lowuid(info.si_uid); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/mips/kernel/irixelf.c linux-2.5.3-fixup_cred/arch/mips/kernel/irixelf.c --- linux-2.5.3/arch/mips/kernel/irixelf.c Mon Mar 19 21:35:09 2001 +++ linux-2.5.3-fixup_cred/arch/mips/kernel/irixelf.c Sat Feb 2 16:05:57 2002 @@ -194,10 +194,10 @@ NEW_AUX_ENT (4, AT_BASE, interp_load_addr); NEW_AUX_ENT (5, AT_FLAGS, 0); NEW_AUX_ENT (6, AT_ENTRY, (elf_addr_t) exec->e_entry); - NEW_AUX_ENT (7, AT_UID, (elf_addr_t) current->uid); - NEW_AUX_ENT (8, AT_EUID, (elf_addr_t) current->euid); - NEW_AUX_ENT (9, AT_GID, (elf_addr_t) current->gid); - NEW_AUX_ENT (10, AT_EGID, (elf_addr_t) current->egid); + NEW_AUX_ENT (7, AT_UID, (elf_addr_t) task_uid(current)); + NEW_AUX_ENT (8, AT_EUID, (elf_addr_t) task_euid(current)); + NEW_AUX_ENT (9, AT_GID, (elf_addr_t) task_gid(current)); + NEW_AUX_ENT (10, AT_EGID, (elf_addr_t) task_egid(current)); } #undef NEW_AUX_ENT @@ -1158,8 +1158,8 @@ psinfo.pr_zomb = psinfo.pr_sname == 'Z'; psinfo.pr_nice = current->nice; psinfo.pr_flag = current->flags; - psinfo.pr_uid = current->uid; - psinfo.pr_gid = current->gid; + psinfo.pr_uid = task_uid(current); + psinfo.pr_gid = task_gid(current); { int i, len; diff -u --recursive --new-file linux-2.5.3/arch/mips/kernel/irixsig.c linux-2.5.3-fixup_cred/arch/mips/kernel/irixsig.c --- linux-2.5.3/arch/mips/kernel/irixsig.c Mon Jul 2 22:56:40 2001 +++ linux-2.5.3-fixup_cred/arch/mips/kernel/irixsig.c Sat Feb 2 16:05:57 2002 @@ -211,7 +211,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/mips/kernel/signal.c linux-2.5.3-fixup_cred/arch/mips/kernel/signal.c --- linux-2.5.3/arch/mips/kernel/signal.c Sun Sep 9 19:43:01 2001 +++ linux-2.5.3-fixup_cred/arch/mips/kernel/signal.c Sat Feb 2 16:05:57 2002 @@ -609,7 +609,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/mips/kernel/sysirix.c linux-2.5.3-fixup_cred/arch/mips/kernel/sysirix.c --- linux-2.5.3/arch/mips/kernel/sysirix.c Mon Aug 13 00:05:26 2001 +++ linux-2.5.3-fixup_cred/arch/mips/kernel/sysirix.c Sat Feb 2 16:05:57 2002 @@ -604,14 +604,14 @@ asmlinkage int irix_getuid(struct pt_regs *regs) { - regs->regs[3] = current->euid; - return current->uid; + regs->regs[3] = task_euid(current); + return task_uid(current); } asmlinkage int irix_getgid(struct pt_regs *regs) { - regs->regs[3] = current->egid; - return current->gid; + regs->regs[3] = task_egid(current); + return task_gid(current); } extern rwlock_t xtime_lock; diff -u --recursive --new-file linux-2.5.3/arch/mips64/kernel/signal.c linux-2.5.3-fixup_cred/arch/mips64/kernel/signal.c --- linux-2.5.3/arch/mips64/kernel/signal.c Sun Sep 9 19:43:01 2001 +++ linux-2.5.3-fixup_cred/arch/mips64/kernel/signal.c Sat Feb 2 16:06:00 2002 @@ -633,7 +633,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/mips64/kernel/signal32.c linux-2.5.3-fixup_cred/arch/mips64/kernel/signal32.c --- linux-2.5.3/arch/mips64/kernel/signal32.c Sun Sep 9 19:43:01 2001 +++ linux-2.5.3-fixup_cred/arch/mips64/kernel/signal32.c Sat Feb 2 16:06:00 2002 @@ -705,7 +705,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/parisc/kernel/signal.c linux-2.5.3-fixup_cred/arch/parisc/kernel/signal.c --- linux-2.5.3/arch/parisc/kernel/signal.c Wed Dec 6 20:46:39 2000 +++ linux-2.5.3-fixup_cred/arch/parisc/kernel/signal.c Sat Feb 2 16:06:01 2002 @@ -232,7 +232,7 @@ si.si_errno = 0; si.si_code = SI_KERNEL; si.si_pid = current->pid; - si.si_uid = current->uid; + si.si_uid = task_uid(current); si.si_addr = &frame->uc; force_sig_info(SIGSEGV, &si, current); return; @@ -421,7 +421,7 @@ si.si_errno = 0; si.si_code = SI_KERNEL; si.si_pid = current->pid; - si.si_uid = current->uid; + si.si_uid = task_uid(current); si.si_addr = frame; force_sig_info(SIGSEGV, &si, current); return 0; @@ -525,7 +525,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/ppc/kernel/ppc_htab.c linux-2.5.3-fixup_cred/arch/ppc/kernel/ppc_htab.c --- linux-2.5.3/arch/ppc/kernel/ppc_htab.c Sat Nov 3 02:43:54 2001 +++ linux-2.5.3-fixup_cred/arch/ppc/kernel/ppc_htab.c Sat Feb 2 16:05:58 2002 @@ -235,7 +235,7 @@ { #ifdef CONFIG_PPC_STD_MMU unsigned long tmp; - if ( current->uid != 0 ) + if ( task_uid(current) != 0 ) return -EACCES; /* don't set the htab size for now */ if ( !strncmp( buffer, "size ", 5) ) diff -u --recursive --new-file linux-2.5.3/arch/ppc/kernel/signal.c linux-2.5.3-fixup_cred/arch/ppc/kernel/signal.c --- linux-2.5.3/arch/ppc/kernel/signal.c Tue May 22 02:04:47 2001 +++ linux-2.5.3-fixup_cred/arch/ppc/kernel/signal.c Sat Feb 2 16:05:58 2002 @@ -589,7 +589,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/s390/kernel/signal.c linux-2.5.3-fixup_cred/arch/s390/kernel/signal.c --- linux-2.5.3/arch/s390/kernel/signal.c Thu Oct 11 18:04:57 2001 +++ linux-2.5.3-fixup_cred/arch/s390/kernel/signal.c Sat Feb 2 16:06:00 2002 @@ -508,7 +508,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/s390x/kernel/linux32.c linux-2.5.3-fixup_cred/arch/s390x/kernel/linux32.c --- linux-2.5.3/arch/s390x/kernel/linux32.c Thu Oct 11 18:04:57 2001 +++ linux-2.5.3-fixup_cred/arch/s390x/kernel/linux32.c Sat Feb 2 16:06:48 2002 @@ -151,9 +151,9 @@ { 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(task_uid(current)), ruid)) && + !(retval = put_user(high2lowuid(task_euid(current)), euid))) + retval = put_user(high2lowuid(task_suid(current)), suid); return retval; } @@ -168,9 +168,9 @@ { 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(task_gid(current)), rgid)) && + !(retval = put_user(high2lowgid(task_egid(current)), egid))) + retval = put_user(high2lowgid(task_sgid(current)), sgid); return retval; } @@ -188,19 +188,20 @@ asmlinkage long sys32_getgroups16(int gidsetsize, u16 *grouplist) { u16 groups[NGROUPS]; - int i,j; + int i = 0; if (gidsetsize < 0) return -EINVAL; - i = current->ngroups; if (gidsetsize) { + i = task_getgroups16(current, NGROUPS, groups); + if (i <= 0) + goto out; if (i > gidsetsize) return -EINVAL; - for(j=0;jgroups[j]; if (copy_to_user(grouplist, groups, sizeof(u16)*i)) return -EFAULT; } +out: return i; } @@ -215,30 +216,27 @@ return -EINVAL; if (copy_from_user(groups, grouplist, gidsetsize * sizeof(u16))) return -EFAULT; - for (i = 0 ; i < gidsetsize ; i++) - current->groups[i] = (gid_t)groups[i]; - current->ngroups = gidsetsize; - return 0; + return task_setgroups16(current, gidsetsize, tmp); } asmlinkage long sys32_getuid16(void) { - return high2lowuid(current->uid); + return high2lowuid(task_uid(current)); } asmlinkage long sys32_geteuid16(void) { - return high2lowuid(current->euid); + return high2lowuid(task_euid(current)); } asmlinkage long sys32_getgid16(void) { - return high2lowgid(current->gid); + return high2lowgid(task_gid(current)); } asmlinkage long sys32_getegid16(void) { - return high2lowgid(current->egid); + return high2lowgid(task_egid(current)); } /* 32-bit timeval and related flotsam. */ diff -u --recursive --new-file linux-2.5.3/arch/s390x/kernel/signal.c linux-2.5.3-fixup_cred/arch/s390x/kernel/signal.c --- linux-2.5.3/arch/s390x/kernel/signal.c Thu Oct 11 18:04:57 2001 +++ linux-2.5.3-fixup_cred/arch/s390x/kernel/signal.c Sat Feb 2 16:06:01 2002 @@ -514,7 +514,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/s390x/kernel/signal32.c linux-2.5.3-fixup_cred/arch/s390x/kernel/signal32.c --- linux-2.5.3/arch/s390x/kernel/signal32.c Thu Oct 11 18:04:57 2001 +++ linux-2.5.3-fixup_cred/arch/s390x/kernel/signal32.c Sat Feb 2 16:06:01 2002 @@ -647,7 +647,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/sh/kernel/signal.c linux-2.5.3-fixup_cred/arch/sh/kernel/signal.c --- linux-2.5.3/arch/sh/kernel/signal.c Thu Jan 24 21:08:15 2002 +++ linux-2.5.3-fixup_cred/arch/sh/kernel/signal.c Sat Feb 2 16:05:59 2002 @@ -621,7 +621,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/sparc/kernel/signal.c linux-2.5.3-fixup_cred/arch/sparc/kernel/signal.c --- linux-2.5.3/arch/sparc/kernel/signal.c Mon Jan 14 19:10:44 2002 +++ linux-2.5.3-fixup_cred/arch/sparc/kernel/signal.c Sat Feb 2 16:05:57 2002 @@ -1196,7 +1196,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/sparc64/kernel/signal.c linux-2.5.3-fixup_cred/arch/sparc64/kernel/signal.c --- linux-2.5.3/arch/sparc64/kernel/signal.c Mon Jan 14 19:10:44 2002 +++ linux-2.5.3-fixup_cred/arch/sparc64/kernel/signal.c Sat Feb 2 16:05:59 2002 @@ -729,7 +729,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/sparc64/kernel/signal32.c linux-2.5.3-fixup_cred/arch/sparc64/kernel/signal32.c --- linux-2.5.3/arch/sparc64/kernel/signal32.c Mon Jan 14 19:10:44 2002 +++ linux-2.5.3-fixup_cred/arch/sparc64/kernel/signal32.c Sat Feb 2 16:05:58 2002 @@ -1390,7 +1390,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + info.si_uid = task_uid(current->p_pptr); } /* If the (new) signal is now blocked, requeue it. */ diff -u --recursive --new-file linux-2.5.3/arch/sparc64/kernel/sys_sparc32.c linux-2.5.3-fixup_cred/arch/sparc64/kernel/sys_sparc32.c --- linux-2.5.3/arch/sparc64/kernel/sys_sparc32.c Sun Oct 21 19:36:54 2001 +++ linux-2.5.3-fixup_cred/arch/sparc64/kernel/sys_sparc32.c Sat Feb 2 16:06:48 2002 @@ -167,9 +167,9 @@ { 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(task_uid(current)), ruid)) && + !(retval = put_user(high2lowuid(task_euid(current)), euid))) + retval = put_user(high2lowuid(task_suid(current)), suid); return retval; } @@ -184,9 +184,9 @@ { 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(task_gid(current)), rgid)) && + !(retval = put_user(high2lowgid(task_egid(current)), egid))) + retval = put_user(high2lowgid(task_sgid(current)), sgid); return retval; } @@ -204,26 +204,26 @@ asmlinkage long sys32_getgroups16(int gidsetsize, u16 *grouplist) { u16 groups[NGROUPS]; - int i,j; + int i = 0; if (gidsetsize < 0) return -EINVAL; - i = current->ngroups; if (gidsetsize) { + i = task_getgroups16(current, NGROUPS, groups); + if (i <= 0) + goto out; if (i > gidsetsize) return -EINVAL; - for(j=0;jgroups[j]; if (copy_to_user(grouplist, groups, sizeof(u16)*i)) return -EFAULT; } +out: return i; } asmlinkage long sys32_setgroups16(int gidsetsize, u16 *grouplist) { u16 groups[NGROUPS]; - int i; if (!capable(CAP_SETGID)) return -EPERM; @@ -231,30 +231,27 @@ return -EINVAL; if (copy_from_user(groups, grouplist, gidsetsize * sizeof(u16))) return -EFAULT; - for (i = 0 ; i < gidsetsize ; i++) - current->groups[i] = (gid_t)groups[i]; - current->ngroups = gidsetsize; - return 0; + return task_setgroups16(current, gidsetsize, groups); } asmlinkage long sys32_getuid16(void) { - return high2lowuid(current->uid); + return high2lowuid(task_uid(current)); } asmlinkage long sys32_geteuid16(void) { - return high2lowuid(current->euid); + return high2lowuid(task_euid(current)); } asmlinkage long sys32_getgid16(void) { - return high2lowgid(current->gid); + return high2lowgid(task_gid(current)); } asmlinkage long sys32_getegid16(void) { - return high2lowgid(current->egid); + return high2lowgid(task_egid(current)); } /* 32-bit timeval and related flotsam. */ diff -u --recursive --new-file linux-2.5.3/drivers/block/loop.c linux-2.5.3-fixup_cred/drivers/block/loop.c --- linux-2.5.3/drivers/block/loop.c Thu Jan 24 17:31:39 2002 +++ linux-2.5.3-fixup_cred/drivers/block/loop.c Sat Feb 2 16:05:54 2002 @@ -744,7 +744,7 @@ int err; unsigned int type; - if (lo->lo_encrypt_key_size && lo->lo_key_owner != current->uid && + if (lo->lo_encrypt_key_size && lo->lo_key_owner != task_uid(current) && !capable(CAP_SYS_ADMIN)) return -EPERM; if (lo->lo_state != Lo_bound) @@ -775,7 +775,7 @@ 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 = task_uid(current); } figure_loop_size(lo); return 0; diff -u --recursive --new-file linux-2.5.3/drivers/char/agp/agpgart_fe.c linux-2.5.3-fixup_cred/drivers/char/agp/agpgart_fe.c --- linux-2.5.3/drivers/char/agp/agpgart_fe.c Tue Jan 15 19:56:35 2002 +++ linux-2.5.3-fixup_cred/drivers/char/agp/agpgart_fe.c Sat Feb 2 16:05:55 2002 @@ -712,7 +712,7 @@ set_bit(AGP_FF_ALLOW_CLIENT, &priv->access_flags); priv->my_pid = current->pid; - if ((current->uid == 0) || (current->suid == 0)) { + if ((task_uid(current) == 0) || (task_suid(current) == 0)) { /* Root priv, can be controller */ set_bit(AGP_FF_ALLOW_CONTROLLER, &priv->access_flags); } diff -u --recursive --new-file linux-2.5.3/drivers/char/drm/drm_fops.h linux-2.5.3-fixup_cred/drivers/char/drm/drm_fops.h --- linux-2.5.3/drivers/char/drm/drm_fops.h Wed Jan 30 06:41:57 2002 +++ linux-2.5.3-fixup_cred/drivers/char/drm/drm_fops.h Sat Feb 2 16:05:54 2002 @@ -51,7 +51,7 @@ memset(priv, 0, sizeof(*priv)); filp->private_data = priv; - priv->uid = current->euid; + priv->uid = task_euid(current); priv->pid = current->pid; priv->minor = minor; priv->dev = dev; diff -u --recursive --new-file linux-2.5.3/drivers/char/tty_io.c linux-2.5.3-fixup_cred/drivers/char/tty_io.c --- linux-2.5.3/drivers/char/tty_io.c Tue Jan 15 22:53:51 2002 +++ linux-2.5.3-fixup_cred/drivers/char/tty_io.c Sat Feb 2 16:05:54 2002 @@ -1454,8 +1454,8 @@ tty->minimum_to_wake = 1; if (filp->f_owner.pid == 0) { filp->f_owner.pid = (-tty->pgrp) ? : current->pid; - filp->f_owner.uid = current->uid; - filp->f_owner.euid = current->euid; + filp->f_owner.uid = task_uid(current); + filp->f_owner.euid = task_euid(current); } } else { if (!tty->fasync && !waitqueue_active(&tty->read_wait)) diff -u --recursive --new-file linux-2.5.3/drivers/hotplug/pci_hotplug_core.c linux-2.5.3-fixup_cred/drivers/hotplug/pci_hotplug_core.c --- linux-2.5.3/drivers/hotplug/pci_hotplug_core.c Wed Nov 21 18:59:11 2001 +++ linux-2.5.3-fixup_cred/drivers/hotplug/pci_hotplug_core.c Sat Feb 2 16:05:56 2002 @@ -106,8 +106,8 @@ if (inode) { inode->i_mode = mode; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = task_fsuid(current); + inode->i_gid = task_fsgid(current); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_rdev = NODEV; diff -u --recursive --new-file linux-2.5.3/drivers/isdn/avmb1/capifs.c linux-2.5.3-fixup_cred/drivers/isdn/avmb1/capifs.c --- linux-2.5.3/drivers/isdn/avmb1/capifs.c Thu Jan 3 21:20:10 2002 +++ linux-2.5.3-fixup_cred/drivers/isdn/avmb1/capifs.c Sat Feb 2 16:05:55 2002 @@ -426,8 +426,8 @@ if ((np->inode = capifs_new_inode(sb)) != NULL) { struct inode *inode = np->inode; - inode->i_uid = sbi->setuid ? sbi->uid : current->fsuid; - inode->i_gid = sbi->setgid ? sbi->gid : current->fsgid; + inode->i_uid = sbi->setuid ? sbi->uid : task_fsuid(current); + inode->i_gid = sbi->setgid ? sbi->gid : task_fsgid(current); inode->i_nlink = 1; inode->i_ino = ino + 2; init_special_inode(inode, sbi->mode|S_IFCHR, kdev_t_to_nr(np->kdev)); diff -u --recursive --new-file linux-2.5.3/drivers/isdn/hysdn/hysdn_procconf.c linux-2.5.3-fixup_cred/drivers/isdn/hysdn/hysdn_procconf.c --- linux-2.5.3/drivers/isdn/hysdn/hysdn_procconf.c Sun Sep 30 21:26:06 2001 +++ linux-2.5.3-fixup_cred/drivers/isdn/hysdn/hysdn_procconf.c Sat Feb 2 16:06:48 2002 @@ -265,7 +265,7 @@ } if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL)) hysdn_addlog(card, "config open for uid=%d gid=%d mode=0x%x", - filep->f_uid, filep->f_gid, filep->f_mode); + filep->f_cred->uid, filep->f_cred->gid, filep->f_mode); if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) { /* write only access -> write boot file or conf line */ @@ -350,7 +350,7 @@ } if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL)) hysdn_addlog(card, "config close for uid=%d gid=%d mode=0x%x", - filep->f_uid, filep->f_gid, filep->f_mode); + filep->f_cred->uid, filep->f_cred->gid, filep->f_mode); if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) { /* write only access -> write boot file or conf line */ diff -u --recursive --new-file linux-2.5.3/drivers/media/video/cpia.c linux-2.5.3-fixup_cred/drivers/media/video/cpia.c --- linux-2.5.3/drivers/media/video/cpia.c Tue Jan 15 22:53:51 2002 +++ linux-2.5.3-fixup_cred/drivers/media/video/cpia.c Sat Feb 2 16:05:55 2002 @@ -2494,7 +2494,7 @@ /* Set ownership of /proc/cpia/videoX to current user */ if(cam->proc_entry) - cam->proc_entry->uid = current->uid; + cam->proc_entry->uid = task_uid(current); /* set mark for loading first frame uncompressed */ cam->first_frame = 1; diff -u --recursive --new-file linux-2.5.3/drivers/net/tun.c linux-2.5.3-fixup_cred/drivers/net/tun.c --- linux-2.5.3/drivers/net/tun.c Sun Sep 30 21:26:07 2001 +++ linux-2.5.3-fixup_cred/drivers/net/tun.c Sat Feb 2 16:05:53 2002 @@ -343,7 +343,7 @@ /* Check permissions */ if (tun->owner != -1) - if (current->euid != tun->owner && !capable(CAP_NET_ADMIN)) + if (task_euid(current) != tun->owner && !capable(CAP_NET_ADMIN)) return -EPERM; } else { char *name; @@ -495,8 +495,8 @@ tun->flags |= TUN_FASYNC; if (!file->f_owner.pid) { file->f_owner.pid = current->pid; - file->f_owner.uid = current->uid; - file->f_owner.euid = current->euid; + file->f_owner.uid = task_uid(current); + file->f_owner.euid = task_euid(current); } } else tun->flags &= ~TUN_FASYNC; diff -u --recursive --new-file linux-2.5.3/drivers/net/wan/sbni.c linux-2.5.3-fixup_cred/drivers/net/wan/sbni.c --- linux-2.5.3/drivers/net/wan/sbni.c Fri Sep 14 23:40:00 2001 +++ linux-2.5.3-fixup_cred/drivers/net/wan/sbni.c Sat Feb 2 16:05:53 2002 @@ -1302,7 +1302,7 @@ break; case SIOCDEVRESINSTATS : - if( current->euid != 0 ) /* root only */ + if( task_euid(current) != 0 ) /* root only */ return -EPERM; memset( &nl->in_stats, 0, sizeof(struct sbni_in_stats) ); break; @@ -1321,7 +1321,7 @@ break; case SIOCDEVSHWSTATE : - if( current->euid != 0 ) /* root only */ + if( task_euid(current) != 0 ) /* root only */ return -EPERM; spin_lock( &nl->lock ); @@ -1342,7 +1342,7 @@ #ifdef CONFIG_SBNI_MULTILINE case SIOCDEVENSLAVE : - if( current->euid != 0 ) /* root only */ + if( task_euid(current) != 0 ) /* root only */ return -EPERM; if( (error = verify_area( VERIFY_READ, ifr->ifr_data, @@ -1360,7 +1360,7 @@ return enslave( dev, slave_dev ); case SIOCDEVEMANSIPATE : - if( current->euid != 0 ) /* root only */ + if( task_euid(current) != 0 ) /* root only */ return -EPERM; return emancipate( dev ); diff -u --recursive --new-file linux-2.5.3/drivers/usb/inode.c linux-2.5.3-fixup_cred/drivers/usb/inode.c --- linux-2.5.3/drivers/usb/inode.c Thu Jan 24 00:33:46 2002 +++ linux-2.5.3-fixup_cred/drivers/usb/inode.c Sat Feb 2 16:05:55 2002 @@ -161,8 +161,8 @@ if (inode) { inode->i_mode = mode; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = task_fsuid(current); + inode->i_gid = task_fsgid(current); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_rdev = NODEV; diff -u --recursive --new-file linux-2.5.3/fs/affs/inode.c linux-2.5.3-fixup_cred/fs/affs/inode.c --- linux-2.5.3/fs/affs/inode.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/fs/affs/inode.c Sat Feb 2 16:05:41 2002 @@ -321,8 +321,8 @@ mark_buffer_dirty_inode(bh, inode); affs_brelse(bh); - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = task_fsuid(current); + inode->i_gid = task_fsgid(current); inode->i_ino = block; inode->i_nlink = 1; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; diff -u --recursive --new-file linux-2.5.3/fs/affs/super.c linux-2.5.3-fixup_cred/fs/affs/super.c --- linux-2.5.3/fs/affs/super.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/fs/affs/super.c Sat Feb 2 16:05:41 2002 @@ -146,8 +146,8 @@ /* Fill in defaults */ - *uid = current->uid; - *gid = current->gid; + *uid = task_uid(current); + *gid = task_gid(current); *reserved = 2; *root = -1; *blocksize = -1; diff -u --recursive --new-file linux-2.5.3/fs/attr.c linux-2.5.3-fixup_cred/fs/attr.c --- linux-2.5.3/fs/attr.c Thu Oct 11 18:43:30 2001 +++ linux-2.5.3-fixup_cred/fs/attr.c Sat Feb 2 16:05:42 2002 @@ -27,7 +27,7 @@ /* Make sure a caller can chown. */ if ((ia_valid & ATTR_UID) && - (current->fsuid != inode->i_uid || + (task_fsuid(current) != inode->i_uid || attr->ia_uid != inode->i_uid) && !capable(CAP_CHOWN)) goto error; @@ -39,7 +39,7 @@ /* Make sure a caller can chmod. */ if (ia_valid & ATTR_MODE) { - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if ((task_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 : @@ -49,7 +49,7 @@ /* 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 (task_fsuid(current) != inode->i_uid && !capable(CAP_FOWNER)) goto error; } fine: diff -u --recursive --new-file linux-2.5.3/fs/autofs/inode.c linux-2.5.3-fixup_cred/fs/autofs/inode.c --- linux-2.5.3/fs/autofs/inode.c Sun Dec 30 02:30:07 2001 +++ linux-2.5.3-fixup_cred/fs/autofs/inode.c Sat Feb 2 16:05:42 2002 @@ -52,8 +52,8 @@ { char *this_char, *value; - *uid = current->uid; - *gid = current->gid; + *uid = task_uid(current); + *gid = task_gid(current); *pgrp = current->pgrp; *minproto = *maxproto = AUTOFS_PROTO_VERSION; diff -u --recursive --new-file linux-2.5.3/fs/autofs4/inode.c linux-2.5.3-fixup_cred/fs/autofs4/inode.c --- linux-2.5.3/fs/autofs4/inode.c Tue Jan 1 03:25:49 2002 +++ linux-2.5.3-fixup_cred/fs/autofs4/inode.c Sat Feb 2 16:05:45 2002 @@ -102,8 +102,8 @@ { char *this_char, *value; - *uid = current->uid; - *gid = current->gid; + *uid = task_uid(current); + *gid = task_gid(current); *pgrp = current->pgrp; *minproto = AUTOFS_MIN_PROTO_VERSION; diff -u --recursive --new-file linux-2.5.3/fs/bfs/dir.c linux-2.5.3-fixup_cred/fs/bfs/dir.c --- linux-2.5.3/fs/bfs/dir.c Mon Jan 28 22:20:44 2002 +++ linux-2.5.3-fixup_cred/fs/bfs/dir.c Sat Feb 2 16:05:44 2002 @@ -89,8 +89,8 @@ } set_bit(ino, s->su_imap); s->su_freei--; - inode->i_uid = current->fsuid; - inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; + inode->i_uid = task_fsuid(current); + inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : task_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 -u --recursive --new-file linux-2.5.3/fs/binfmt_elf.c linux-2.5.3-fixup_cred/fs/binfmt_elf.c --- linux-2.5.3/fs/binfmt_elf.c Mon Jan 7 21:55:16 2002 +++ linux-2.5.3-fixup_cred/fs/binfmt_elf.c Sat Feb 2 16:05:40 2002 @@ -176,10 +176,10 @@ NEW_AUX_ENT( 6, AT_BASE, interp_load_addr); NEW_AUX_ENT( 7, AT_FLAGS, 0); NEW_AUX_ENT( 8, AT_ENTRY, load_bias + exec->e_entry); - NEW_AUX_ENT( 9, AT_UID, (elf_addr_t) current->uid); - NEW_AUX_ENT(10, AT_EUID, (elf_addr_t) current->euid); - NEW_AUX_ENT(11, AT_GID, (elf_addr_t) current->gid); - NEW_AUX_ENT(12, AT_EGID, (elf_addr_t) current->egid); + NEW_AUX_ENT( 9, AT_UID, (elf_addr_t) task_uid(current)); + NEW_AUX_ENT(10, AT_EUID, (elf_addr_t) task_euid(current)); + NEW_AUX_ENT(11, AT_GID, (elf_addr_t) task_gid(current)); + NEW_AUX_ENT(12, AT_EGID, (elf_addr_t) task_egid(current)); #ifdef ARCH_DLINFO /* * ARCH_DLINFO must come last so platform specific code can enforce @@ -1121,8 +1121,8 @@ psinfo.pr_zomb = psinfo.pr_sname == 'Z'; psinfo.pr_nice = current->__nice; psinfo.pr_flag = current->flags; - psinfo.pr_uid = NEW_TO_OLD_UID(current->uid); - psinfo.pr_gid = NEW_TO_OLD_GID(current->gid); + psinfo.pr_uid = NEW_TO_OLD_UID(task_uid(current)); + psinfo.pr_gid = NEW_TO_OLD_GID(task_gid(current)); strncpy(psinfo.pr_fname, current->comm, sizeof(psinfo.pr_fname)); notes[2].name = "CORE"; diff -u --recursive --new-file linux-2.5.3/fs/coda/coda_linux.c linux-2.5.3-fixup_cred/fs/coda/coda_linux.c --- linux-2.5.3/fs/coda/coda_linux.c Sun Dec 30 19:31:51 2001 +++ linux-2.5.3-fixup_cred/fs/coda/coda_linux.c Sat Feb 2 16:05:42 2002 @@ -67,20 +67,20 @@ /* put the current process credentials in the cred */ void coda_load_creds(struct coda_cred *cred) { - cred->cr_uid = (vuid_t) current->uid; - cred->cr_euid = (vuid_t) current->euid; - cred->cr_suid = (vuid_t) current->suid; - cred->cr_fsuid = (vuid_t) current->fsuid; + cred->cr_uid = (vuid_t) task_uid(current); + cred->cr_euid = (vuid_t) task_euid(current); + cred->cr_suid = (vuid_t) task_suid(current); + cred->cr_fsuid = (vuid_t) task_fsuid(current); - cred->cr_groupid = (vgid_t) current->gid; - cred->cr_egid = (vgid_t) current->egid; - cred->cr_sgid = (vgid_t) current->sgid; - cred->cr_fsgid = (vgid_t) current->fsgid; + cred->cr_groupid = (vgid_t) task_gid(current); + cred->cr_egid = (vgid_t) task_egid(current); + cred->cr_sgid = (vgid_t) task_sgid(current); + cred->cr_fsgid = (vgid_t) task_fsgid(current); } int coda_cred_ok(struct coda_cred *cred) { - return(current->fsuid == cred->cr_fsuid); + return(task_fsuid(current) == cred->cr_fsuid); } int coda_cred_eq(struct coda_cred *cred1, struct coda_cred *cred2) diff -u --recursive --new-file linux-2.5.3/fs/devfs/base.c linux-2.5.3-fixup_cred/fs/devfs/base.c --- linux-2.5.3/fs/devfs/base.c Tue Jan 29 19:59:46 2002 +++ linux-2.5.3-fixup_cred/fs/devfs/base.c Sat Feb 2 16:05:45 2002 @@ -1499,8 +1499,8 @@ static void devfsd_notify (struct devfs_entry *de,unsigned short type,int wait) { - if (devfsd_notify_de (de, type, de->mode, current->euid, - current->egid, &fs_info, 0) && wait) + if (devfsd_notify_de (de, type, de->mode, task_euid(current), + task_egid(current), &fs_info, 0) && wait) wait_for_devfsd_finished (&fs_info); } /* End Function devfsd_notify */ @@ -1594,8 +1594,8 @@ de->info = info; if (flags & DEVFS_FL_CURRENT_OWNER) { - de->inode.uid = current->uid; - de->inode.gid = current->gid; + de->inode.uid = task_uid(current); + de->inode.gid = task_gid(current); } else { @@ -2407,7 +2407,7 @@ buf->u.name = name; WRITE_ENTRY_MAGIC (buf, MAGIC_VALUE); if ( !devfsd_notify_de (buf, DEVFSD_NOTIFY_LOOKUP, 0, - current->euid, current->egid, fs_info, 0) ) + task_euid(current), task_egid(current), fs_info, 0) ) return -ENOENT; /* Possible success: event has been queued */ return 0; @@ -2760,12 +2760,12 @@ { /* Change the ownership/protection to what driver specified */ inode->i_mode = de->mode; - inode->i_uid = current->euid; - inode->i_gid = current->egid; + inode->i_uid = task_euid(current); + inode->i_gid = task_egid(current); } if ( df->aopen_notify && !is_devfsd_or_child (fs_info) ) devfsd_notify_de (de, DEVFSD_NOTIFY_ASYNC_OPEN, inode->i_mode, - current->euid, current->egid, fs_info, 0); + task_euid(current), task_egid(current), fs_info, 0); return 0; } /* End Function devfs_open */ @@ -2864,7 +2864,7 @@ de->u.fcb.open = FALSE; if (de->u.fcb.aopen_notify) devfsd_notify_de (de, DEVFSD_NOTIFY_CLOSE, inode->i_mode, - current->euid, current->egid, fs_info, 1); + task_euid(current), task_egid(current), fs_info, 1); if (!de->u.fcb.auto_owner) return 0; /* Change the ownership/protection back */ inode->i_mode = (de->mode & S_IFMT) | S_IRUGO | S_IWUGO; @@ -3057,8 +3057,8 @@ dentry->d_name.name, err); if (err < 0) return err; de->vfs_deletable = TRUE; - de->inode.uid = current->euid; - de->inode.gid = current->egid; + de->inode.uid = task_euid(current); + de->inode.gid = task_egid(current); de->inode.atime = CURRENT_TIME; de->inode.mtime = CURRENT_TIME; de->inode.ctime = CURRENT_TIME; @@ -3088,8 +3088,8 @@ de->vfs_deletable = TRUE; if ( ( err = _devfs_append_entry (parent, de, FALSE, NULL) ) != 0 ) return err; - de->inode.uid = current->euid; - de->inode.gid = current->egid; + de->inode.uid = task_euid(current); + de->inode.gid = task_egid(current); de->inode.atime = CURRENT_TIME; de->inode.mtime = CURRENT_TIME; de->inode.ctime = CURRENT_TIME; @@ -3157,8 +3157,8 @@ } if ( ( err = _devfs_append_entry (parent, de, FALSE, NULL) ) != 0 ) return err; - de->inode.uid = current->euid; - de->inode.gid = current->egid; + de->inode.uid = task_euid(current); + de->inode.gid = task_egid(current); de->inode.atime = CURRENT_TIME; de->inode.mtime = CURRENT_TIME; de->inode.ctime = CURRENT_TIME; diff -u --recursive --new-file linux-2.5.3/fs/devpts/inode.c linux-2.5.3-fixup_cred/fs/devpts/inode.c --- linux-2.5.3/fs/devpts/inode.c Sat Jan 19 01:00:26 2002 +++ linux-2.5.3-fixup_cred/fs/devpts/inode.c Sat Feb 2 16:05:43 2002 @@ -195,8 +195,8 @@ inode->i_ino = number+2; inode->i_blocks = 0; inode->i_blksize = 1024; - inode->i_uid = sbi->setuid ? sbi->uid : current->fsuid; - inode->i_gid = sbi->setgid ? sbi->gid : current->fsgid; + inode->i_uid = sbi->setuid ? sbi->uid : task_fsuid(current); + inode->i_gid = sbi->setgid ? sbi->gid : task_fsgid(current); inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; init_special_inode(inode, S_IFCHR|sbi->mode, kdev_t_to_nr(device)); diff -u --recursive --new-file linux-2.5.3/fs/dnotify.c linux-2.5.3-fixup_cred/fs/dnotify.c --- linux-2.5.3/fs/dnotify.c Wed Nov 8 08:27:57 2000 +++ linux-2.5.3-fixup_cred/fs/dnotify.c Sat Feb 2 16:05:46 2002 @@ -76,8 +76,8 @@ if (turning_off) goto out; filp->f_owner.pid = current->pid; - filp->f_owner.uid = current->uid; - filp->f_owner.euid = current->euid; + filp->f_owner.uid = task_uid(current); + filp->f_owner.euid = task_euid(current); dn->dn_magic = DNOTIFY_MAGIC; dn->dn_mask = arg; dn->dn_fd = fd; diff -u --recursive --new-file linux-2.5.3/fs/dquot.c linux-2.5.3-fixup_cred/fs/dquot.c --- linux-2.5.3/fs/dquot.c Thu Jan 3 21:20:18 2002 +++ linux-2.5.3-fixup_cred/fs/dquot.c Sat Feb 2 16:05:39 2002 @@ -689,7 +689,7 @@ { switch (dquot->dq_type) { case USRQUOTA: - return current->fsuid == dquot->dq_id && !(dquot->dq_flags & flag); + return task_fsuid(current) == dquot->dq_id && !(dquot->dq_flags & flag); case GRPQUOTA: return in_group_p(dquot->dq_id) && !(dquot->dq_flags & flag); } @@ -1417,7 +1417,7 @@ case Q_GETSTATS: break; case Q_GETQUOTA: - if (((type == USRQUOTA && current->euid != id) || + if (((type == USRQUOTA && task_euid(current) != id) || (type == GRPQUOTA && !in_egroup_p(id))) && !capable(CAP_SYS_ADMIN)) goto out; diff -u --recursive --new-file linux-2.5.3/fs/driverfs/inode.c linux-2.5.3-fixup_cred/fs/driverfs/inode.c --- linux-2.5.3/fs/driverfs/inode.c Tue Jan 29 01:57:27 2002 +++ linux-2.5.3-fixup_cred/fs/driverfs/inode.c Sat Feb 2 16:05:48 2002 @@ -79,8 +79,8 @@ if (inode) { inode->i_mode = mode; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = task_fsuid(current); + inode->i_gid = task_fsgid(current); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_rdev = NODEV; diff -u --recursive --new-file linux-2.5.3/fs/exec.c linux-2.5.3-fixup_cred/fs/exec.c --- linux-2.5.3/fs/exec.c Sun Dec 30 19:51:45 2001 +++ linux-2.5.3-fixup_cred/fs/exec.c Sat Feb 2 16:58:19 2002 @@ -552,7 +552,7 @@ current->sas_ss_sp = current->sas_ss_size = 0; - if (current->euid == current->uid && current->egid == current->gid) + if (task_euid(current) == task_uid(current) && task_egid(current) == task_gid(current)) current->mm->dumpable = 1; name = bprm->filename; for (i=0; (ch = *(name++)) != '\0';) { @@ -568,7 +568,7 @@ de_thread(current); - if (bprm->e_uid != current->euid || bprm->e_gid != current->egid || + if (bprm->e_uid != task_euid(current) || bprm->e_gid != task_egid(current) || permission(bprm->file->f_dentry->d_inode,MAY_READ)) current->mm->dumpable = 0; @@ -621,8 +621,8 @@ if (bprm->file->f_op == NULL) return -EACCES; - bprm->e_uid = current->euid; - bprm->e_gid = current->egid; + bprm->e_uid = task_euid(current); + bprm->e_gid = task_egid(current); if(!(bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)) { /* Set-uid? */ @@ -653,7 +653,7 @@ */ if (!issecure(SECURE_NOROOT)) { - if (bprm->e_uid == 0 || current->uid == 0) { + if (bprm->e_uid == 0 || task_uid(current) == 0) { cap_set_full(bprm->cap_inheritable); cap_set_full(bprm->cap_permitted); } @@ -682,6 +682,7 @@ void compute_creds(struct linux_binprm *bprm) { + struct pcred *pcred = current->pcred; kernel_cap_t new_permitted, working; int do_unlock = 0; @@ -690,7 +691,7 @@ current->cap_inheritable); new_permitted = cap_combine(new_permitted, working); - if (bprm->e_uid != current->uid || bprm->e_gid != current->gid || + if (bprm->e_uid != task_uid(current) || bprm->e_gid != task_gid(current) || !cap_issubset(new_permitted, current->cap_permitted)) { current->mm->dumpable = 0; @@ -700,8 +701,8 @@ || atomic_read(¤t->files->count) > 1 || atomic_read(¤t->sig->count) > 1) { if(!capable(CAP_SETUID)) { - bprm->e_uid = current->uid; - bprm->e_gid = current->gid; + bprm->e_uid = task_uid(current); + bprm->e_gid = task_gid(current); } if(!capable(CAP_SETPCAP)) { new_permitted = cap_intersect(new_permitted, @@ -723,8 +724,17 @@ /* AUD: Audit candidate if current->cap_effective is set */ - current->suid = current->euid = current->fsuid = bprm->e_uid; - current->sgid = current->egid = current->fsgid = bprm->e_gid; + pcred->euid = pcred->suid = bprm->e_uid; + pcred->egid = pcred->sgid = bprm->e_gid; + if (pcred->ucred->uid != bprm->e_uid || pcred->ucred->gid != bprm->e_gid) { + struct ucred *ucred = ucred_clone(pcred->ucred, GFP_KERNEL); + if (ucred) { + ucred->uid = bprm->e_uid; + ucred->gid = bprm->e_gid; + pcred_setucred(pcred, ucred); + put_ucred(pcred->ucred); + } + } if(do_unlock) unlock_kernel(); diff -u --recursive --new-file linux-2.5.3/fs/ext2/balloc.c linux-2.5.3-fixup_cred/fs/ext2/balloc.c --- linux-2.5.3/fs/ext2/balloc.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/fs/ext2/balloc.c Sat Feb 2 16:05:39 2002 @@ -294,7 +294,7 @@ lock_super (sb); es = sb->u.ext2_sb.s_es; if (le32_to_cpu(es->s_free_blocks_count) <= le32_to_cpu(es->s_r_blocks_count) && - ((sb->u.ext2_sb.s_resuid != current->fsuid) && + ((sb->u.ext2_sb.s_resuid != task_fsuid(current)) && (sb->u.ext2_sb.s_resgid == 0 || !in_group_p (sb->u.ext2_sb.s_resgid)) && !capable(CAP_SYS_RESOURCE))) diff -u --recursive --new-file linux-2.5.3/fs/ext2/ialloc.c linux-2.5.3-fixup_cred/fs/ext2/ialloc.c --- linux-2.5.3/fs/ext2/ialloc.c Mon Jan 28 22:20:38 2002 +++ linux-2.5.3-fixup_cred/fs/ext2/ialloc.c Sat Feb 2 16:05:39 2002 @@ -371,7 +371,7 @@ cpu_to_le32(le32_to_cpu(es->s_free_inodes_count) - 1); mark_buffer_dirty(sb->u.ext2_sb.s_sbh); sb->s_dirt = 1; - inode->i_uid = current->fsuid; + inode->i_uid = task_fsuid(current); if (test_opt (sb, GRPID)) inode->i_gid = dir->i_gid; else if (dir->i_mode & S_ISGID) { @@ -379,7 +379,7 @@ if (S_ISDIR(mode)) mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = task_fsgid(current); inode->i_mode = mode; inode->i_ino = ino; diff -u --recursive --new-file linux-2.5.3/fs/ext2/ioctl.c linux-2.5.3-fixup_cred/fs/ext2/ioctl.c --- linux-2.5.3/fs/ext2/ioctl.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/fs/ext2/ioctl.c Sat Feb 2 16:05:39 2002 @@ -30,7 +30,7 @@ if (IS_RDONLY(inode)) return -EROFS; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if ((task_fsuid(current) != inode->i_uid) && !capable(CAP_FOWNER)) return -EPERM; if (get_user(flags, (int *) arg)) @@ -76,7 +76,7 @@ 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 ((task_fsuid(current) != inode->i_uid) && !capable(CAP_FOWNER)) return -EPERM; if (IS_RDONLY(inode)) return -EROFS; diff -u --recursive --new-file linux-2.5.3/fs/ext3/balloc.c linux-2.5.3-fixup_cred/fs/ext3/balloc.c --- linux-2.5.3/fs/ext3/balloc.c Sun Dec 16 21:23:00 2001 +++ linux-2.5.3-fixup_cred/fs/ext3/balloc.c Sat Feb 2 16:05:48 2002 @@ -567,7 +567,7 @@ es = sb->u.ext3_sb.s_es; if (le32_to_cpu(es->s_free_blocks_count) <= le32_to_cpu(es->s_r_blocks_count) && - ((sb->u.ext3_sb.s_resuid != current->fsuid) && + ((sb->u.ext3_sb.s_resuid != task_fsuid(current)) && (sb->u.ext3_sb.s_resgid == 0 || !in_group_p (sb->u.ext3_sb.s_resgid)) && !capable(CAP_SYS_RESOURCE))) diff -u --recursive --new-file linux-2.5.3/fs/ext3/ialloc.c linux-2.5.3-fixup_cred/fs/ext3/ialloc.c --- linux-2.5.3/fs/ext3/ialloc.c Tue Jan 29 07:49:27 2002 +++ linux-2.5.3-fixup_cred/fs/ext3/ialloc.c Sat Feb 2 16:05:48 2002 @@ -464,7 +464,7 @@ sb->s_dirt = 1; if (err) goto fail; - inode->i_uid = current->fsuid; + inode->i_uid = task_fsuid(current); if (test_opt (sb, GRPID)) inode->i_gid = dir->i_gid; else if (dir->i_mode & S_ISGID) { @@ -472,7 +472,7 @@ if (S_ISDIR(mode)) mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = task_fsgid(current); inode->i_mode = mode; inode->i_ino = j; diff -u --recursive --new-file linux-2.5.3/fs/ext3/ioctl.c linux-2.5.3-fixup_cred/fs/ext3/ioctl.c --- linux-2.5.3/fs/ext3/ioctl.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/fs/ext3/ioctl.c Sat Feb 2 16:05:48 2002 @@ -37,7 +37,7 @@ if (IS_RDONLY(inode)) return -EROFS; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if ((task_fsuid(current) != inode->i_uid) && !capable(CAP_FOWNER)) return -EPERM; if (get_user(flags, (int *) arg)) @@ -120,7 +120,7 @@ __u32 generation; int err; - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + if ((task_fsuid(current) != inode->i_uid) && !capable(CAP_FOWNER)) return -EPERM; if (IS_RDONLY(inode)) return -EROFS; diff -u --recursive --new-file linux-2.5.3/fs/fat/inode.c linux-2.5.3-fixup_cred/fs/fat/inode.c --- linux-2.5.3/fs/fat/inode.c Mon Jan 28 22:20:44 2002 +++ linux-2.5.3-fixup_cred/fs/fat/inode.c Sat Feb 2 16:05:41 2002 @@ -208,8 +208,8 @@ opts->name_check = 'n'; opts->conversion = 'b'; - opts->fs_uid = current->uid; - opts->fs_gid = current->gid; + opts->fs_uid = task_uid(current); + opts->fs_gid = task_gid(current); opts->fs_umask = current->fs->umask; opts->quiet = opts->sys_immutable = opts->dotsOK = opts->showexec = 0; opts->codepage = 0; diff -u --recursive --new-file linux-2.5.3/fs/fcntl.c linux-2.5.3-fixup_cred/fs/fcntl.c --- linux-2.5.3/fs/fcntl.c Tue Jan 15 20:07:01 2002 +++ linux-2.5.3-fixup_cred/fs/fcntl.c Sat Feb 2 16:06:48 2002 @@ -315,8 +315,8 @@ case F_SETOWN: lock_kernel(); filp->f_owner.pid = arg; - filp->f_owner.uid = current->uid; - filp->f_owner.euid = current->euid; + filp->f_owner.uid = task_uid(current); + filp->f_owner.euid = task_euid(current); err = 0; if (S_ISSOCK (filp->f_dentry->d_inode->i_mode)) err = sock_fcntl (filp, F_SETOWN, arg); @@ -417,8 +417,8 @@ int reason) { if ((fown->euid != 0) && - (fown->euid ^ p->suid) && (fown->euid ^ p->uid) && - (fown->uid ^ p->suid) && (fown->uid ^ p->uid)) + (fown->euid ^ task_suid(p)) && (fown->euid ^ task_uid(p)) && + (fown->uid ^ task_suid(p)) && (fown->uid ^ task_uid(p))) return; switch (fown->signum) { siginfo_t si; diff -u --recursive --new-file linux-2.5.3/fs/file_table.c linux-2.5.3-fixup_cred/fs/file_table.c --- linux-2.5.3/fs/file_table.c Mon Sep 17 22:16:30 2001 +++ linux-2.5.3-fixup_cred/fs/file_table.c Sat Feb 2 16:06:48 2002 @@ -44,8 +44,7 @@ memset(f, 0, sizeof(*f)); atomic_set(&f->f_count,1); f->f_version = ++event; - f->f_uid = current->fsuid; - f->f_gid = current->fsgid; + f->f_cred = task_getucred(current); list_add(&f->f_list, &anon_list); file_list_unlock(); return f; @@ -53,7 +52,7 @@ /* * Use a reserved one if we're the superuser */ - if (files_stat.nr_free_files && !current->euid) + if (files_stat.nr_free_files && !task_euid(current)) goto used_one; /* * Allocate a new one if we're below the limit. @@ -88,15 +87,25 @@ filp->f_mode = mode; atomic_set(&filp->f_count, 1); filp->f_dentry = dentry; - filp->f_uid = current->fsuid; - filp->f_gid = current->fsgid; - filp->f_op = dentry->d_inode->i_fop; + filp->f_cred = task_getucred(current); + filp->f_op = fops_get(dentry->d_inode->i_fop); if (filp->f_op->open) return filp->f_op->open(dentry->d_inode, filp); else return 0; } +int release_private_file(struct inode *inode, struct file *filp) +{ + int res = 0; + + if (filp->f_op && filp->f_op->release) + res = filp->f_op->release(inode, filp); + fops_put(filp->f_op); + put_ucred(filp->f_cred); + return res; +} + void fput(struct file * file) { struct dentry * dentry = file->f_dentry; @@ -114,6 +123,8 @@ fops_put(file->f_op); if (file->f_mode & FMODE_WRITE) put_write_access(inode); + if (file->f_cred) + put_ucred(file->f_cred); file_list_lock(); file->f_dentry = NULL; file->f_vfsmnt = NULL; @@ -144,6 +155,8 @@ void put_filp(struct file *file) { if(atomic_dec_and_test(&file->f_count)) { + if (file->f_cred) + put_ucred(file->f_cred); file_list_lock(); list_del(&file->f_list); list_add(&file->f_list, &free_list); diff -u --recursive --new-file linux-2.5.3/fs/hfs/super.c linux-2.5.3-fixup_cred/fs/hfs/super.c --- linux-2.5.3/fs/hfs/super.c Mon Jan 28 22:20:34 2002 +++ linux-2.5.3-fixup_cred/fs/hfs/super.c Sat Feb 2 16:05:42 2002 @@ -207,8 +207,8 @@ /* 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 = task_uid(current); + hsb->s_gid = task_gid(current); hsb->s_umask = current->fs->umask; hsb->s_type = 0x3f3f3f3f; /* == '????' */ hsb->s_creator = 0x3f3f3f3f; /* == '????' */ diff -u --recursive --new-file linux-2.5.3/fs/hpfs/namei.c linux-2.5.3-fixup_cred/fs/hpfs/namei.c --- linux-2.5.3/fs/hpfs/namei.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/fs/hpfs/namei.c Sat Feb 2 16:05:40 2002 @@ -73,11 +73,11 @@ result->i_ctime = result->i_mtime = result->i_atime = local_to_gmt(dir->i_sb, dee.creation_date); 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 != task_fsuid(current) || + result->i_gid != task_fsgid(current) || result->i_mode != (mode | S_IFDIR)) { - result->i_uid = current->fsuid; - result->i_gid = current->fsgid; + result->i_uid = task_fsuid(current); + result->i_gid = task_fsgid(current); result->i_mode = mode | S_IFDIR; hpfs_write_inode_nolock(result); } @@ -143,11 +143,11 @@ 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 != task_fsuid(current) || + result->i_gid != task_fsgid(current) || result->i_mode != (mode | S_IFREG)) { - result->i_uid = current->fsuid; - result->i_gid = current->fsgid; + result->i_uid = task_fsuid(current); + result->i_gid = task_fsgid(current); result->i_mode = mode | S_IFREG; hpfs_write_inode_nolock(result); } @@ -204,8 +204,8 @@ 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 = task_fsuid(current); + result->i_gid = task_fsgid(current); result->i_nlink = 1; result->i_size = 0; result->i_blocks = 1; @@ -268,8 +268,8 @@ /*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 = task_fsuid(current); + result->i_gid = task_fsgid(current); result->i_blocks = 1; result->i_size = strlen(symlink); result->i_op = &page_symlink_inode_operations; diff -u --recursive --new-file linux-2.5.3/fs/hpfs/super.c linux-2.5.3-fixup_cred/fs/hpfs/super.c --- linux-2.5.3/fs/hpfs/super.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/fs/hpfs/super.c Sat Feb 2 16:05:40 2002 @@ -431,8 +431,8 @@ init_waitqueue_head(&s->s_hpfs_creation_de); init_waitqueue_head(&s->s_hpfs_iget_q); - uid = current->uid; - gid = current->gid; + uid = task_uid(current); + gid = task_gid(current); umask = current->fs->umask; lowercase = 0; conv = CONV_BINARY; diff -u --recursive --new-file linux-2.5.3/fs/intermezzo/dir.c linux-2.5.3-fixup_cred/fs/intermezzo/dir.c --- linux-2.5.3/fs/intermezzo/dir.c Tue Nov 13 18:20:56 2001 +++ linux-2.5.3-fixup_cred/fs/intermezzo/dir.c Sat Feb 2 16:05:46 2002 @@ -141,7 +141,7 @@ inline int presto_can_ilookup(void) { - return (current->euid == presto_ilookup_uid || + return (task_euid(current) == presto_ilookup_uid || capable(CAP_DAC_READ_SEARCH)); } @@ -158,7 +158,7 @@ */ if ( !presto_can_ilookup() ) { CDEBUG(D_CACHE, "ilookup denied: euid %u, ilookup_uid %u\n", - current->euid, presto_ilookup_uid); + task_euid(current), presto_ilookup_uid); EXIT; return ERR_PTR(-EPERM); } diff -u --recursive --new-file linux-2.5.3/fs/intermezzo/file.c linux-2.5.3-fixup_cred/fs/intermezzo/file.c --- linux-2.5.3/fs/intermezzo/file.c Mon Dec 31 01:59:00 2001 +++ linux-2.5.3-fixup_cred/fs/intermezzo/file.c Sat Feb 2 16:06:48 2002 @@ -148,12 +148,10 @@ /* we believe that on open the kernel lock assures that only one process will do this allocation */ fdata->fd_do_lml = 0; - fdata->fd_fsuid = current->fsuid; - fdata->fd_fsgid = current->fsgid; + fdata->fd_fsuid = task_fsuid(current); + fdata->fd_fsgid = task_fsgid(current); fdata->fd_mode = file->f_dentry->d_inode->i_mode; - fdata->fd_ngroups = current->ngroups; - for (i=0 ; ingroups ; i++) - fdata->fd_groups[i] = current->groups[i]; + fdata->fd_ngroups = task_getgroups(current, NGROUPS_MAX, fdata->fd_groups); fdata->fd_bytes_written = 0; /*when open,written data is zero*/ file->private_data = fdata; } else { diff -u --recursive --new-file linux-2.5.3/fs/intermezzo/journal.c linux-2.5.3-fixup_cred/fs/intermezzo/journal.c --- linux-2.5.3/fs/intermezzo/journal.c Mon Dec 31 01:59:00 2001 +++ linux-2.5.3-fixup_cred/fs/intermezzo/journal.c Sat Feb 2 16:06:48 2002 @@ -239,7 +239,7 @@ p.len = cpu_to_le32(rec->size); p.version = PRESTO_KML_MAJOR_VERSION | PRESTO_KML_MINOR_VERSION; p.pid = cpu_to_le32(current->pid); - p.uid = cpu_to_le32(current->uid); + p.uid = cpu_to_le32(task_uid(current)); p.fsuid = cpu_to_le32(fsuid); p.fsgid = cpu_to_le32(fsgid); p.ngroups = cpu_to_le32(ngroups); @@ -255,18 +255,21 @@ static inline char * journal_log_prefix(char *buf, int opcode, struct rec_info *rec) { + int ngroups; + gid_t tmp[NGROUPS_MAX]; __u32 groups[NGROUPS_MAX]; int i; /* convert 16 bit gid's to 32 bit gid's */ - for (i=0; ingroups; i++) - groups[i] = (__u32) current->groups[i]; + ngroups = task_getgroups(current, NGROUPS_MAX, tmp); + for (i=0; ingroups, + (__u32)ngroups, groups, - (__u32)current->fsuid, - (__u32)current->fsgid); + (__u32)task_fsuid(current), + (__u32)task_fsgid(current)); } static inline char * @@ -275,8 +278,8 @@ { return journal_log_prefix_with_groups_and_ids(buf, opcode, rec, ngroups, groups, - (__u32)current->fsuid, - (__u32)current->fsgid); + (__u32)task_fsuid(current), + (__u32)task_fsgid(current)); } static inline char *log_version(char *buf, struct dentry *dentry) @@ -898,7 +901,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + sizeof(*new_file_ver) + sizeof(ino) + sizeof(generation) + sizeof(pathlen) + sizeof(remote_ino) + sizeof(remote_generation) + @@ -1140,7 +1143,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + sizeof(*old_ver) + sizeof(valid) + sizeof(mode) + sizeof(uid) + sizeof(gid) + sizeof(fsize) + sizeof(mtime) + sizeof(ctime) + sizeof(flags) + @@ -1221,7 +1224,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) + sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(pathlen) + sizeof(struct journal_suffix); @@ -1283,7 +1286,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) + sizeof(uid) + sizeof(gid) + sizeof(pathlen) + sizeof(targetlen) + sizeof(struct journal_suffix); @@ -1346,7 +1349,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) + sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(pathlen) + sizeof(struct journal_suffix); @@ -1406,7 +1409,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) + sizeof(pathlen) + sizeof(llen) + sizeof(struct journal_suffix); @@ -1473,7 +1476,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) + sizeof(lmode) + sizeof(uid) + sizeof(gid) + sizeof(lmajor) + sizeof(lminor) + sizeof(pathlen) + @@ -1538,7 +1541,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) + sizeof(srcpathlen) + sizeof(pathlen) + sizeof(struct journal_suffix); @@ -1601,7 +1604,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + 4 * sizeof(*src_dir_ver) + sizeof(srcpathlen) + sizeof(pathlen) + sizeof(struct journal_suffix); @@ -1662,7 +1665,7 @@ 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) * task_ngroups(current) + sizeof(struct journal_prefix) + 3 * sizeof(*tgt_dir_ver) + sizeof(pathlen) + sizeof(llen) + sizeof(struct journal_suffix); @@ -1711,6 +1714,7 @@ __u32 open_fsuid; __u32 open_fsgid; __u32 open_ngroups; + gid_t tmp[NGROUPS_MAX]; __u32 open_groups[NGROUPS_MAX]; __u32 open_mode; __u32 open_uid; @@ -1742,14 +1746,14 @@ 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 = task_getgroups(current, NGROUPS_MAX, tmp); + 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 = task_fsuid(current); + open_fsgid = task_fsgid(current); } BUFF_ALLOC(buffer, NULL); path = presto_path(dentry, root, buffer, PAGE_SIZE); @@ -2012,7 +2016,7 @@ */ mode=cpu_to_le32(dentry->d_inode->i_mode); - size = sizeof(__u32) * current->ngroups + + size = sizeof(__u32) * task_ngroups(current) + sizeof(struct journal_prefix) + 2 * sizeof(struct presto_version) + sizeof(flags) + sizeof(mode) + sizeof(namelen) + diff -u --recursive --new-file linux-2.5.3/fs/intermezzo/kml_reint.c linux-2.5.3-fixup_cred/fs/intermezzo/kml_reint.c --- linux-2.5.3/fs/intermezzo/kml_reint.c Tue Jan 15 23:33:55 2002 +++ linux-2.5.3-fixup_cred/fs/intermezzo/kml_reint.c Sat Feb 2 16:05:47 2002 @@ -27,19 +27,19 @@ static void kmlreint_pre_secure (struct kml_rec *rec) { - if (current->fsuid != current->uid) + if (task_fsuid(current) != task_uid(current)) CDEBUG (D_KML, "reint_kmlreint_pre_secure: cannot setfsuid\n"); - if (current->fsgid != current->gid) + if (task_fsgid(current) != task_gid(current)) CDEBUG (D_KML, "reint_kmlreint_pre_secure: cannot setfsgid\n"); - current->fsuid = rec->rec_head.uid; - current->fsgid = rec->rec_head.fsgid; + task_setfsuid(current, rec->rec_head.uid); + task_setfsgid(current, rec->rec_head.fsgid); } static void kmlreint_post_secure (struct kml_rec *rec) { - current->fsuid = current->uid; - current->fsgid = current->gid; - /* current->egid = current->gid; */ + task_setfsuid(current, task_uid(current)); + task_setfsgid(current, task_gid(current)); + /* task_setegid(current, task_gid(current)); */ /* ????????????? */ } diff -u --recursive --new-file linux-2.5.3/fs/intermezzo/upcall.c linux-2.5.3-fixup_cred/fs/intermezzo/upcall.c --- linux-2.5.3/fs/intermezzo/upcall.c Sun Dec 30 19:31:51 2001 +++ linux-2.5.3-fixup_cred/fs/intermezzo/upcall.c Sat Feb 2 16:05:47 2002 @@ -64,7 +64,7 @@ outp = (union down_args *) (inp);\ inp->uh.opcode = (op);\ inp->uh.pid = current->pid;\ - inp->uh.uid = current->fsuid;\ + inp->uh.uid = task_fsuid(current);\ outsize = insize;\ } while (0) diff -u --recursive --new-file linux-2.5.3/fs/intermezzo/vfs.c linux-2.5.3-fixup_cred/fs/intermezzo/vfs.c --- linux-2.5.3/fs/intermezzo/vfs.c Mon Jan 14 19:10:43 2002 +++ linux-2.5.3-fixup_cred/fs/intermezzo/vfs.c Sat Feb 2 16:05:47 2002 @@ -70,9 +70,9 @@ { if (!(dir->i_mode & S_ISVTX)) return 0; - if (inode->i_uid == current->fsuid) + if (inode->i_uid == task_fsuid(current)) return 0; - if (dir->i_uid == current->fsuid) + if (dir->i_uid == task_fsuid(current)) return 0; return !capable(CAP_FOWNER); } diff -u --recursive --new-file linux-2.5.3/fs/jffs/inode-v23.c linux-2.5.3-fixup_cred/fs/jffs/inode-v23.c --- linux-2.5.3/fs/jffs/inode-v23.c Mon Jan 28 22:20:44 2002 +++ linux-2.5.3-fixup_cred/fs/jffs/inode-v23.c Sat Feb 2 16:05:45 2002 @@ -466,8 +466,8 @@ raw_inode.pino = new_dir_f->ino; /* raw_inode.version = f->highest_version + 1; */ raw_inode.mode = f->mode; - raw_inode.uid = current->fsuid; - raw_inode.gid = current->fsgid; + raw_inode.uid = task_fsuid(current); + raw_inode.gid = task_fsgid(current); #if 0 raw_inode.uid = f->uid; raw_inode.gid = f->gid; @@ -837,9 +837,9 @@ raw_inode.pino = dir_f->ino; raw_inode.version = 1; raw_inode.mode = dir_mode; - raw_inode.uid = current->fsuid; - raw_inode.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; - /* raw_inode.gid = current->fsgid; */ + raw_inode.uid = task_fsuid(current); + raw_inode.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : task_fsgid(current); + /* raw_inode.gid = task_fsgid(current); */ raw_inode.atime = CURRENT_TIME; raw_inode.mtime = raw_inode.atime; raw_inode.ctime = raw_inode.atime; @@ -996,8 +996,8 @@ raw_inode.pino = del_f->pino; /* raw_inode.version = del_f->highest_version + 1; */ raw_inode.mode = del_f->mode; - raw_inode.uid = current->fsuid; - raw_inode.gid = current->fsgid; + raw_inode.uid = task_fsuid(current); + raw_inode.gid = task_fsgid(current); raw_inode.atime = CURRENT_TIME; raw_inode.mtime = del_f->mtime; raw_inode.ctime = raw_inode.atime; @@ -1070,9 +1070,9 @@ raw_inode.pino = dir_f->ino; raw_inode.version = 1; raw_inode.mode = mode; - raw_inode.uid = current->fsuid; - raw_inode.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; - /* raw_inode.gid = current->fsgid; */ + raw_inode.uid = task_fsuid(current); + raw_inode.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : task_fsgid(current); + /* raw_inode.gid = task_fsgid(current); */ raw_inode.atime = CURRENT_TIME; raw_inode.mtime = raw_inode.atime; raw_inode.ctime = raw_inode.atime; @@ -1177,8 +1177,8 @@ raw_inode.pino = dir_f->ino; raw_inode.version = 1; raw_inode.mode = S_IFLNK | S_IRWXUGO; - raw_inode.uid = current->fsuid; - raw_inode.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; + raw_inode.uid = task_fsuid(current); + raw_inode.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : task_fsgid(current); raw_inode.atime = CURRENT_TIME; raw_inode.mtime = raw_inode.atime; raw_inode.ctime = raw_inode.atime; @@ -1275,8 +1275,8 @@ raw_inode.pino = dir_f->ino; raw_inode.version = 1; raw_inode.mode = mode; - raw_inode.uid = current->fsuid; - raw_inode.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; + raw_inode.uid = task_fsuid(current); + raw_inode.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : task_fsgid(current); raw_inode.atime = CURRENT_TIME; raw_inode.mtime = raw_inode.atime; raw_inode.ctime = raw_inode.atime; diff -u --recursive --new-file linux-2.5.3/fs/jffs2/write.c linux-2.5.3-fixup_cred/fs/jffs2/write.c --- linux-2.5.3/fs/jffs2/write.c Mon Jan 28 22:20:44 2002 +++ linux-2.5.3-fixup_cred/fs/jffs2/write.c Sat Feb 2 16:05:46 2002 @@ -93,13 +93,13 @@ ri->hdr_crc = crc32(0, ri, sizeof(struct jffs2_unknown_node)-4); ri->mode = mode; f->highest_version = ri->version = 1; - ri->uid = current->fsuid; + ri->uid = task_fsuid(current); if (dir_i->i_mode & S_ISGID) { ri->gid = dir_i->i_gid; if (S_ISDIR(mode)) ri->mode |= S_ISGID; } else { - ri->gid = current->fsgid; + ri->gid = task_fsgid(current); } inode->i_mode = ri->mode; inode->i_gid = ri->gid; diff -u --recursive --new-file linux-2.5.3/fs/lockd/host.c linux-2.5.3-fixup_cred/fs/lockd/host.c --- linux-2.5.3/fs/lockd/host.c Mon Oct 1 22:45:47 2001 +++ linux-2.5.3-fixup_cred/fs/lockd/host.c Sat Feb 2 16:06:48 2002 @@ -187,14 +187,11 @@ host->h_nextrebind - jiffies); } } else { - uid_t saved_fsuid = current->fsuid; kernel_cap_t saved_cap = current->cap_effective; - /* Create RPC socket as root user so we get a priv port */ - current->fsuid = 0; + /* Raise capability in order to bind to a priv port */ cap_raise (current->cap_effective, CAP_NET_BIND_SERVICE); xprt = xprt_create_proto(host->h_proto, &host->h_addr, NULL); - current->fsuid = saved_fsuid; current->cap_effective = saved_cap; if (xprt == NULL) goto forgetit; diff -u --recursive --new-file linux-2.5.3/fs/locks.c linux-2.5.3-fixup_cred/fs/locks.c --- linux-2.5.3/fs/locks.c Mon Jan 7 21:55:16 2002 +++ linux-2.5.3-fixup_cred/fs/locks.c Sat Feb 2 16:05:37 2002 @@ -1226,7 +1226,7 @@ dentry = filp->f_dentry; inode = dentry->d_inode; - if ((current->fsuid != inode->i_uid) && !capable(CAP_LEASE)) + if ((task_fsuid(current) != inode->i_uid) && !capable(CAP_LEASE)) return -EACCES; if (!S_ISREG(inode->i_mode)) return -EINVAL; @@ -1289,8 +1289,8 @@ *before = fl; list_add(&fl->fl_link, &file_lock_list); filp->f_owner.pid = current->pid; - filp->f_owner.uid = current->uid; - filp->f_owner.euid = current->euid; + filp->f_owner.uid = task_uid(current); + filp->f_owner.euid = task_euid(current); out_unlock: unlock_kernel(); return error; diff -u --recursive --new-file linux-2.5.3/fs/minix/bitmap.c linux-2.5.3-fixup_cred/fs/minix/bitmap.c --- linux-2.5.3/fs/minix/bitmap.c Thu Jan 24 00:32:20 2002 +++ linux-2.5.3-fixup_cred/fs/minix/bitmap.c Sat Feb 2 16:05:37 2002 @@ -256,8 +256,8 @@ unlock_super(sb); return NULL; } - inode->i_uid = current->fsuid; - inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; + inode->i_uid = task_fsuid(current); + inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : task_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 -u --recursive --new-file linux-2.5.3/fs/namei.c linux-2.5.3-fixup_cred/fs/namei.c --- linux-2.5.3/fs/namei.c Tue Jan 15 22:53:51 2002 +++ linux-2.5.3-fixup_cred/fs/namei.c Sat Feb 2 16:05:37 2002 @@ -167,7 +167,7 @@ return -EACCES; } - if (current->fsuid == inode->i_uid) + if (task_fsuid(current) == inode->i_uid) mode >>= 6; else if (in_group_p(inode->i_gid)) mode >>= 3; @@ -846,9 +846,9 @@ { if (!(dir->i_mode & S_ISVTX)) return 0; - if (inode->i_uid == current->fsuid) + if (inode->i_uid == task_fsuid(current)) return 0; - if (dir->i_uid == current->fsuid) + if (dir->i_uid == task_fsuid(current)) return 0; return !capable(CAP_FOWNER); } diff -u --recursive --new-file linux-2.5.3/fs/namespace.c linux-2.5.3-fixup_cred/fs/namespace.c --- linux-2.5.3/fs/namespace.c Thu Jan 24 00:32:20 2002 +++ linux-2.5.3-fixup_cred/fs/namespace.c Sat Feb 2 16:05:46 2002 @@ -408,7 +408,7 @@ if (S_ISLNK(nd->dentry->d_inode->i_mode)) return -EPERM; if (nd->dentry->d_inode->i_mode & S_ISVTX) { - if (current->uid != nd->dentry->d_inode->i_uid) + if (task_uid(current) != nd->dentry->d_inode->i_uid) return -EPERM; } if (permission(nd->dentry->d_inode, MAY_WRITE)) diff -u --recursive --new-file linux-2.5.3/fs/ncpfs/ioctl.c linux-2.5.3-fixup_cred/fs/ncpfs/ioctl.c --- linux-2.5.3/fs/ncpfs/ioctl.c Mon Sep 10 16:31:30 2001 +++ linux-2.5.3-fixup_cred/fs/ncpfs/ioctl.c Sat Feb 2 16:05:41 2002 @@ -41,7 +41,7 @@ case NCP_IOC_NCPREQUEST: if ((permission(inode, MAY_WRITE) != 0) - && (current->uid != server->m.mounted_uid)) { + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } if (copy_from_user(&request, (struct ncp_ioctl_request *) arg, @@ -100,7 +100,7 @@ struct ncp_fs_info info; if ((permission(inode, MAY_WRITE) != 0) - && (current->uid != server->m.mounted_uid)) { + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } if (copy_from_user(&info, (struct ncp_fs_info *) arg, @@ -128,7 +128,7 @@ struct ncp_fs_info_v2 info2; if ((permission(inode, MAY_WRITE) != 0) - && (current->uid != server->m.mounted_uid)) { + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } if (copy_from_user(&info2, (struct ncp_fs_info_v2 *) arg, @@ -156,7 +156,7 @@ unsigned long tmp = server->m.mounted_uid; if ( (permission(inode, MAY_READ) != 0) - && (current->uid != server->m.mounted_uid)) + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -170,7 +170,7 @@ struct ncp_setroot_ioctl sr; if ( (permission(inode, MAY_READ) != 0) - && (current->uid != server->m.mounted_uid)) + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -244,7 +244,7 @@ #ifdef CONFIG_NCPFS_PACKET_SIGNING case NCP_IOC_SIGN_INIT: if ((permission(inode, MAY_WRITE) != 0) - && (current->uid != server->m.mounted_uid)) + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -267,7 +267,7 @@ case NCP_IOC_SIGN_WANTED: if ( (permission(inode, MAY_READ) != 0) - && (current->uid != server->m.mounted_uid)) + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -280,7 +280,7 @@ int newstate; if ( (permission(inode, MAY_WRITE) != 0) - && (current->uid != server->m.mounted_uid)) + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -301,7 +301,7 @@ #ifdef CONFIG_NCPFS_IOCTL_LOCKING case NCP_IOC_LOCKUNLOCK: if ( (permission(inode, MAY_WRITE) != 0) - && (current->uid != server->m.mounted_uid)) + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } @@ -373,7 +373,7 @@ #endif /* CONFIG_NCPFS_IOCTL_LOCKING */ case NCP_IOC_GETOBJECTNAME: - if (current->uid != server->m.mounted_uid) { + if (task_uid(current) != server->m.mounted_uid) { return -EACCES; } { @@ -399,7 +399,7 @@ return 0; } case NCP_IOC_SETOBJECTNAME: - if (current->uid != server->m.mounted_uid) { + if (task_uid(current) != server->m.mounted_uid) { return -EACCES; } { @@ -443,7 +443,7 @@ return 0; } case NCP_IOC_GETPRIVATEDATA: - if (current->uid != server->m.mounted_uid) { + if (task_uid(current) != server->m.mounted_uid) { return -EACCES; } { @@ -467,7 +467,7 @@ return 0; } case NCP_IOC_SETPRIVATEDATA: - if (current->uid != server->m.mounted_uid) { + if (task_uid(current) != server->m.mounted_uid) { return -EACCES; } { @@ -603,7 +603,7 @@ #endif /* CONFIG_NCPFS_NLS */ case NCP_IOC_SETDENTRYTTL: if ((permission(inode, MAY_WRITE) != 0) && - (current->uid != server->m.mounted_uid)) + (task_uid(current) != server->m.mounted_uid)) return -EACCES; { u_int32_t user; @@ -632,7 +632,7 @@ so we have this out of switch */ if (cmd == NCP_IOC_GETMOUNTUID) { if ((permission(inode, MAY_READ) != 0) - && (current->uid != server->m.mounted_uid)) { + && (task_uid(current) != server->m.mounted_uid)) { return -EACCES; } if (put_user(NEW_TO_OLD_UID(server->m.mounted_uid), (__kernel_uid_t *) arg)) diff -u --recursive --new-file linux-2.5.3/fs/nfs/dir.c linux-2.5.3-fixup_cred/fs/nfs/dir.c --- linux-2.5.3/fs/nfs/dir.c Tue Jan 22 00:54:52 2002 +++ linux-2.5.3-fixup_cred/fs/nfs/dir.c Sat Feb 2 16:05:38 2002 @@ -1094,15 +1094,15 @@ * 2) When root squashing may be involved * 3) When ACLs may overturn a negative answer */ if (!capable(CAP_DAC_OVERRIDE) && !capable(CAP_DAC_READ_SEARCH) - && (current->fsuid != 0) && (current->fsgid != 0) + && (task_fsuid(current) != 0) && (task_fsgid(current) != 0) && error != -EACCES) goto out; error = NFS_PROTO(inode)->access(inode, mask, 0); if (error == -EACCES && NFS_CLIENT(inode)->cl_droppriv && - current->uid != 0 && current->gid != 0 && - (current->fsuid != current->uid || current->fsgid != current->gid)) + task_uid(current) != 0 && task_gid(current) != 0 && + (task_fsuid(current) != task_uid(current) || task_fsgid(current) != task_gid(current))) error = NFS_PROTO(inode)->access(inode, mask, 1); out: diff -u --recursive --new-file linux-2.5.3/fs/nfsd/auth.c linux-2.5.3-fixup_cred/fs/nfsd/auth.c --- linux-2.5.3/fs/nfsd/auth.c Mon Jul 24 08:04:10 2000 +++ linux-2.5.3-fixup_cred/fs/nfsd/auth.c Sat Feb 2 16:06:48 2002 @@ -14,6 +14,7 @@ void nfsd_setuser(struct svc_rqst *rqstp, struct svc_export *exp) { + gid_t tmp[NGROUPS]; struct svc_cred *cred = &rqstp->rq_cred; int i; @@ -35,20 +36,20 @@ } if (cred->cr_uid != (uid_t) -1) - current->fsuid = cred->cr_uid; + task_setfsuid(current, cred->cr_uid); else - current->fsuid = exp->ex_anon_uid; + task_setfsuid(current, exp->ex_anon_uid); if (cred->cr_gid != (gid_t) -1) - current->fsgid = cred->cr_gid; + task_setfsgid(current, cred->cr_gid); else - current->fsgid = exp->ex_anon_gid; + task_setfsgid(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; + tmp[i] = group; } - current->ngroups = i; + task_setgroups(current, i, tmp); if ((cred->cr_uid)) { cap_t(current->cap_effective) &= ~CAP_NFSD_MASK; diff -u --recursive --new-file linux-2.5.3/fs/nfsd/nfsfh.c linux-2.5.3-fixup_cred/fs/nfsd/nfsfh.c --- linux-2.5.3/fs/nfsd/nfsfh.c Tue Jan 1 21:32:13 2002 +++ linux-2.5.3-fixup_cred/fs/nfsd/nfsfh.c Sat Feb 2 16:06:48 2002 @@ -113,8 +113,7 @@ } out_close: - if (file.f_op->release) - file.f_op->release(dir, &file); + release_private_file(dir, &file); out: return error; } @@ -682,7 +681,7 @@ if (exp->ex_dentry == tdentry) break; /* executable only by root and we can't be root */ - if (current->fsuid + if (task_fsuid(current) && (exp->ex_flags & NFSEXP_ROOTSQUASH) && !(tdentry->d_inode->i_uid && (tdentry->d_inode->i_mode & S_IXUSR)) diff -u --recursive --new-file linux-2.5.3/fs/nfsd/vfs.c linux-2.5.3-fixup_cred/fs/nfsd/vfs.c --- linux-2.5.3/fs/nfsd/vfs.c Tue Jan 15 19:52:11 2002 +++ linux-2.5.3-fixup_cred/fs/nfsd/vfs.c Sat Feb 2 16:06:48 2002 @@ -467,6 +467,7 @@ atomic_set(&filp->f_count, 1); filp->f_dentry = dentry; filp->f_vfsmnt = fhp->fh_export->ex_mnt; + filp->f_cred = task_getucred(current); if (access & MAY_WRITE) { filp->f_flags = O_WRONLY|O_LARGEFILE; filp->f_mode = FMODE_WRITE; @@ -511,6 +512,7 @@ fops_put(filp->f_op); if (filp->f_mode & FMODE_WRITE) put_write_access(inode); + put_ucred(filp->f_cred); } /* @@ -1498,7 +1500,7 @@ IS_APPEND(inode)? " append" : "", IS_RDONLY(inode)? " ro" : ""); dprintk(" owner %d/%d user %d/%d\n", - inode->i_uid, inode->i_gid, current->fsuid, current->fsgid); + inode->i_uid, inode->i_gid, task_fsuid(current), task_fsgid(current)); #endif /* only care about readonly exports for files and @@ -1540,7 +1542,7 @@ * with NFSv3. */ if ((acc & MAY_OWNER_OVERRIDE) && - inode->i_uid == current->fsuid) + inode->i_uid == task_fsuid(current)) return 0; acc &= ~ MAY_OWNER_OVERRIDE; /* This bit is no longer needed, diff -u --recursive --new-file linux-2.5.3/fs/open.c linux-2.5.3-fixup_cred/fs/open.c --- linux-2.5.3/fs/open.c Tue Jan 15 20:07:01 2002 +++ linux-2.5.3-fixup_cred/fs/open.c Sat Feb 2 16:05:36 2002 @@ -256,7 +256,7 @@ newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET; } else { - if (current->fsuid != inode->i_uid && + if (task_fsuid(current) != inode->i_uid && (error = permission(inode,MAY_WRITE)) != 0) goto dput_and_out; } @@ -326,15 +326,15 @@ 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 = task_fsuid(current); + old_fsgid = task_fsgid(current); old_cap = current->cap_effective; - current->fsuid = current->uid; - current->fsgid = current->gid; + task_setfsuid(current, task_uid(current)); + task_setfsgid(current, task_gid(current)); /* Clear the capabilities if we switch to a non-root user */ - if (current->uid) + if (task_uid(current)) cap_clear(current->cap_effective); else current->cap_effective = current->cap_permitted; @@ -349,8 +349,8 @@ path_release(&nd); } - current->fsuid = old_fsuid; - current->fsgid = old_fsgid; + task_setfsuid(current, old_fsuid); + task_setfsgid(current, old_fsgid); current->cap_effective = old_cap; return res; diff -u --recursive --new-file linux-2.5.3/fs/pipe.c linux-2.5.3-fixup_cred/fs/pipe.c --- linux-2.5.3/fs/pipe.c Sat Jan 19 01:00:26 2002 +++ linux-2.5.3-fixup_cred/fs/pipe.c Sat Feb 2 16:05:37 2002 @@ -494,8 +494,8 @@ */ 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 = task_fsuid(current); + inode->i_gid = task_fsgid(current); inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; inode->i_blksize = PAGE_SIZE; return inode; diff -u --recursive --new-file linux-2.5.3/fs/proc/array.c linux-2.5.3-fixup_cred/fs/proc/array.c --- linux-2.5.3/fs/proc/array.c Tue Jan 15 20:07:01 2002 +++ linux-2.5.3-fixup_cred/fs/proc/array.c Sat Feb 2 16:06:48 2002 @@ -147,6 +147,7 @@ static inline char * task_state(struct task_struct *p, char *buffer) { + struct ucred *cred; int g; read_lock(&tasklist_lock); @@ -160,8 +161,9 @@ "Gid:\t%d\t%d\t%d\t%d\n", get_task_state(p), p->tgid, p->pid, p->pid ? p->p_opptr->pid : 0, 0, - p->uid, p->euid, p->suid, p->fsuid, - p->gid, p->egid, p->sgid, p->fsgid); + task_uid(p), task_euid(p), task_suid(p), task_fsuid(p), + task_gid(p), task_egid(p), task_sgid(p), task_fsgid(p)); + cred = task_getucred(p); read_unlock(&tasklist_lock); task_lock(p); buffer += sprintf(buffer, @@ -170,8 +172,9 @@ 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 < cred->ngroups; g++) + buffer += sprintf(buffer, "%d ", cred->groups[g]); + put_ucred(cred); buffer += sprintf(buffer, "\n"); return buffer; diff -u --recursive --new-file linux-2.5.3/fs/proc/base.c linux-2.5.3-fixup_cred/fs/proc/base.c --- linux-2.5.3/fs/proc/base.c Sun Dec 30 02:30:07 2001 +++ linux-2.5.3-fixup_cred/fs/proc/base.c Sat Feb 2 16:05:37 2002 @@ -457,7 +457,7 @@ /* 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 (task_fsuid(current) != inode->i_uid && !capable(CAP_DAC_OVERRIDE)) goto out; error = proc_check_root(inode); if (error) @@ -497,7 +497,7 @@ struct dentry *de; struct vfsmount *mnt = NULL; - if (current->fsuid != inode->i_uid && !capable(CAP_DAC_OVERRIDE)) + if (task_fsuid(current) != inode->i_uid && !capable(CAP_DAC_OVERRIDE)) goto out; error = proc_check_root(inode); if (error) @@ -707,8 +707,8 @@ inode->i_uid = 0; inode->i_gid = 0; if (ino == PROC_PID_INO || task_dumpable(task)) { - inode->i_uid = task->euid; - inode->i_gid = task->egid; + inode->i_uid = task_euid(task); + inode->i_gid = task_egid(task); } out: diff -u --recursive --new-file linux-2.5.3/fs/proc/inode.c linux-2.5.3-fixup_cred/fs/proc/inode.c --- linux-2.5.3/fs/proc/inode.c Sat Nov 17 20:24:32 2001 +++ linux-2.5.3-fixup_cred/fs/proc/inode.c Sat Feb 2 16:05:37 2002 @@ -103,8 +103,8 @@ { char *this_char,*value; - *uid = current->uid; - *gid = current->gid; + *uid = task_uid(current); + *gid = task_gid(current); if (!options) return 1; for (this_char = strtok(options,","); this_char; this_char = strtok(NULL,",")) { if ((value = strchr(this_char,'=')) != NULL) diff -u --recursive --new-file linux-2.5.3/fs/ramfs/inode.c linux-2.5.3-fixup_cred/fs/ramfs/inode.c --- linux-2.5.3/fs/ramfs/inode.c Wed Dec 26 00:39:20 2001 +++ linux-2.5.3-fixup_cred/fs/ramfs/inode.c Sat Feb 2 16:05:46 2002 @@ -104,8 +104,8 @@ if (inode) { inode->i_mode = mode; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = task_fsuid(current); + inode->i_gid = task_fsgid(current); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_rdev = NODEV; diff -u --recursive --new-file linux-2.5.3/fs/reiserfs/inode.c linux-2.5.3-fixup_cred/fs/reiserfs/inode.c --- linux-2.5.3/fs/reiserfs/inode.c Tue Jan 29 19:47:10 2002 +++ linux-2.5.3-fixup_cred/fs/reiserfs/inode.c Sat Feb 2 16:05:46 2002 @@ -1518,13 +1518,13 @@ /* fill stat data */ inode->i_mode = mode; inode->i_nlink = (S_ISDIR (mode) ? 2 : 1); - inode->i_uid = current->fsuid; + inode->i_uid = task_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 = task_fsgid(current); inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_size = i_size; diff -u --recursive --new-file linux-2.5.3/fs/smbfs/inode.c linux-2.5.3-fixup_cred/fs/smbfs/inode.c --- linux-2.5.3/fs/smbfs/inode.c Mon Jan 28 22:20:34 2002 +++ linux-2.5.3-fixup_cred/fs/smbfs/inode.c Sat Feb 2 16:05:41 2002 @@ -535,7 +535,7 @@ if (parse_options(mnt, raw_data)) goto out_bad_option; - mnt->mounted_uid = current->uid; + mnt->mounted_uid = task_uid(current); } smb_setcodepage(server, &mnt->codepage); diff -u --recursive --new-file linux-2.5.3/fs/smbfs/proc.c linux-2.5.3-fixup_cred/fs/smbfs/proc.c --- linux-2.5.3/fs/smbfs/proc.c Mon Jan 28 22:20:34 2002 +++ linux-2.5.3-fixup_cred/fs/smbfs/proc.c Sat Feb 2 16:05:41 2002 @@ -776,7 +776,7 @@ goto out; error = -EACCES; - if (current->uid != server->mnt->mounted_uid && + if (task_uid(current) != server->mnt->mounted_uid && !capable(CAP_SYS_ADMIN)) goto out; diff -u --recursive --new-file linux-2.5.3/fs/sysv/ialloc.c linux-2.5.3-fixup_cred/fs/sysv/ialloc.c --- linux-2.5.3/fs/sysv/ialloc.c Thu Jan 24 00:32:19 2002 +++ linux-2.5.3-fixup_cred/fs/sysv/ialloc.c Sat Feb 2 16:05:40 2002 @@ -159,9 +159,9 @@ if (S_ISDIR(mode)) mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = task_fsgid(current); - inode->i_uid = current->fsuid; + inode->i_uid = task_fsuid(current); inode->i_ino = fs16_to_cpu(sb, ino); inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_blocks = inode->i_blksize = 0; diff -u --recursive --new-file linux-2.5.3/fs/udf/ialloc.c linux-2.5.3-fixup_cred/fs/udf/ialloc.c --- linux-2.5.3/fs/udf/ialloc.c Thu Jan 24 00:32:20 2002 +++ linux-2.5.3-fixup_cred/fs/udf/ialloc.c Sat Feb 2 16:05:43 2002 @@ -118,7 +118,7 @@ mark_buffer_dirty(UDF_SB_LVIDBH(sb)); } inode->i_mode = mode; - inode->i_uid = current->fsuid; + inode->i_uid = task_fsuid(current); if (dir->i_mode & S_ISGID) { inode->i_gid = dir->i_gid; @@ -126,7 +126,7 @@ mode |= S_ISGID; } else - inode->i_gid = current->fsgid; + inode->i_gid = task_fsgid(current); UDF_I_LOCATION(inode).logicalBlockNum = block; UDF_I_LOCATION(inode).partitionReferenceNum = UDF_I_LOCATION(dir).partitionReferenceNum; diff -u --recursive --new-file linux-2.5.3/fs/udf/namei.c linux-2.5.3-fixup_cred/fs/udf/namei.c --- linux-2.5.3/fs/udf/namei.c Sun Dec 30 19:53:53 2001 +++ linux-2.5.3-fixup_cred/fs/udf/namei.c Sat Feb 2 16:05:44 2002 @@ -673,7 +673,7 @@ if (!inode) goto out; - inode->i_uid = current->fsuid; + inode->i_uid = task_fsuid(current); init_special_inode(inode, mode, rdev); if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) { diff -u --recursive --new-file linux-2.5.3/fs/ufs/ialloc.c linux-2.5.3-fixup_cred/fs/ufs/ialloc.c --- linux-2.5.3/fs/ufs/ialloc.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/fs/ufs/ialloc.c Sat Feb 2 16:05:41 2002 @@ -251,13 +251,13 @@ sb->s_dirt = 1; inode->i_mode = mode; - inode->i_uid = current->fsuid; + inode->i_uid = task_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 = task_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 -u --recursive --new-file linux-2.5.3/fs/umsdos/ioctl.c linux-2.5.3-fixup_cred/fs/umsdos/ioctl.c --- linux-2.5.3/fs/umsdos/ioctl.c Tue Aug 28 17:16:07 2001 +++ linux-2.5.3-fixup_cred/fs/umsdos/ioctl.c Sat Feb 2 16:05:40 2002 @@ -110,7 +110,7 @@ goto out; ret = -EPERM; - if (current->euid != 0 && cmd != UMSDOS_GETVERSION) + if (task_euid(current) != 0 && cmd != UMSDOS_GETVERSION) goto out; ret = -EINVAL; diff -u --recursive --new-file linux-2.5.3/fs/umsdos/namei.c linux-2.5.3-fixup_cred/fs/umsdos/namei.c --- linux-2.5.3/fs/umsdos/namei.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/fs/umsdos/namei.c Sat Feb 2 16:05:40 2002 @@ -255,8 +255,8 @@ info.entry.mode = mode; info.entry.rdev = rdev; info.entry.flags = flags; - info.entry.uid = current->fsuid; - info.entry.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; + info.entry.uid = task_fsuid(current); + info.entry.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : task_fsgid(current); info.entry.ctime = info.entry.atime = info.entry.mtime = CURRENT_TIME; info.entry.nlink = 1; ret = umsdos_newentry (dentry->d_parent, &info); @@ -779,8 +779,8 @@ info.entry.mode = mode | S_IFDIR; info.entry.rdev = 0; - info.entry.uid = current->fsuid; - info.entry.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->fsgid; + info.entry.uid = task_fsuid(current); + info.entry.gid = (dir->i_mode & S_ISGID) ? dir->i_gid : task_fsgid(current); info.entry.ctime = info.entry.atime = info.entry.mtime = CURRENT_TIME; info.entry.flags = 0; info.entry.nlink = 1; diff -u --recursive --new-file linux-2.5.3/include/linux/cred.h linux-2.5.3-fixup_cred/include/linux/cred.h --- linux-2.5.3/include/linux/cred.h Thu Jan 1 01:00:00 1970 +++ linux-2.5.3-fixup_cred/include/linux/cred.h Sat Feb 2 18:20:12 2002 @@ -0,0 +1,191 @@ +#ifndef _LINUX_CRED_H +#define _LINUX_CRED_H + +#include +#include +#include + +/* + * UNIX credential + * + * This is mainly for use by filesystems, sockets, RPC as a more generic + * replacement for the old fsuid/fsgid + groups[]. + * The plan is to allow it to cache private RPC authentication info, + * NFS ACCESS permissions and more via a set of property lists... + * + * The credential may be shared among different processes and functions + * using copy on write semantics. + */ +struct ucred { + atomic_t count; + + uid_t uid; + gid_t gid; + + unsigned int ngroups; + gid_t *groups; + /* Default storage for groups */ + gid_t __group_storage[NGROUPS]; +}; + +/* + * Linux process credentials. + * + * The credential may be shared by several processes using + * copy on write semantics. We may, however, want to implement + * CLONE_CRED and POSIX threads at some point, so please stick + * to using the task_(set|).*() functions for reading/modifying + * values. + */ +struct pcred { + atomic_t count; + atomic_t proc_count; + + uid_t uid, euid, suid; /* real, effective, saved uid */ + gid_t gid, egid, sgid; /* real, effective, saved gid */ + + struct ucred *ucred; /* UNIX credential */ + struct user_struct *user; /* User tracking */ +}; + +#ifdef __KERNEL__ + +#define NOGID ((gid_t)-1) +#define NOUID ((uid_t)-1) + +extern void credentials_init(void); + +extern struct ucred *ucred_clone(const struct ucred *, int); +extern void put_ucred(struct ucred *cred); + +static inline struct ucred *get_ucred(struct ucred *cred) +{ + atomic_inc(&cred->count); + return cred; +} + +extern struct pcred *pcred_clone(const struct pcred *, int); +extern void pcred_setucred(struct pcred *, struct ucred *); +extern void pcred_setuser(struct pcred *, struct user_struct *); +extern void put_pcred(struct pcred *cred); + +static inline struct pcred *get_pcred(struct pcred *cred) +{ + atomic_inc(&cred->count); + return cred; +} + +extern struct pcred init_pcred; + +extern void task_setpcred(struct task_struct *, struct pcred *); +extern int task_setresuid(struct task_struct *, uid_t, uid_t, uid_t); +extern int task_setresgid(struct task_struct *, gid_t, gid_t, gid_t); +extern int task_setfsuid(struct task_struct *, uid_t); +extern int task_setfsgid(struct task_struct *, gid_t); +extern int task_setgroups(struct task_struct *, unsigned int, const gid_t *); +extern int task_usersetgroups(struct task_struct *, unsigned int, const gid_t *); +extern int task_getgroups(const struct task_struct *, unsigned int, gid_t *); +extern int task_usergetgroups(const struct task_struct *, unsigned int, gid_t *); +#ifdef CONFIG_UID16 +extern int task_oldsetgroups(struct task_struct *, unsigned int, const old_gid_t *); +extern int task_oldgetgroups(const struct task_struct *, unsigned int, old_gid_t *); +#endif +#if defined(CONFIG_SPARC64) || defined(CONFIG_ARCH_S390X) +extern int task_setgroups16(struct task_struct *, unsigned int, const gid16_t *); +extern int task_getgroups16(const struct task_struct *, unsigned int, gid16_t *); +#endif +extern struct pcred *task_clone_pcred(const struct task_struct *, int); +extern int in_group_p(gid_t); +extern int in_egroup_p(gid_t); + +static inline struct pcred *task_getpcred(const struct task_struct *tsk) +{ + return get_pcred(tsk->pcred); +} + +static inline struct ucred *task_getucred(const struct task_struct *tsk) +{ + smp_rmb(); + return get_ucred(tsk->pcred->ucred); +} + +static inline uid_t task_uid(const struct task_struct *tsk) +{ + return tsk->pcred->uid; +} + +static inline int task_setuid(struct task_struct *tsk, uid_t uid) +{ + return task_setresuid(tsk, uid, NOUID, NOUID); +} + +static inline uid_t task_euid(const struct task_struct *tsk) +{ + return tsk->pcred->euid; +} + +static inline int task_seteuid(struct task_struct *tsk, uid_t euid) +{ + return task_setresuid(tsk, NOUID, euid, NOUID); +} + +static inline uid_t task_suid(const struct task_struct *tsk) +{ + return tsk->pcred->suid; +} + +static inline int task_setsuid(struct task_struct *tsk, uid_t suid) +{ + return task_setresuid(tsk, NOUID, NOUID, suid); +} + +static inline uid_t task_fsuid(const struct task_struct *tsk) +{ + smp_rmb(); + return tsk->pcred->ucred->uid; +} + +static inline gid_t task_gid(const struct task_struct *tsk) +{ + return tsk->pcred->gid; +} + +static inline int task_setgid(struct task_struct *tsk, gid_t gid) +{ + return task_setresgid(tsk, gid, NOGID, NOGID); +} + +static inline gid_t task_egid(const struct task_struct *tsk) +{ + return tsk->pcred->egid; +} + +static inline int task_setegid(struct task_struct *tsk, gid_t egid) +{ + return task_setresgid(tsk, NOGID, egid, NOGID); +} + +static inline gid_t task_sgid(const struct task_struct *tsk) +{ + return tsk->pcred->sgid; +} + +static inline int task_setsgid(struct task_struct *tsk, gid_t sgid) +{ + return task_setresgid(tsk, NOGID, NOGID, sgid); +} + +static inline gid_t task_fsgid(const struct task_struct *tsk) +{ + smp_rmb(); + return tsk->pcred->ucred->gid; +} + +static inline int task_ngroups(const struct task_struct *tsk) +{ + smp_rmb(); + return tsk->pcred->ucred->ngroups; +} + +#endif /* __KERNEL__ */ +#endif /* _LINUX_CRED_H */ diff -u --recursive --new-file linux-2.5.3/include/linux/fs.h linux-2.5.3-fixup_cred/include/linux/fs.h --- linux-2.5.3/include/linux/fs.h Thu Jan 31 15:05:30 2002 +++ linux-2.5.3-fixup_cred/include/linux/fs.h Sat Feb 2 16:40:16 2002 @@ -484,7 +484,7 @@ loff_t f_pos; unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; struct fown_struct f_owner; - unsigned int f_uid, f_gid; + struct ucred *f_cred; int f_error; unsigned long f_version; @@ -504,6 +504,7 @@ #define file_count(x) atomic_read(&(x)->f_count) extern int init_private_file(struct file *, struct dentry *, int); +extern int release_private_file(struct inode *, struct file *); #define MAX_NON_LFS ((1UL<<31) - 1) diff -u --recursive --new-file linux-2.5.3/include/linux/init_task.h linux-2.5.3-fixup_cred/include/linux/init_task.h --- linux-2.5.3/include/linux/init_task.h Thu Jan 31 15:22:32 2002 +++ linux-2.5.3-fixup_cred/include/linux/init_task.h Sat Feb 2 16:11:56 2002 @@ -2,6 +2,7 @@ #define _LINUX__INIT_TASK_H #include +#include #define INIT_FILES \ { \ @@ -76,7 +77,7 @@ cap_permitted: CAP_FULL_SET, \ keep_capabilities: 0, \ rlim: INIT_RLIMITS, \ - user: INIT_USER, \ + pcred: &init_pcred, \ comm: "swapper", \ thread: INIT_THREAD, \ fs: &init_fs, \ diff -u --recursive --new-file linux-2.5.3/include/linux/netlink.h linux-2.5.3-fixup_cred/include/linux/netlink.h --- linux-2.5.3/include/linux/netlink.h Thu Jan 24 00:28:40 2002 +++ linux-2.5.3-fixup_cred/include/linux/netlink.h Sat Feb 2 16:06:48 2002 @@ -88,7 +88,7 @@ struct netlink_skb_parms { - struct ucred creds; /* Skb credentials */ + struct scm_ucred creds; /* Skb credentials */ __u32 pid; __u32 groups; __u32 dst_pid; diff -u --recursive --new-file linux-2.5.3/include/linux/sched.h linux-2.5.3-fixup_cred/include/linux/sched.h --- linux-2.5.3/include/linux/sched.h Thu Jan 31 15:05:30 2002 +++ linux-2.5.3-fixup_cred/include/linux/sched.h Sat Feb 2 18:23:43 2002 @@ -43,6 +43,7 @@ #define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */ #define CLONE_THREAD 0x00010000 /* Same thread group? */ #define CLONE_NEWNS 0x00020000 /* New namespace group? */ +#define CLONE_CRED 0x00040000 /* set if credentials shared */ #define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREAD) @@ -219,10 +220,11 @@ uid_t uid; }; -#define get_current_user() ({ \ - struct user_struct *__user = current->user; \ - atomic_inc(&__user->__count); \ - __user; }) +static inline struct user_struct *get_userstruct(struct user_struct *user) +{ + atomic_inc(&user->__count); + return user; +} extern struct user_struct root_user; #define INIT_USER (&root_user) @@ -319,13 +321,9 @@ unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap; int swappable:1; /* process credentials */ - uid_t uid,euid,suid,fsuid; - gid_t gid,egid,sgid,fsgid; - int ngroups; - gid_t groups[NGROUPS]; + struct pcred *pcred; kernel_cap_t cap_effective, cap_inheritable, cap_permitted; int keep_capabilities:1; - struct user_struct *user; /* limits */ struct rlimit rlim[RLIM_NLIMITS]; unsigned short used_math; @@ -558,8 +556,8 @@ #define wake_up_interruptible_sync_nr(x) __wake_up_sync((x),TASK_INTERRUPTIBLE, nr) asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr, int options, struct rusage * ru); -extern int in_group_p(gid_t); -extern int in_egroup_p(gid_t); +/* credentials */ +#include extern void proc_caches_init(void); extern void flush_signals(struct task_struct *); @@ -672,7 +670,7 @@ */ static inline int suser(void) { - if (!issecure(SECURE_NOROOT) && current->euid == 0) { + if (!issecure(SECURE_NOROOT) && task_euid(current) == 0) { current->flags |= PF_SUPERPRIV; return 1; } @@ -681,7 +679,7 @@ static inline int fsuser(void) { - if (!issecure(SECURE_NOROOT) && current->fsuid == 0) { + if (!issecure(SECURE_NOROOT) && task_fsuid(current) == 0) { current->flags |= PF_SUPERPRIV; return 1; } @@ -699,7 +697,7 @@ #if 1 /* ok now */ if (cap_raised(current->cap_effective, cap)) #else - if (cap_is_fs_cap(cap) ? current->fsuid == 0 : current->euid == 0) + if (cap_is_fs_cap(cap) ? task_fsuid(current) == 0 : task_euid(current) == 0) #endif { current->flags |= PF_SUPERPRIV; diff -u --recursive --new-file linux-2.5.3/include/linux/socket.h linux-2.5.3-fixup_cred/include/linux/socket.h --- linux-2.5.3/include/linux/socket.h Thu Jan 31 15:05:30 2002 +++ linux-2.5.3-fixup_cred/include/linux/socket.h Sat Feb 2 16:40:15 2002 @@ -122,7 +122,7 @@ #define SCM_CREDENTIALS 0x02 /* rw: struct ucred */ #define SCM_CONNECT 0x03 /* rw: struct scm_connect */ -struct ucred { +struct scm_ucred { __u32 pid; __u32 uid; __u32 gid; diff -u --recursive --new-file linux-2.5.3/include/net/af_unix.h linux-2.5.3-fixup_cred/include/net/af_unix.h --- linux-2.5.3/include/net/af_unix.h Mon Apr 24 22:43:04 2000 +++ linux-2.5.3-fixup_cred/include/net/af_unix.h Sat Feb 2 16:06:49 2002 @@ -27,7 +27,7 @@ struct unix_skb_parms { - struct ucred creds; /* Skb credentials */ + struct scm_ucred creds; /* Skb credentials */ struct scm_fp_list *fp; /* Passed files */ }; diff -u --recursive --new-file linux-2.5.3/include/net/scm.h linux-2.5.3-fixup_cred/include/net/scm.h --- linux-2.5.3/include/net/scm.h Sat Feb 17 01:02:37 2001 +++ linux-2.5.3-fixup_cred/include/net/scm.h Sat Feb 2 16:06:49 2002 @@ -14,7 +14,7 @@ struct scm_cookie { - struct ucred creds; /* Skb credentials */ + struct scm_ucred creds; /* Skb credentials */ struct scm_fp_list *fp; /* Passed files */ unsigned long seq; /* Connection seqno */ }; @@ -34,8 +34,8 @@ struct scm_cookie *scm) { memset(scm, 0, sizeof(*scm)); - scm->creds.uid = current->uid; - scm->creds.gid = current->gid; + scm->creds.uid = task_uid(current); + scm->creds.gid = task_gid(current); scm->creds.pid = current->pid; if (msg->msg_controllen <= 0) return 0; diff -u --recursive --new-file linux-2.5.3/include/net/sock.h linux-2.5.3-fixup_cred/include/net/sock.h --- linux-2.5.3/include/net/sock.h Thu Jan 31 15:09:05 2002 +++ linux-2.5.3-fixup_cred/include/net/sock.h Sat Feb 2 16:06:49 2002 @@ -597,7 +597,7 @@ unsigned short type; unsigned char localroute; /* Route locally only */ unsigned char protocol; - struct ucred peercred; + struct scm_ucred peercred; int rcvlowat; long rcvtimeo; long sndtimeo; diff -u --recursive --new-file linux-2.5.3/init/main.c linux-2.5.3-fixup_cred/init/main.c --- linux-2.5.3/init/main.c Mon Jan 28 22:13:19 2002 +++ linux-2.5.3-fixup_cred/init/main.c Sat Feb 2 16:06:49 2002 @@ -357,6 +357,7 @@ mem_init(); kmem_cache_sizes_init(); pgtable_cache_init(); + credentials_init(); mempages = num_physpages; diff -u --recursive --new-file linux-2.5.3/ipc/msg.c linux-2.5.3-fixup_cred/ipc/msg.c --- linux-2.5.3/ipc/msg.c Fri Sep 14 23:17:00 2001 +++ linux-2.5.3-fixup_cred/ipc/msg.c Sat Feb 2 16:05:52 2002 @@ -531,8 +531,8 @@ goto out_unlock_up; ipcp = &msq->q_perm; err = -EPERM; - if (current->euid != ipcp->cuid && - current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) + if (task_euid(current) != ipcp->cuid && + task_euid(current) != ipcp->uid && !capable(CAP_SYS_ADMIN)) /* We _could_ check for CAP_CHOWN above, but we don't */ goto out_unlock_up; diff -u --recursive --new-file linux-2.5.3/ipc/sem.c linux-2.5.3-fixup_cred/ipc/sem.c --- linux-2.5.3/ipc/sem.c Sun Sep 30 21:26:42 2001 +++ linux-2.5.3-fixup_cred/ipc/sem.c Sat Feb 2 16:05:52 2002 @@ -719,8 +719,8 @@ } ipcp = &sma->sem_perm; - if (current->euid != ipcp->cuid && - current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) { + if (task_euid(current) != ipcp->cuid && + task_euid(current) != ipcp->uid && !capable(CAP_SYS_ADMIN)) { err=-EPERM; goto out_unlock; } diff -u --recursive --new-file linux-2.5.3/ipc/shm.c linux-2.5.3-fixup_cred/ipc/shm.c --- linux-2.5.3/ipc/shm.c Sun Dec 30 02:30:07 2001 +++ linux-2.5.3-fixup_cred/ipc/shm.c Sat Feb 2 16:05:52 2002 @@ -502,8 +502,8 @@ err = shm_checkid(shp, shmid); if(err) goto out_unlock_up; - if (current->euid != shp->shm_perm.uid && - current->euid != shp->shm_perm.cuid && + if (task_euid(current) != shp->shm_perm.uid && + task_euid(current) != shp->shm_perm.cuid && !capable(CAP_SYS_ADMIN)) { err=-EPERM; goto out_unlock_up; @@ -534,8 +534,8 @@ if(err) goto out_unlock_up; err=-EPERM; - if (current->euid != shp->shm_perm.uid && - current->euid != shp->shm_perm.cuid && + if (task_euid(current) != shp->shm_perm.uid && + task_euid(current) != shp->shm_perm.cuid && !capable(CAP_SYS_ADMIN)) { goto out_unlock_up; } diff -u --recursive --new-file linux-2.5.3/ipc/util.c linux-2.5.3-fixup_cred/ipc/util.c --- linux-2.5.3/ipc/util.c Mon Aug 13 02:37:53 2001 +++ linux-2.5.3-fixup_cred/ipc/util.c Sat Feb 2 16:05:52 2002 @@ -158,8 +158,8 @@ 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 = task_euid(current); + new->gid = new->cgid = task_egid(current); new->seq = ids->seq++; if(ids->seq > ids->seq_max) @@ -254,7 +254,7 @@ requested_mode = (flag >> 6) | (flag >> 3) | flag; granted_mode = ipcp->mode; - if (current->euid == ipcp->cuid || current->euid == ipcp->uid) + if (task_euid(current) == ipcp->cuid || task_euid(current) == ipcp->uid) granted_mode >>= 6; else if (in_group_p(ipcp->cgid) || in_group_p(ipcp->gid)) granted_mode >>= 3; diff -u --recursive --new-file linux-2.5.3/kernel/Makefile linux-2.5.3-fixup_cred/kernel/Makefile --- linux-2.5.3/kernel/Makefile Thu Jan 24 23:07:46 2002 +++ linux-2.5.3-fixup_cred/kernel/Makefile Sat Feb 2 16:12:48 2002 @@ -15,7 +15,7 @@ obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \ module.o exit.o itimer.o info.o time.o softirq.o resource.o \ sysctl.o acct.o capability.o ptrace.o timer.o user.o \ - signal.o sys.o kmod.o context.o + signal.o sys.o kmod.o context.o cred.o obj-$(CONFIG_UID16) += uid16.o obj-$(CONFIG_MODULES) += ksyms.o diff -u --recursive --new-file linux-2.5.3/kernel/acct.c linux-2.5.3-fixup_cred/kernel/acct.c --- linux-2.5.3/kernel/acct.c Thu Dec 27 17:17:43 2001 +++ linux-2.5.3-fixup_cred/kernel/acct.c Sat Feb 2 16:05:49 2002 @@ -298,8 +298,8 @@ ac.ac_etime = encode_comp_t(jiffies - current->start_time); ac.ac_utime = encode_comp_t(current->times.tms_utime); ac.ac_stime = encode_comp_t(current->times.tms_stime); - ac.ac_uid = current->uid; - ac.ac_gid = current->gid; + ac.ac_uid = task_uid(current); + ac.ac_gid = task_gid(current); ac.ac_tty = (current->tty) ? kdev_t_to_nr(current->tty->device) : 0; ac.ac_flag = 0; diff -u --recursive --new-file linux-2.5.3/kernel/cred.c linux-2.5.3-fixup_cred/kernel/cred.c --- linux-2.5.3/kernel/cred.c Thu Jan 1 01:00:00 1970 +++ linux-2.5.3-fixup_cred/kernel/cred.c Sat Feb 2 18:20:02 2002 @@ -0,0 +1,847 @@ +/* + * linux/kernel/cred.c + * + * Copyright (c) 2001 Trond Myklebust + * + * 'cred.c' contains the helper routines for managing credentials + * and ucred/pcred structures in the task structure. + */ + +#include +#include +#include +#include +#include +#include + +/* + * Static creds for the init task + */ +static struct ucred init_ucred = { + count: ATOMIC_INIT(2), + uid: (uid_t)0, + gid: (gid_t)0, + ngroups: 0, + groups: init_ucred.__group_storage, +}; + +struct pcred init_pcred = { + count: ATOMIC_INIT(2), + proc_count: ATOMIC_INIT(1), + uid: (uid_t)0, + euid: (uid_t)0, + suid: (uid_t)0, + gid: (gid_t)0, + egid: (gid_t)0, + sgid: (gid_t)0, + ucred: &init_ucred, + user: INIT_USER, +}; + +static kmem_cache_t *pcred_cache, + *ucred_cache; + +static void ucred_ctor(void *objp, kmem_cache_t *cachep, unsigned long flags) +{ + struct ucred *cred = (struct ucred *)objp; + + atomic_set(&cred->count, 0); + cred->groups = cred->__group_storage; +} + +static void pcred_ctor(void *objp, kmem_cache_t *cachep, unsigned long flags) +{ + struct pcred *pcred = (struct pcred *)objp; + + atomic_set(&pcred->count, 0); + atomic_set(&pcred->proc_count, 0); +} + +void __init credentials_init(void) +{ + pcred_cache = kmem_cache_create("pcred_cache", + sizeof(struct pcred), + 0, + SLAB_HWCACHE_ALIGN, + pcred_ctor, NULL); + if (!pcred_cache) + panic("Cannot create process credential SLAB cache"); + + ucred_cache = kmem_cache_create("ucred_cache", + sizeof(struct ucred), + 0, + SLAB_HWCACHE_ALIGN, + ucred_ctor, NULL); + if (!ucred_cache) + panic("Cannot create unix credential SLAB cache"); +} + +static inline struct ucred *ucred_alloc(int gfp) +{ + struct ucred *cred; + + cred = (struct ucred *)kmem_cache_alloc(ucred_cache, gfp); + if (cred) + return get_ucred(cred); + return NULL; +} + +static inline void ucred_freegroups(struct ucred *cred) +{ + if (cred->groups != cred->__group_storage) { + kfree(cred->groups); + cred->groups = cred->__group_storage; + } + cred->ngroups = 0; +} + +static inline int ucred_growgroups(struct ucred *cred, unsigned int ngroups) +{ + gid_t *buf; + + ucred_freegroups(cred); + if (ngroups <= NGROUPS) + goto out; + buf = (gid_t *)kmalloc(ngroups * sizeof(*cred->groups), GFP_KERNEL); + if (!buf) + return -ENOMEM; + cred->groups = buf; +out: + return 0; +} + +/** + * put_ucred - free a ucred + * @cred: + */ +void put_ucred(struct ucred *cred) +{ + if (!atomic_dec_and_test(&cred->count)) + return; + ucred_freegroups(cred); + kmem_cache_free(ucred_cache, cred); +} + +/* + * ucred_create - allocate and initialize a new credential + * @uid: process uid + * @gid: process gid + * @gfp: allocation mode + */ +static struct ucred *ucred_create(uid_t uid, gid_t gid, int gfp) +{ + struct ucred *cred; + + if (!(cred = ucred_alloc(gfp))) + goto out; + + cred->uid = uid; + cred->gid = gid; + cred->ngroups = 0; +out: + return cred; +} + +/* + * ucred_setgroups - set the supplemental group membership in a ucred + * @ucred: ucred to modify + * @ngroups: number of elements in groups array + * @groups: source array of groups + */ +static int ucred_setgroups(struct ucred *cred, unsigned int ngroups, const gid_t *groups) +{ + int err; + if ((err = ucred_growgroups(cred, ngroups)) != 0) + return err; + cred->ngroups = ngroups; + memcpy(cred->groups, groups, ngroups * sizeof(*cred->groups)); + return 0; +} +/* + * ucred_usersetgroups - set the supplemental group membership in a ucred + * @ucred: ucred to modify + * @ngroups: number of elements in groups array + * @groups: source array of groups + */ +static int ucred_usersetgroups(struct ucred *cred, unsigned int ngroups, const gid_t *groups) +{ + int err; + if ((err = ucred_growgroups(cred, ngroups)) != 0) + return err; + cred->ngroups = ngroups; + if (copy_from_user(cred->groups, groups, ngroups * sizeof(*cred->groups))) + return -EFAULT; + return 0; +} + +/* + * ucred_getgroups - return the supplemental groups from a ucred + * @ucred: ucred to read + * @ngroups: maximum size of groups array + * @groups: copy destination array + */ +static int ucred_getgroups(const struct ucred *cred, unsigned int ngroups, gid_t *groups) +{ + if (ngroups > cred->ngroups) + ngroups = cred->ngroups; + memcpy(groups, cred->groups, ngroups * sizeof(*groups)); + return ngroups; +} + +/* + * ucred_user_getgroups - return the supplemental groups from a ucred + * @ucred: ucred to read + * @ngroups: maximum size of groups array + * @groups: copy destination array + */ +static int ucred_usergetgroups(const struct ucred *cred, unsigned int ngroups, gid_t *groups) +{ + if (ngroups < cred->ngroups) + return -EINVAL; + ngroups = cred->ngroups; + if (copy_to_user(groups, cred->groups, ngroups * sizeof(*groups))) + return -EFAULT; + return ngroups; +} + +/* + * ucred_match_supplemental - match a gid in the ucred supplemental groups + * @ucred: ucred + * @gid: gid to match + */ +static int ucred_match_supplemental(const struct ucred *cred, gid_t gid) +{ + gid_t *p = cred->groups; + int i; + + for (i = cred->ngroups; i != 0 ; i--) { + if (gid == *p++) + return 1; + } + return 0; +} + +/** + * ucred_clone - copy a unix credential + * @ucred: credential to copy + * @gfp: allocation mode + * + * Allocates a new unix credential, and copies the entries in ucred + * into the new credential. + */ +struct ucred *ucred_clone(const struct ucred *cred, int gfp) +{ + struct ucred *new; + int err; + + new = ucred_create(cred->uid, cred->gid, gfp); + if (!new) + goto out_nomem; + err = ucred_setgroups(new, cred->ngroups, cred->groups); + if (err) + goto out_err; + return new; +out_err: + put_ucred(new); +out_nomem: + return NULL; +} + +static inline struct pcred *pcred_alloc(int gfp) +{ + struct pcred *pcred; + + pcred = (struct pcred *)kmem_cache_alloc(pcred_cache, gfp); + if (pcred) + return get_pcred(pcred); + return NULL; +} + +/** + * put_pcred - free a pcred + * @pcred: + */ +void put_pcred(struct pcred *pcred) +{ + if (!atomic_dec_and_test(&pcred->count)) + return; + if (pcred->user) + free_uid(pcred->user); + if (pcred->ucred) + put_ucred(pcred->ucred); + kmem_cache_free(pcred_cache, pcred); +} + +/* + * pcred_create - allocate and initialize a new process credential + * @uid: process uid + * @gid: process gid + * @ucred: process ucred + * @gfp: allocation mode + */ +static struct pcred *pcred_create(uid_t uid, gid_t gid, struct ucred *ucred, int gfp) +{ + struct pcred *new; + + if (!(new = pcred_alloc(gfp))) + goto out_nomem; + if (!ucred) { + new->ucred = ucred_create(uid, gid, gfp); + if (!new->ucred) + goto out_err; + } else + new->ucred = get_ucred(ucred); + new->uid = new->euid = new->suid = uid; + new->gid = new->egid = new->sgid = gid; + new->user = NULL; + return new; +out_err: + put_pcred(new); +out_nomem: + return NULL; +} + +/* + * pcred_setresuid - set a process' uid, effective uid, and saved uid + * @pcred: credential to change + * @ruid: real uid + * @euid: effective uid + * @suid: saved uid + * Note: the ucred->uid is made to shadow the euid + */ +static int pcred_setresuid(struct pcred *pcred, uid_t ruid, uid_t euid, uid_t suid) +{ + struct ucred *ucred = pcred->ucred; + struct user_struct *new_user = NULL; + + if (ruid != NOUID && ruid != pcred->uid && pcred->user) { + new_user = alloc_uid(ruid); + if (!new_user) + goto err; + } + if (euid != NOUID) { + if (ucred && ucred->uid != euid) { + ucred = ucred_clone(pcred->ucred, GFP_KERNEL); + if (!ucred) + goto err; + ucred->uid = euid; + pcred_setucred(pcred, ucred); + put_ucred(ucred); + } + pcred->euid = euid; + } + if (ruid != NOUID) + pcred->uid = ruid; + if (suid != NOUID) + pcred->suid = suid; + if (new_user) { + pcred_setuser(pcred, new_user); + free_uid(new_user); + } + return 0; +err: + if (new_user) + free_uid(new_user); + return -EAGAIN; +} + +/* + * pcred_setresgid - set a process gid, effective gid, and saved gid + * @pcred: credential to change + * @rgid: real gid + * @egid: effective gid + * @sgid: saved gid + * Note: the ucred->gid is made to shadow the egid + */ +static int pcred_setresgid(struct pcred *pcred, gid_t rgid, gid_t egid, gid_t sgid) +{ + struct ucred *ucred = pcred->ucred; + if (egid != NOGID) { + if (ucred && ucred->gid != egid) { + ucred = ucred_clone(pcred->ucred, GFP_KERNEL); + if (!ucred) + goto err; + ucred->gid = egid; + pcred_setucred(pcred, ucred); + put_ucred(ucred); + } + pcred->egid = egid; + } + if (rgid != NOGID) + pcred->gid = rgid; + if (sgid != NOGID) + pcred->sgid = sgid; + return 0; +err: + return -EAGAIN; +} + +/** + * pcred_setucred - set the process' ucred + * @pcred: credential to change + * @cred: new ucred + */ +void pcred_setucred(struct pcred *pcred, struct ucred *cred) +{ + struct ucred *old = pcred->ucred; + + pcred->ucred = get_ucred(cred); + smp_wmb(); + if (old) + put_ucred(old); +} + +/** + * pcred_setuser - swap the user accounting for a pcred + * @pcred: credential to change + * @user: + * + * One ought perhaps to be holding the tasklist_lock here + * in order to prevent races in the process accounting for + * the case of CLONE_CRED? + */ +void pcred_setuser(struct pcred *pcred, struct user_struct *user) +{ + struct user_struct *old_user = pcred->user; + int procs = atomic_read(&pcred->proc_count); + + pcred->user = get_userstruct(user); + smp_wmb(); + atomic_add(procs, &user->processes); + if (old_user) { + atomic_sub(procs, &old_user->processes); + free_uid(old_user); + } +} + +/** + * pcred_clone - copy a process credential + * @pcred: credential to copy + * @gfp: allocation mode + * + * Allocates a new process credential, and copies the value of pcred + * into the new credential. + */ +struct pcred *pcred_clone(const struct pcred *pcred, int gfp) +{ + struct pcred *new; + + if (!(new = pcred_create(pcred->uid, pcred->gid, pcred->ucred, gfp))) + goto out; + if (pcred->user) + new->user = get_userstruct(pcred->user); + new->euid = pcred->euid; + new->suid = pcred->suid; + new->egid = pcred->egid; + new->sgid = pcred->sgid; +out: + return new; +} + +/** + * task_setpcred - replace a task's full process credentials + * @tsk: pointer to task + * @cred: new task pcred + * + * Note: This function assumes that the caller has checked capabilities etc. + */ +void task_setpcred(struct task_struct *tsk, struct pcred *pcred) +{ + struct pcred *old = tsk->pcred; + + tsk->pcred = get_pcred(pcred); + atomic_inc(&pcred->proc_count); + if (pcred->user) + atomic_inc(&pcred->user->processes); + if (old) { + struct user_struct *old_user = old->user; + if (old_user) + atomic_dec(&old_user->processes); + atomic_dec(&old->proc_count); + put_pcred(old); + } +} + +/** + * task_clone_pcred - Clone a task's pcred + * @tsk: pointer to the task_struct + * @gfp: allocation mode + * + * Use this one when you need to copy-on-write + */ +struct pcred *task_clone_pcred(const struct task_struct *tsk, int gfp) +{ + struct pcred *pcred, *new; + + pcred = task_getpcred(tsk); + new = pcred_clone(pcred, gfp); + put_pcred(pcred); + return new; +} + +/* + * task_setucred - replace a task's UNIX credentials + * @tsk: pointer to task + * @cred: new task pcred + * + * Note: This function assumes that the caller has checked capabilities etc. + */ +static int task_setucred(struct task_struct *tsk, struct ucred *cred) +{ + struct pcred *pcred; + + pcred = task_getpcred(tsk); + pcred_setucred(pcred, cred); + put_pcred(pcred); + return 0; +} + +/** + * task_setresuid - set a task's process uid, effective uid, and saved uid + * @tsk: pointer to task + * @uid: real uid + * @euid: effective uid + * @suid: saved uid + * + * Note: This function assumes that the caller has checked capabilities etc. + */ +int task_setresuid(struct task_struct *tsk, uid_t uid, uid_t euid, uid_t suid) +{ + struct pcred *pcred; + int err; + + pcred = task_getpcred(tsk); + err = pcred_setresuid(pcred, uid, euid, suid); + put_pcred(pcred); + return err; +} + +/** + * task_setresgid - set a task's process gid, effective gid, and saved gid + * @tsk: pointer to task + * @gid: real gid + * @egid: effective gid + * @sgid: saved gid + * + * Note: This function assumes that the caller has checked capabilities etc. + */ +int task_setresgid(struct task_struct *tsk, gid_t gid, gid_t egid, gid_t sgid) +{ + struct pcred *pcred; + int err; + + pcred = task_getpcred(tsk); + err = pcred_setresgid(pcred, gid, egid, sgid); + put_pcred(pcred); + return err; +} + +/* + * task_clone_ucred - Clone a task's ucred + * @tsk: pointer to task. + * @gfp: allocation mode + * + * Use this one when you need to copy-on-write + */ +static struct ucred *task_clone_ucred(const struct task_struct *tsk, int gfp) +{ + struct ucred *cred, *new; + + cred = task_getucred(tsk); + new = ucred_clone(cred, gfp); + put_ucred(cred); + return new; +} + +/** + * task_setfsuid - set a task's ucred uid + * @tsk: pointer to task + * @uid: new fsuid + */ +int task_setfsuid(struct task_struct *tsk, uid_t uid) +{ + struct ucred *cred; + + if (task_fsuid(tsk) == uid) + return 0; + cred = task_clone_ucred(tsk, GFP_KERNEL); + if (!cred) + return -ENOMEM; + cred->uid = uid; + task_setucred(tsk, cred); + put_ucred(cred); + return 0; +} + +/** + * task_setfsgid - set a task's ucred uid + * @tsk: pointer to task + * @gid: new fsgid + */ +int task_setfsgid(struct task_struct *tsk, gid_t gid) +{ + struct ucred *cred; + + if (task_fsgid(tsk) == gid) + return 0; + cred = task_clone_ucred(tsk, GFP_KERNEL); + if (!cred) + return -ENOMEM; + cred->gid = gid; + task_setucred(tsk, cred); + put_ucred(cred); + return 0; +} + +/** + * task_setgroups - set a task's group list + * @tsk: pointer to task + * @ngroups: number of elements in groups array + * @groups: source array of groups + */ +int task_setgroups(struct task_struct *tsk, unsigned int ngroups, const gid_t *groups) +{ + struct ucred *cred; + int err; + + cred = task_clone_ucred(tsk, GFP_KERNEL); + if (!cred) + return -ENOMEM; + err = ucred_setgroups(cred, ngroups, groups); + if (!err) + task_setucred(tsk, cred); + put_ucred(cred); + return err; +} + +/** + * task_usersetgroups - set a task's group list from user + * @tsk: pointer to task + * @ngroups: number of elements in groups array + * @groups: source array of groups + */ +int task_usersetgroups(struct task_struct *tsk, unsigned int ngroups, const gid_t *groups) +{ + struct ucred *cred; + int err; + + cred = task_clone_ucred(tsk, GFP_KERNEL); + if (!cred) + return -ENOMEM; + err = ucred_usersetgroups(cred, ngroups, groups); + if (!err) + task_setucred(tsk, cred); + put_ucred(cred); + return err; +} + +/** + * task_getgroups - return a task's group list + * @tsk: pointer to task + * @ngroups: maximum size of groups array + * @groups: copy destination array + */ +int task_getgroups(const struct task_struct *tsk, unsigned int ngroups, gid_t *groups) +{ + struct ucred *ucred = task_getucred(tsk); + int res = ucred_getgroups(ucred, ngroups, groups); + put_ucred(ucred); + return res; +} + +/** + * task_usergetgroups - return a task's group list to user + * @tsk: pointer to task + * @ngroups: maximum size of groups array + * @groups: user copy destination array + */ +int task_usergetgroups(const struct task_struct *tsk, unsigned int ngroups, gid_t *groups) +{ + struct ucred *ucred = task_getucred(tsk); + int res = ucred_usergetgroups(ucred, ngroups, groups); + put_ucred(ucred); + return res; +} + +/* + * task_match_supplemental - match a gid in a task's group list + * @tsk: pointer to task + * @gid: gid to match + */ +static int task_match_supplemental(const struct task_struct *tsk, gid_t gid) +{ + struct ucred *ucred = task_getucred(tsk); + int res = ucred_match_supplemental(ucred, gid); + put_ucred(ucred); + return res; +} + +int in_group_p(gid_t gid) +{ + struct ucred *ucred = task_getucred(current); + if (gid == ucred->gid) + goto out_ok; + if (ucred_match_supplemental(ucred, gid)) + goto out_ok; + put_ucred(ucred); + return 0; +out_ok: + put_ucred(ucred); + return 1; +} + +int in_egroup_p(gid_t gid) +{ + if (gid == task_egid(current)) + return 1; + return task_match_supplemental(current, gid); +} + +#ifdef CONFIG_UID16 +/* + * ucred_oldsetgroups - set the supplemental group membership in a ucred + * @ucred: ucred to modify + * @ngroups: number of elements in groups array + * @groups: source array of "old-style" groups + */ +static int ucred_oldsetgroups(struct ucred *cred, unsigned int ngroups, const old_gid_t *src) +{ + gid_t *dst; + int i, err; + if ((err = ucred_growgroups(cred, ngroups)) != 0) + return err; + cred->ngroups = ngroups; + dst = cred->groups; + for (i = ngroups; i != 0; i--) + *dst++ = (gid_t)*src++; + return 0; +} + +/** + * ucred_oldgetgroups - return the supplemental groups from a ucred + * @ucred: ucred to read + * @ngroups: maximum size of groups array + * @groups: copy destination array + * + */ +static int ucred_oldgetgroups(const struct ucred *cred, unsigned int ngroups, old_gid_t *dst) +{ + gid_t *src = cred->groups; + int i; + if (ngroups > cred->ngroups) + ngroups = cred->ngroups; + for (i = ngroups; i != 0; i--) + *dst++ = (old_gid_t)*src++; + return ngroups; +} + +/** + * task_oldsetgroups - set a task's group list + * @tsk: pointer to task + * @ngroups: number of elements in list of groups + * @groups: source array of "old-style" groups + */ +int task_oldsetgroups(struct task_struct *tsk, unsigned int ngroups, const old_gid_t *groups) +{ + struct ucred *cred; + int err; + + cred = task_clone_ucred(tsk, GFP_KERNEL); + if (!cred) + return -ENOMEM; + err = ucred_oldsetgroups(cred, ngroups, groups); + if (!err) + task_setucred(tsk, cred); + put_ucred(cred); + return err; +} + +/** + * task_oldgetgroups - return a task's group list + * @tsk: pointer to task + * @ngroups: maximum size of groups array + * @groups: copy destination array + */ +int task_oldgetgroups(const struct task_struct *tsk, unsigned int ngroups, old_gid_t *groups) +{ + struct ucred *ucred = task_getucred(tsk); + int res = ucred_oldgetgroups(ucred, ngroups, groups); + put_ucred(ucred); + return res; +} + +#endif /* CONFIG_UID16 */ + +#if defined(CONFIG_SPARC64) || defined(CONFIG_ARCH_S390X) +/* + * ucred_setgroups16 - set the supplemental group membership in a ucred + * @ucred: ucred to modify + * @ngroups: number of elements in group array + * @groups: source array of groups + */ +static int ucred_setgroups16(struct ucred *cred, unsigned int ngroups, const gid16_t *src) +{ + gid_t *dst; + int i, err; + if ((err = ucred_growgroups(cred, ngroups)) != 0) + return err; + cred->ngroups = ngroups; + dst = cred->groups; + for (i = ngroups; i != 0; i--) + *dst++ = (gid_t)*src++; + return 0; +} + +/** + * ucred_getgroups16 - return the supplemental groups from a ucred + * @ucred: ucred to read + * @ngroups: maximum size of groups array + * @groups: copy destination array + */ +static int ucred_getgroups16(const struct ucred *cred, unsigned int ngroups, gid16_t *dst) +{ + gid_t *src = cred->groups; + int i; + if (ngroups > cred->ngroups) + ngroups = cred->ngroups; + for (i = ngroups; i != 0; i--) + *dst++ = (gid16_t)*src++; + return ngroups; +} + +/** + * task_setgroups16 - set a task's group list + * @tsk: pointer to task + * @ngroups: number of elements in array of groups + * @groups: source array of 16-bit groups + */ +int task_setgroups16(struct task_struct *tsk, unsigned int ngroups, const gid16_t *groups) +{ + struct ucred *cred; + int err; + + cred = task_clone_ucred(tsk, GFP_KERNEL); + if (!cred) + return -ENOMEM; + err = ucred_setgroups16(cred, ngroups, groups); + if (!err) + task_setucred(tsk, cred); + put_ucred(cred); + return err; +} + +/** + * task_getgroups16 - return a task's group list + * @tsk: pointer to task + * @ngroups: maximum size of groups array + * @groups: copy destination array + */ +int task_getgroups16(const struct task_struct *tsk, unsigned int ngroups, gid16_t *groups) +{ + struct ucred *ucred = task_getucred(tsk); + int res = ucred_getgroups16(ucred, ngroups, groups); + put_ucred(ucred); + return res; +} + +#endif /* defined(CONFIG_SPARC64) || defined(CONFIG_ARCH_S390X) */ diff -u --recursive --new-file linux-2.5.3/kernel/exit.c linux-2.5.3-fixup_cred/kernel/exit.c --- linux-2.5.3/kernel/exit.c Mon Jan 28 22:06:33 2002 +++ linux-2.5.3-fixup_cred/kernel/exit.c Sat Feb 2 18:26:06 2002 @@ -37,8 +37,9 @@ #ifdef CONFIG_SMP wait_task_inactive(p); #endif - atomic_dec(&p->user->processes); - free_uid(p->user); + atomic_dec(&p->pcred->user->processes); + atomic_dec(&p->pcred->proc_count); + put_pcred(p->pcred); unhash_process(p); release_thread(p); @@ -182,7 +183,7 @@ current->cap_permitted = CAP_FULL_SET; current->keep_capabilities = 0; memcpy(current->rlim, init_task.rlim, sizeof(*(current->rlim))); - current->user = INIT_USER; + pcred_setuser(current->pcred, init_pcred.user); write_unlock_irq(&tasklist_lock); } diff -u --recursive --new-file linux-2.5.3/kernel/fork.c linux-2.5.3-fixup_cred/kernel/fork.c --- linux-2.5.3/kernel/fork.c Tue Jan 29 00:11:45 2002 +++ linux-2.5.3-fixup_cred/kernel/fork.c Sat Feb 2 16:56:43 2002 @@ -417,6 +417,17 @@ return i; } +static inline int copy_cred(unsigned long clone_flags, struct task_struct * tsk) +{ + if (!(clone_flags & CLONE_CRED)) { + tsk->pcred = task_clone_pcred(current, GFP_KERNEL); + if (!tsk->pcred) + return -ENOMEM; + } else + tsk->pcred = task_getpcred(current); + return 0; +} + static int copy_files(unsigned long clone_flags, struct task_struct * tsk) { struct files_struct *oldf, *newf; @@ -591,15 +602,17 @@ *p = *current; + if (copy_cred(clone_flags, p)) + goto bad_fork_free; + atomic_inc(&p->pcred->proc_count); + atomic_inc(&p->pcred->user->processes); + retval = -EAGAIN; - if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur) { + if (atomic_read(&p->pcred->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur) { if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE)) goto bad_fork_free; } - atomic_inc(&p->user->__count); - atomic_inc(&p->user->processes); - /* * Counter increases are protected by * the kernel lock so nr_threads can't @@ -775,8 +788,9 @@ if (p->binfmt && p->binfmt->module) __MOD_DEC_USE_COUNT(p->binfmt->module); bad_fork_cleanup_count: - atomic_dec(&p->user->processes); - free_uid(p->user); + atomic_dec(&p->pcred->user->processes); + atomic_dec(&p->pcred->proc_count); + put_pcred(p->pcred); bad_fork_free: free_task_struct(p); goto fork_out; diff -u --recursive --new-file linux-2.5.3/kernel/kmod.c linux-2.5.3-fixup_cred/kernel/kmod.c --- linux-2.5.3/kernel/kmod.c Tue Jan 15 20:07:01 2002 +++ linux-2.5.3-fixup_cred/kernel/kmod.c Sat Feb 2 16:18:12 2002 @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -97,6 +98,7 @@ { int i; struct task_struct *curtask = current; + struct pcred *pcred; curtask->session = 1; curtask->pgrp = 1; @@ -120,19 +122,12 @@ if (curtask->files->fd[i]) close(i); } - /* Drop the "current user" thing */ - { - struct user_struct *user = curtask->user; - curtask->user = INIT_USER; - atomic_inc(&INIT_USER->__count); - atomic_inc(&INIT_USER->processes); - atomic_dec(&user->processes); - free_uid(user); - } - /* Give kmod all effective privileges.. */ - curtask->euid = curtask->fsuid = 0; - curtask->egid = curtask->fsgid = 0; + pcred = pcred_clone(&init_pcred, GFP_KERNEL); + if (!pcred) + return -ENOMEM; + task_setpcred(curtask, pcred); + put_pcred(pcred); cap_set_full(curtask->cap_effective); /* Allow execve args to be in kernel space. */ diff -u --recursive --new-file linux-2.5.3/kernel/ksyms.c linux-2.5.3-fixup_cred/kernel/ksyms.c --- linux-2.5.3/kernel/ksyms.c Tue Jan 29 19:47:10 2002 +++ linux-2.5.3-fixup_cred/kernel/ksyms.c Sat Feb 2 18:20:40 2002 @@ -167,6 +167,7 @@ EXPORT_SYMBOL(__mark_inode_dirty); EXPORT_SYMBOL(get_empty_filp); EXPORT_SYMBOL(init_private_file); +EXPORT_SYMBOL(release_private_file); EXPORT_SYMBOL(filp_open); EXPORT_SYMBOL(filp_close); EXPORT_SYMBOL(put_filp); @@ -275,6 +276,19 @@ EXPORT_SYMBOL(fd_install); EXPORT_SYMBOL(put_unused_fd); +/* Credentials */ +EXPORT_SYMBOL(put_ucred); +EXPORT_SYMBOL(put_pcred); +EXPORT_SYMBOL(task_getgroups); +EXPORT_SYMBOL(task_setresuid); +EXPORT_SYMBOL(task_setfsuid); +EXPORT_SYMBOL(task_setfsgid); +EXPORT_SYMBOL(task_setgroups); +EXPORT_SYMBOL(task_setpcred); +EXPORT_SYMBOL(init_pcred); +EXPORT_SYMBOL(in_group_p); +EXPORT_SYMBOL(in_egroup_p); + /* for stackable file systems (lofs, wrapfs, cryptfs, etc.) */ EXPORT_SYMBOL(default_llseek); EXPORT_SYMBOL(dentry_open); diff -u --recursive --new-file linux-2.5.3/kernel/ptrace.c linux-2.5.3-fixup_cred/kernel/ptrace.c --- linux-2.5.3/kernel/ptrace.c Mon Jan 7 22:02:11 2002 +++ linux-2.5.3-fixup_cred/kernel/ptrace.c Sat Feb 2 16:05:49 2002 @@ -48,13 +48,13 @@ 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) || + if(((task_uid(current) != task_euid(task)) || + (task_uid(current) != task_suid(task)) || + (task_uid(current) != task_uid(task)) || + (task_gid(current) != task_egid(task)) || + (task_gid(current) != task_sgid(task)) || (!cap_issubset(task->cap_permitted, current->cap_permitted)) || - (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE)) + (task_gid(current) != task_gid(task))) && !capable(CAP_SYS_PTRACE)) goto bad; rmb(); if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE)) diff -u --recursive --new-file linux-2.5.3/kernel/sched.c linux-2.5.3-fixup_cred/kernel/sched.c --- linux-2.5.3/kernel/sched.c Tue Jan 29 00:12:47 2002 +++ linux-2.5.3-fixup_cred/kernel/sched.c Sat Feb 2 16:06:49 2002 @@ -1009,7 +1009,7 @@ if ((policy == SCHED_FIFO || policy == SCHED_RR) && !capable(CAP_SYS_NICE)) goto out_unlock; - if ((current->euid != p->euid) && (current->euid != p->uid) && + if ((task_euid(current) != task_euid(p)) && (task_euid(current) != task_uid(p)) && !capable(CAP_SYS_NICE)) goto out_unlock; diff -u --recursive --new-file linux-2.5.3/kernel/signal.c linux-2.5.3-fixup_cred/kernel/signal.c --- linux-2.5.3/kernel/signal.c Tue Jan 29 00:11:45 2002 +++ linux-2.5.3-fixup_cred/kernel/signal.c Sat Feb 2 16:06:49 2002 @@ -309,8 +309,8 @@ { return (!info || ((unsigned long)info != 1 && 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) + && (task_euid(current) ^ task_suid(t)) && (task_euid(current) ^ task_uid(t)) + && (task_uid(current) ^ task_suid(t)) && (task_uid(current) ^ task_uid(t)) && !capable(CAP_KILL); } @@ -426,7 +426,7 @@ 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 = task_uid(current); break; case 1: q->info.si_signo = sig; @@ -736,7 +736,7 @@ info.si_signo = sig; info.si_errno = 0; info.si_pid = tsk->pid; - info.si_uid = tsk->uid; + info.si_uid = task_uid(tsk); /* FIXME: find out whether or not this is supposed to be c*time. */ info.si_utime = tsk->times.tms_utime; @@ -980,7 +980,7 @@ info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current->pid; - info.si_uid = current->uid; + info.si_uid = task_uid(current); return kill_something_info(sig, &info, pid); } diff -u --recursive --new-file linux-2.5.3/kernel/sys.c linux-2.5.3-fixup_cred/kernel/sys.c --- linux-2.5.3/kernel/sys.c Mon Jan 7 21:55:16 2002 +++ linux-2.5.3-fixup_cred/kernel/sys.c Sat Feb 2 18:12:52 2002 @@ -187,8 +187,8 @@ return(p->pgrp == who); case PRIO_USER: if (!who) - who = current->uid; - return(p->uid == who); + who = task_uid(current); + return(task_uid(p) == who); } } return 0; @@ -213,8 +213,8 @@ for_each_task(p) { if (!proc_sel(p, which, who)) continue; - if (p->uid != current->euid && - p->uid != current->uid && !capable(CAP_SYS_NICE)) { + if (task_uid(p) != task_euid(current) && + task_uid(p) != task_uid(current) && !capable(CAP_SYS_NICE)) { error = -EPERM; continue; } @@ -375,41 +375,42 @@ */ asmlinkage long sys_setregid(gid_t rgid, gid_t egid) { - int old_rgid = current->gid; - int old_egid = current->egid; - int new_rgid = old_rgid; - int new_egid = old_egid; - - if (rgid != (gid_t) -1) { - if ((old_rgid == rgid) || - (current->egid==rgid) || - capable(CAP_SETGID)) - new_rgid = rgid; - else - return -EPERM; - } - if (egid != (gid_t) -1) { - if ((old_rgid == egid) || - (current->egid == egid) || - (current->sgid == egid) || - capable(CAP_SETGID)) - new_egid = egid; - else { - return -EPERM; - } - } - if (new_egid != old_egid) - { + struct pcred *pcred; + gid_t old_rgid, old_egid, old_sgid, new_sgid; + int error; + + pcred = current->pcred; + + old_rgid = pcred->gid; + old_egid = pcred->egid; + old_sgid = pcred->sgid; + new_sgid = NOGID; + + error = -EPERM; + if (rgid != NOGID) { + if (old_rgid!=rgid && old_egid!=rgid && !capable(CAP_SETGID)) + goto out_err; + } + if (egid != NOGID) { + if (old_rgid != egid && old_egid != egid && + old_sgid != egid && !capable(CAP_SETGID)) + goto out_err; + } + if (egid != NOGID && egid != old_rgid) + new_sgid = egid; + else if (rgid != NOGID) + new_sgid = old_egid; + + error = -EAGAIN; + if (task_setresgid(current, rgid, egid, new_sgid)) + goto out_err; + if (egid != NOGID && egid != old_egid) { current->mm->dumpable = 0; wmb(); } - 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; return 0; +out_err: + return error; } /* @@ -419,29 +420,31 @@ */ asmlinkage long sys_setgid(gid_t gid) { - int old_egid = current->egid; + struct pcred *pcred; + gid_t old_egid, new_rgid, new_sgid; + int error; + pcred = current->pcred; + + old_egid = pcred->egid; + new_rgid = new_sgid = NOGID; + + error = -EPERM; if (capable(CAP_SETGID)) - { - if(old_egid != gid) - { - current->mm->dumpable=0; - wmb(); - } - current->gid = current->egid = current->sgid = current->fsgid = gid; - } - else if ((gid == current->gid) || (gid == current->sgid)) - { - if(old_egid != gid) - { - current->mm->dumpable=0; - wmb(); - } - current->egid = current->fsgid = gid; + new_rgid = new_sgid = gid; + else if (gid != pcred->gid && gid != pcred->sgid) + goto out_err; + + error = -EAGAIN; + if (task_setresgid(current, new_rgid, gid, new_sgid)) + goto out_err; + if(old_egid != gid) { + current->mm->dumpable=0; + wmb(); } - else - return -EPERM; return 0; +out_err: + return error; } /* @@ -477,46 +480,19 @@ int old_suid) { if ((old_ruid == 0 || old_euid == 0 || old_suid == 0) && - (current->uid != 0 && current->euid != 0 && current->suid != 0) && + (task_uid(current) != 0 && task_euid(current) != 0 && task_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 && task_euid(current) != 0) { cap_clear(current->cap_effective); } - if (old_euid != 0 && current->euid == 0) { + if (old_euid != 0 && task_euid(current) == 0) { current->cap_effective = current->cap_permitted; } } -static int set_user(uid_t new_ruid, int dumpclear) -{ - struct user_struct *new_user, *old_user; - - /* What if a process setreuid()'s and this brings the - * new uid over his NPROC rlimit? We can check this now - * cheaply with the new uid cache, so if it matters - * we should be checking for it. -DaveM - */ - new_user = alloc_uid(new_ruid); - if (!new_user) - return -EAGAIN; - old_user = current->user; - atomic_dec(&old_user->processes); - atomic_inc(&new_user->processes); - - if(dumpclear) - { - current->mm->dumpable = 0; - wmb(); - } - current->uid = new_ruid; - current->user = new_user; - free_uid(old_user); - return 0; -} - /* * Unprivileged users may change the real uid to the effective uid * or vice versa. (BSD-style) @@ -534,48 +510,53 @@ */ asmlinkage long sys_setreuid(uid_t ruid, uid_t euid) { - int old_ruid, old_euid, old_suid, new_ruid, new_euid; + struct pcred *pcred; + uid_t old_ruid, old_euid, old_suid, new_suid; + int error; - new_ruid = old_ruid = current->uid; - new_euid = old_euid = current->euid; - old_suid = current->suid; + pcred = current->pcred; - if (ruid != (uid_t) -1) { - new_ruid = ruid; + old_ruid = pcred->uid; + old_euid = pcred->euid; + old_suid = pcred->suid; + new_suid = NOUID; + + error = -EPERM; + if (ruid != NOUID) { if ((old_ruid != ruid) && - (current->euid != ruid) && + (old_euid != ruid) && !capable(CAP_SETUID)) - return -EPERM; + goto out_err; } - if (euid != (uid_t) -1) { - new_euid = euid; + if (euid != NOUID) { if ((old_ruid != euid) && - (current->euid != euid) && - (current->suid != euid) && + (old_euid != euid) && + (old_suid != euid) && !capable(CAP_SETUID)) - return -EPERM; + goto out_err; } - if (new_ruid != old_ruid && set_user(new_ruid, new_euid != old_euid) < 0) - return -EAGAIN; + if (euid != NOUID && euid != old_ruid) + new_suid = euid; + else if (ruid != NOUID) + new_suid = old_euid; - if (new_euid != old_euid) - { + error = -EAGAIN; + if (task_setresuid(current, ruid, euid, new_suid)) + goto out_err; + + if (euid != NOUID && euid != old_euid) { current->mm->dumpable=0; wmb(); } - current->fsuid = current->euid = new_euid; - if (ruid != (uid_t) -1 || - (euid != (uid_t) -1 && euid != old_ruid)) - current->suid = current->euid; - current->fsuid = current->euid; - if (!issecure(SECURE_NO_SETUID_FIXUP)) { + if (!issecure(SECURE_NO_SETUID_FIXUP)) cap_emulate_setxuid(old_ruid, old_euid, old_suid); - } return 0; +out_err: + return error; } @@ -593,33 +574,38 @@ */ asmlinkage long sys_setuid(uid_t uid) { - int old_euid = current->euid; - int old_ruid, old_suid, new_ruid, new_suid; + struct pcred *pcred; + uid_t old_euid, old_ruid, old_suid; + int error; + + pcred = current->pcred; - old_ruid = new_ruid = current->uid; - old_suid = current->suid; - new_suid = old_suid; + old_euid = pcred->euid; + old_ruid = pcred->uid; + old_suid = pcred->suid; + error = -EAGAIN; 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)) - return -EPERM; - - if (old_euid != uid) - { + if (task_setresuid(current, uid, uid, uid)) + goto out_err; + } else if (uid == old_ruid || uid == old_suid) { + if (task_setresuid(current, NOUID, uid, NOUID)) + goto out_err; + } else { + error = -EPERM; + goto out_err; + } + if (old_euid != uid) { current->mm->dumpable = 0; wmb(); } - current->fsuid = current->euid = uid; - current->suid = new_suid; - if (!issecure(SECURE_NO_SETUID_FIXUP)) { + if (!issecure(SECURE_NO_SETUID_FIXUP)) cap_emulate_setxuid(old_ruid, old_euid, old_suid); - } return 0; +out_err: + return error; } @@ -629,51 +615,50 @@ */ 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; + struct pcred *pcred; + uid_t old_euid, old_ruid, old_suid; + int error; + + pcred = current->pcred; + + old_ruid = pcred->uid; + old_euid = pcred->euid; + old_suid = pcred->suid; + error = -EPERM; if (!capable(CAP_SETUID)) { - if ((ruid != (uid_t) -1) && (ruid != current->uid) && - (ruid != current->euid) && (ruid != current->suid)) - return -EPERM; - if ((euid != (uid_t) -1) && (euid != current->uid) && - (euid != current->euid) && (euid != current->suid)) - return -EPERM; - if ((suid != (uid_t) -1) && (suid != current->uid) && - (suid != current->euid) && (suid != current->suid)) - return -EPERM; - } - if (ruid != (uid_t) -1) { - if (ruid != current->uid && set_user(ruid, euid != current->euid) < 0) - return -EAGAIN; - } - if (euid != (uid_t) -1) { - if (euid != current->euid) - { - current->mm->dumpable = 0; - wmb(); - } - current->euid = euid; - current->fsuid = euid; + if ((ruid != NOUID) && (ruid != old_ruid) && + (ruid != old_euid) && (ruid != old_suid)) + goto out_err; + if ((euid != NOUID) && (euid != old_ruid) && + (euid != old_euid) && (euid != old_suid)) + goto out_err; + if ((suid != NOUID) && (suid != old_ruid) && + (suid != old_euid) && (suid != old_suid)) + goto out_err; + } + error = -EAGAIN; + if (task_setresuid(current, ruid, euid, suid)) + goto out_err; + if (euid != NOUID && euid != old_euid) { + current->mm->dumpable = 0; + wmb(); } - if (suid != (uid_t) -1) - current->suid = suid; - - if (!issecure(SECURE_NO_SETUID_FIXUP)) { + if (!issecure(SECURE_NO_SETUID_FIXUP)) cap_emulate_setxuid(old_ruid, old_euid, old_suid); - } return 0; +out_err: + return error; } asmlinkage long sys_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) { 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(task_uid(current), ruid)) && + !(retval = put_user(task_euid(current), euid))) + retval = put_user(task_suid(current), suid); return retval; } @@ -683,40 +668,47 @@ */ asmlinkage long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid) { + struct pcred *pcred; + gid_t old_egid, old_rgid, old_sgid; + int error; + + pcred = current->pcred; + + old_rgid = pcred->gid; + old_egid = pcred->egid; + old_sgid = pcred->sgid; + + error = -EPERM; if (!capable(CAP_SETGID)) { - if ((rgid != (gid_t) -1) && (rgid != current->gid) && - (rgid != current->egid) && (rgid != current->sgid)) - return -EPERM; - if ((egid != (gid_t) -1) && (egid != current->gid) && - (egid != current->egid) && (egid != current->sgid)) - return -EPERM; - if ((sgid != (gid_t) -1) && (sgid != current->gid) && - (sgid != current->egid) && (sgid != current->sgid)) - return -EPERM; - } - if (egid != (gid_t) -1) { - if (egid != current->egid) - { - current->mm->dumpable = 0; - wmb(); - } - current->egid = egid; - current->fsgid = egid; + if ((rgid != NOGID) && (rgid != old_rgid) && + (rgid != old_egid) && (rgid != old_sgid)) + goto out_err; + if ((egid != NOGID) && (egid != old_rgid) && + (egid != old_egid) && (egid != old_sgid)) + goto out_err; + if ((sgid != NOGID) && (sgid != old_rgid) && + (sgid != old_egid) && (sgid != old_sgid)) + goto out_err; + } + error = -EAGAIN; + if (task_setresgid(current, rgid, egid, sgid)) + goto out_err; + if (egid != NOGID && egid != old_egid) { + current->mm->dumpable = 0; + wmb(); } - if (rgid != (gid_t) -1) - current->gid = rgid; - if (sgid != (gid_t) -1) - current->sgid = sgid; return 0; +out_err: + return error; } asmlinkage long sys_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) { 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(task_gid(current), rgid)) && + !(retval = put_user(task_egid(current), egid))) + retval = put_user(task_sgid(current), sgid); return retval; } @@ -730,11 +722,11 @@ */ asmlinkage long sys_setfsuid(uid_t uid) { - int old_fsuid; + uid_t old_fsuid; - old_fsuid = current->fsuid; - if (uid == current->uid || uid == current->euid || - uid == current->suid || uid == current->fsuid || + old_fsuid = task_fsuid(current); + if (uid == task_uid(current) || uid == task_euid(current) || + uid == task_suid(current) || uid == task_fsuid(current) || capable(CAP_SETUID)) { if (uid != old_fsuid) @@ -742,7 +734,7 @@ current->mm->dumpable = 0; wmb(); } - current->fsuid = uid; + task_setfsuid(current, uid); } /* We emulate fsuid by essentially doing a scaled-down version @@ -755,10 +747,10 @@ */ if (!issecure(SECURE_NO_SETUID_FIXUP)) { - if (old_fsuid == 0 && current->fsuid != 0) { + if (old_fsuid == 0 && task_fsuid(current) != 0) { cap_t(current->cap_effective) &= ~CAP_FS_MASK; } - if (old_fsuid != 0 && current->fsuid == 0) { + if (old_fsuid != 0 && task_fsuid(current) == 0) { cap_t(current->cap_effective) |= (cap_t(current->cap_permitted) & CAP_FS_MASK); } @@ -772,11 +764,11 @@ */ asmlinkage long sys_setfsgid(gid_t gid) { - int old_fsgid; + gid_t old_fsgid; - old_fsgid = current->fsgid; - if (gid == current->gid || gid == current->egid || - gid == current->sgid || gid == current->fsgid || + old_fsgid = task_fsgid(current); + if (gid == task_gid(current) || gid == task_egid(current) || + gid == task_sgid(current) || gid == task_fsgid(current) || capable(CAP_SETGID)) { if (gid != old_fsgid) @@ -784,7 +776,7 @@ current->mm->dumpable = 0; wmb(); } - current->fsgid = gid; + task_setfsgid(current, gid); } return old_fsgid; } @@ -939,7 +931,7 @@ */ asmlinkage long sys_getgroups(int gidsetsize, gid_t *grouplist) { - int i; + int i = 0; /* * SMP: Nobody else can change our grouplist. Thus we are @@ -948,66 +940,25 @@ if (gidsetsize < 0) return -EINVAL; - i = current->ngroups; if (gidsetsize) { - if (i > gidsetsize) - return -EINVAL; - if (copy_to_user(grouplist, current->groups, sizeof(gid_t)*i)) - return -EFAULT; - } + i = task_usergetgroups(current, NGROUPS, grouplist); + if (i <= 0) + goto out; + } else + i = task_ngroups(current); +out: return i; } /* - * SMP: Our groups are not shared. We can copy to/from them safely - * without another task interfering. + * Our groups are shared. */ asmlinkage long sys_setgroups(int gidsetsize, gid_t *grouplist) { if (!capable(CAP_SETGID)) return -EPERM; - if ((unsigned) gidsetsize > NGROUPS) - return -EINVAL; - if(copy_from_user(current->groups, grouplist, gidsetsize * sizeof(gid_t))) - return -EFAULT; - current->ngroups = gidsetsize; - return 0; -} - -static int supplemental_group_member(gid_t grp) -{ - int i = current->ngroups; - - if (i) { - gid_t *groups = current->groups; - do { - if (*groups == grp) - return 1; - groups++; - i--; - } while (i); - } - return 0; -} - -/* - * Check whether we're fsgid/egid or in the supplemental group.. - */ -int in_group_p(gid_t grp) -{ - int retval = 1; - if (grp != current->fsgid) - retval = supplemental_group_member(grp); - return retval; -} - -int in_egroup_p(gid_t grp) -{ - int retval = 1; - if (grp != current->egid) - retval = supplemental_group_member(grp); - return retval; + return task_usersetgroups(current, gidsetsize, grouplist); } DECLARE_RWSEM(uts_sem); @@ -1268,5 +1219,3 @@ EXPORT_SYMBOL(notifier_call_chain); EXPORT_SYMBOL(register_reboot_notifier); EXPORT_SYMBOL(unregister_reboot_notifier); -EXPORT_SYMBOL(in_group_p); -EXPORT_SYMBOL(in_egroup_p); diff -u --recursive --new-file linux-2.5.3/kernel/sysctl.c linux-2.5.3-fixup_cred/kernel/sysctl.c --- linux-2.5.3/kernel/sysctl.c Sun Dec 30 02:30:07 2001 +++ linux-2.5.3-fixup_cred/kernel/sysctl.c Sat Feb 2 16:05:49 2002 @@ -376,7 +376,7 @@ static int test_perm(int mode, int op) { - if (!current->euid) + if (!task_euid(current)) mode >>= 6; else if (in_egroup_p(0)) mode >>= 3; diff -u --recursive --new-file linux-2.5.3/kernel/timer.c linux-2.5.3-fixup_cred/kernel/timer.c --- linux-2.5.3/kernel/timer.c Tue Jan 15 23:33:55 2002 +++ linux-2.5.3-fixup_cred/kernel/timer.c Sat Feb 2 16:05:49 2002 @@ -772,25 +772,25 @@ asmlinkage long sys_getuid(void) { /* Only we change this so SMP safe */ - return current->uid; + return task_uid(current); } asmlinkage long sys_geteuid(void) { /* Only we change this so SMP safe */ - return current->euid; + return task_euid(current); } asmlinkage long sys_getgid(void) { /* Only we change this so SMP safe */ - return current->gid; + return task_gid(current); } asmlinkage long sys_getegid(void) { /* Only we change this so SMP safe */ - return current->egid; + return task_egid(current); } #endif diff -u --recursive --new-file linux-2.5.3/kernel/uid16.c linux-2.5.3-fixup_cred/kernel/uid16.c --- linux-2.5.3/kernel/uid16.c Tue Jan 11 03:40:26 2000 +++ linux-2.5.3-fixup_cred/kernel/uid16.c Sat Feb 2 16:06:49 2002 @@ -72,9 +72,9 @@ { 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(task_uid(current)), ruid)) && + !(retval = put_user(high2lowuid(task_euid(current)), euid))) + retval = put_user(high2lowuid(task_suid(current)), suid); return retval; } @@ -89,9 +89,9 @@ { 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(task_gid(current)), rgid)) && + !(retval = put_user(high2lowgid(task_egid(current)), egid))) + retval = put_user(high2lowgid(task_sgid(current)), sgid); return retval; } @@ -109,26 +109,26 @@ asmlinkage long sys_getgroups16(int gidsetsize, old_gid_t *grouplist) { old_gid_t groups[NGROUPS]; - int i,j; + int i = 0; if (gidsetsize < 0) return -EINVAL; - i = current->ngroups; if (gidsetsize) { + i = task_oldgetgroups(current, NGROUPS, groups); + if (i <= 0) + goto out; if (i > gidsetsize) return -EINVAL; - for(j=0;jgroups[j]; if (copy_to_user(grouplist, groups, sizeof(old_gid_t)*i)) return -EFAULT; } +out: return i; } asmlinkage long sys_setgroups16(int gidsetsize, old_gid_t *grouplist) { old_gid_t groups[NGROUPS]; - int i; if (!capable(CAP_SETGID)) return -EPERM; @@ -136,28 +136,25 @@ return -EINVAL; if (copy_from_user(groups, grouplist, gidsetsize * sizeof(old_gid_t))) return -EFAULT; - for (i = 0 ; i < gidsetsize ; i++) - current->groups[i] = (gid_t)groups[i]; - current->ngroups = gidsetsize; - return 0; + return task_oldsetgroups(current, gidsetsize, groups); } asmlinkage long sys_getuid16(void) { - return high2lowuid(current->uid); + return high2lowuid(task_uid(current)); } asmlinkage long sys_geteuid16(void) { - return high2lowuid(current->euid); + return high2lowuid(task_euid(current)); } asmlinkage long sys_getgid16(void) { - return high2lowgid(current->gid); + return high2lowgid(task_gid(current)); } asmlinkage long sys_getegid16(void) { - return high2lowgid(current->egid); + return high2lowgid(task_egid(current)); } diff -u --recursive --new-file linux-2.5.3/kernel/user.c linux-2.5.3-fixup_cred/kernel/user.c --- linux-2.5.3/kernel/user.c Wed Nov 29 07:43:39 2000 +++ linux-2.5.3-fixup_cred/kernel/user.c Sat Feb 2 16:06:49 2002 @@ -27,7 +27,7 @@ static spinlock_t uidhash_lock = SPIN_LOCK_UNLOCKED; struct user_struct root_user = { - __count: ATOMIC_INIT(1), + __count: ATOMIC_INIT(2), processes: ATOMIC_INIT(1), files: ATOMIC_INIT(0) }; diff -u --recursive --new-file linux-2.5.3/mm/oom_kill.c linux-2.5.3-fixup_cred/mm/oom_kill.c --- linux-2.5.3/mm/oom_kill.c Tue Jan 22 00:55:46 2002 +++ linux-2.5.3-fixup_cred/mm/oom_kill.c Sat Feb 2 16:06:49 2002 @@ -90,7 +90,7 @@ * less likely that we kill those. */ if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_ADMIN) || - p->uid == 0 || p->euid == 0) + task_uid(p) == 0 || task_euid(p) == 0) points /= 4; /* diff -u --recursive --new-file linux-2.5.3/mm/shmem.c linux-2.5.3-fixup_cred/mm/shmem.c --- linux-2.5.3/mm/shmem.c Tue Jan 22 00:37:32 2002 +++ linux-2.5.3-fixup_cred/mm/shmem.c Sat Feb 2 16:05:50 2002 @@ -678,8 +678,8 @@ inode = new_inode(sb); if (inode) { inode->i_mode = mode; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = task_fsuid(current); + inode->i_gid = task_fsgid(current); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_rdev = NODEV; diff -u --recursive --new-file linux-2.5.3/net/ax25/af_ax25.c linux-2.5.3-fixup_cred/net/ax25/af_ax25.c --- linux-2.5.3/net/ax25/af_ax25.c Fri Sep 14 02:16:23 2001 +++ linux-2.5.3-fixup_cred/net/ax25/af_ax25.c Sat Feb 2 16:05:51 2002 @@ -1069,7 +1069,7 @@ if (addr->fsa_ax25.sax25_family != AF_AX25) return -EINVAL; - call = ax25_findbyuid(current->euid); + call = ax25_findbyuid(task_euid(current)); if (call == NULL && ax25_uid_policy && !capable(CAP_NET_ADMIN)) return -EACCES; diff -u --recursive --new-file linux-2.5.3/net/ax25/ax25_route.c linux-2.5.3-fixup_cred/net/ax25/ax25_route.c --- linux-2.5.3/net/ax25/ax25_route.c Fri Dec 29 23:35:47 2000 +++ linux-2.5.3-fixup_cred/net/ax25/ax25_route.c Sat Feb 2 16:05:51 2002 @@ -362,7 +362,7 @@ if ((ax25->ax25_dev = ax25_dev_ax25dev(ax25_rt->dev)) == NULL) return -EHOSTUNREACH; - if ((call = ax25_findbyuid(current->euid)) == NULL) { + if ((call = ax25_findbyuid(task_euid(current))) == NULL) { if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) return -EPERM; call = (ax25_address *)ax25->ax25_dev->dev->dev_addr; diff -u --recursive --new-file linux-2.5.3/net/core/scm.c linux-2.5.3-fixup_cred/net/core/scm.c --- linux-2.5.3/net/core/scm.c Tue Jan 15 19:56:35 2002 +++ linux-2.5.3-fixup_cred/net/core/scm.c Sat Feb 2 16:06:49 2002 @@ -37,13 +37,13 @@ * setu(g)id. */ -static __inline__ int scm_check_creds(struct ucred *creds) +static __inline__ int scm_check_creds(struct scm_ucred *creds) { if ((creds->pid == current->pid || 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 == task_uid(current) || creds->uid == task_euid(current) || + creds->uid == task_suid(current)) || capable(CAP_SETUID)) && + ((creds->gid == task_gid(current) || creds->gid == task_egid(current) || + creds->gid == task_sgid(current)) || capable(CAP_SETGID))) { return 0; } return -EPERM; @@ -140,9 +140,9 @@ goto error; break; case SCM_CREDENTIALS: - if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct ucred))) + if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct scm_ucred))) goto error; - memcpy(&p->creds, CMSG_DATA(cmsg), sizeof(struct ucred)); + memcpy(&p->creds, CMSG_DATA(cmsg), sizeof(struct scm_ucred)); err = scm_check_creds(&p->creds); if (err) goto error; diff -u --recursive --new-file linux-2.5.3/net/ipv4/netfilter/ipt_owner.c linux-2.5.3-fixup_cred/net/ipv4/netfilter/ipt_owner.c --- linux-2.5.3/net/ipv4/netfilter/ipt_owner.c Sun Sep 30 21:26:08 2001 +++ linux-2.5.3-fixup_cred/net/ipv4/netfilter/ipt_owner.c Sat Feb 2 16:06:49 2002 @@ -92,13 +92,13 @@ return 0; if(info->match & IPT_OWNER_UID) { - if((skb->sk->socket->file->f_uid != info->uid) ^ + if((skb->sk->socket->file->f_cred->uid != info->uid) ^ !!(info->invert & IPT_OWNER_UID)) return 0; } if(info->match & IPT_OWNER_GID) { - if((skb->sk->socket->file->f_gid != info->gid) ^ + if((skb->sk->socket->file->f_cred->gid != info->gid) ^ !!(info->invert & IPT_OWNER_GID)) return 0; } diff -u --recursive --new-file linux-2.5.3/net/ipv6/ip6_flowlabel.c linux-2.5.3-fixup_cred/net/ipv6/ip6_flowlabel.c --- linux-2.5.3/net/ipv6/ip6_flowlabel.c Mon Aug 7 07:20:09 2000 +++ linux-2.5.3-fixup_cred/net/ipv6/ip6_flowlabel.c Sat Feb 2 16:05:51 2002 @@ -337,7 +337,7 @@ fl->owner = current->pid; break; case IPV6_FL_S_USER: - fl->owner = current->euid; + fl->owner = task_euid(current); break; default: err = -EINVAL; diff -u --recursive --new-file linux-2.5.3/net/ipv6/netfilter/ip6t_owner.c linux-2.5.3-fixup_cred/net/ipv6/netfilter/ip6t_owner.c --- linux-2.5.3/net/ipv6/netfilter/ip6t_owner.c Wed Oct 31 00:08:12 2001 +++ linux-2.5.3-fixup_cred/net/ipv6/netfilter/ip6t_owner.c Sat Feb 2 16:06:49 2002 @@ -96,13 +96,13 @@ return 0; if(info->match & IP6T_OWNER_UID) { - if((skb->sk->socket->file->f_uid != info->uid) ^ + if((skb->sk->socket->file->f_cred->uid != info->uid) ^ !!(info->invert & IP6T_OWNER_UID)) return 0; } if(info->match & IP6T_OWNER_GID) { - if((skb->sk->socket->file->f_gid != info->gid) ^ + if((skb->sk->socket->file->f_cred->gid != info->gid) ^ !!(info->invert & IP6T_OWNER_GID)) return 0; } diff -u --recursive --new-file linux-2.5.3/net/netlink/af_netlink.c linux-2.5.3-fixup_cred/net/netlink/af_netlink.c --- linux-2.5.3/net/netlink/af_netlink.c Thu Jan 24 00:28:40 2002 +++ linux-2.5.3-fixup_cred/net/netlink/af_netlink.c Sat Feb 2 16:06:49 2002 @@ -590,7 +590,7 @@ NETLINK_CB(skb).groups = sk->protinfo.af_netlink->groups; NETLINK_CB(skb).dst_pid = dst_pid; NETLINK_CB(skb).dst_groups = dst_groups; - memcpy(NETLINK_CREDS(skb), &scm->creds, sizeof(struct ucred)); + memcpy(NETLINK_CREDS(skb), &scm->creds, sizeof(struct scm_ucred)); /* What can I do? Netlink is asynchronous, so that we will have to save current capabilities to diff -u --recursive --new-file linux-2.5.3/net/netrom/af_netrom.c linux-2.5.3-fixup_cred/net/netrom/af_netrom.c --- linux-2.5.3/net/netrom/af_netrom.c Mon Sep 10 16:58:35 2001 +++ linux-2.5.3-fixup_cred/net/netrom/af_netrom.c Sat Feb 2 16:05:51 2002 @@ -623,7 +623,7 @@ } else { source = &addr->fsa_ax25.sax25_call; - if ((user = ax25_findbyuid(current->euid)) == NULL) { + if ((user = ax25_findbyuid(task_euid(current))) == NULL) { if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) return -EPERM; user = source; @@ -679,7 +679,7 @@ source = (ax25_address *)dev->dev_addr; - if ((user = ax25_findbyuid(current->euid)) == NULL) { + if ((user = ax25_findbyuid(task_euid(current))) == NULL) { if (ax25_uid_policy && !capable(CAP_NET_ADMIN)) return -EPERM; user = source; diff -u --recursive --new-file linux-2.5.3/net/rose/af_rose.c linux-2.5.3-fixup_cred/net/rose/af_rose.c --- linux-2.5.3/net/rose/af_rose.c Sun Dec 30 19:31:51 2001 +++ linux-2.5.3-fixup_cred/net/rose/af_rose.c Sat Feb 2 16:05:52 2002 @@ -693,7 +693,7 @@ source = &addr->srose_call; - if ((user = ax25_findbyuid(current->euid)) == NULL) { + if ((user = ax25_findbyuid(task_euid(current))) == NULL) { if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) return -EACCES; user = source; @@ -774,7 +774,7 @@ if ((dev = rose_dev_first()) == NULL) return -ENETUNREACH; - if ((user = ax25_findbyuid(current->euid)) == NULL) + if ((user = ax25_findbyuid(task_euid(current))) == NULL) return -EINVAL; memcpy(&sk->protinfo.rose->source_addr, dev->dev_addr, ROSE_ADDR_LEN); diff -u --recursive --new-file linux-2.5.3/net/socket.c linux-2.5.3-fixup_cred/net/socket.c --- linux-2.5.3/net/socket.c Sat Jan 19 01:00:26 2002 +++ linux-2.5.3-fixup_cred/net/socket.c Sat Feb 2 16:05:50 2002 @@ -447,8 +447,8 @@ inode->i_mode = S_IFSOCK|S_IRWXUGO; inode->i_sock = 1; - inode->i_uid = current->fsuid; - inode->i_gid = current->fsgid; + inode->i_uid = task_fsuid(current); + inode->i_gid = task_fsgid(current); sock->inode = inode; init_waitqueue_head(&sock->wait); diff -u --recursive --new-file linux-2.5.3/net/sunrpc/auth.c linux-2.5.3-fixup_cred/net/sunrpc/auth.c --- linux-2.5.3/net/sunrpc/auth.c Fri Sep 21 20:24:50 2001 +++ linux-2.5.3-fixup_cred/net/sunrpc/auth.c Sat Feb 2 16:05:52 2002 @@ -195,7 +195,7 @@ int nr = 0; if (!(taskflags & RPC_TASK_ROOTCREDS)) - nr = current->uid & RPC_CREDCACHE_MASK; + nr = task_uid(current) & RPC_CREDCACHE_MASK; if (time_before(auth->au_nextgc, jiffies)) rpcauth_gc_credcache(auth); diff -u --recursive --new-file linux-2.5.3/net/sunrpc/auth_null.c linux-2.5.3-fixup_cred/net/sunrpc/auth_null.c --- linux-2.5.3/net/sunrpc/auth_null.c Sun Dec 30 02:30:07 2001 +++ linux-2.5.3-fixup_cred/net/sunrpc/auth_null.c Sat Feb 2 16:05:52 2002 @@ -56,7 +56,7 @@ return NULL; atomic_set(&cred->cr_count, 0); cred->cr_flags = RPCAUTH_CRED_UPTODATE; - cred->cr_uid = current->uid; + cred->cr_uid = task_uid(current); cred->cr_ops = &null_credops; return cred; diff -u --recursive --new-file linux-2.5.3/net/sunrpc/auth_unix.c linux-2.5.3-fixup_cred/net/sunrpc/auth_unix.c --- linux-2.5.3/net/sunrpc/auth_unix.c Sun Dec 30 02:30:07 2001 +++ linux-2.5.3-fixup_cred/net/sunrpc/auth_unix.c Sat Feb 2 16:06:49 2002 @@ -68,7 +68,7 @@ int i; dprintk("RPC: allocating UNIX cred for uid %d gid %d\n", - current->uid, current->gid); + task_uid(current), task_gid(current)); if (!(cred = (struct unx_cred *) rpc_allocate(flags, sizeof(*cred)))) return NULL; @@ -80,18 +80,22 @@ cred->uc_gid = cred->uc_fsgid = 0; cred->uc_gids[0] = NOGROUP; } else { - int groups = current->ngroups; + int groups; + struct ucred *tsk_cred = task_getucred(current); + + groups = tsk_cred->ngroups; if (groups > NFS_NGROUPS) groups = NFS_NGROUPS; - cred->uc_uid = current->uid; - cred->uc_gid = current->gid; - cred->uc_fsuid = current->fsuid; - cred->uc_fsgid = current->fsgid; + cred->uc_uid = task_uid(current); + cred->uc_gid = task_gid(current); + cred->uc_fsuid = tsk_cred->uid; + cred->uc_fsgid = tsk_cred->gid; for (i = 0; i < groups; i++) - cred->uc_gids[i] = (gid_t) current->groups[i]; + cred->uc_gids[i] = tsk_cred->groups[i]; if (i < NFS_NGROUPS) cred->uc_gids[i] = NOGROUP; + put_ucred(tsk_cred); } cred->uc_base.cr_ops = &unix_credops; @@ -139,20 +143,25 @@ if (!(taskflags & RPC_TASK_ROOTCREDS)) { int groups; + struct ucred *tsk_cred = task_getucred(current); - if (cred->uc_uid != current->uid - || cred->uc_gid != current->gid - || cred->uc_fsuid != current->fsuid - || cred->uc_fsgid != current->fsgid) - return 0; + if (cred->uc_uid != task_uid(current) + || cred->uc_gid != task_gid(current) + || cred->uc_fsuid != tsk_cred->uid + || cred->uc_fsgid != tsk_cred->gid) + goto out_match; - groups = current->ngroups; + groups = tsk_cred->ngroups; if (groups > NFS_NGROUPS) groups = NFS_NGROUPS; for (i = 0; i < groups ; i++) - if (cred->uc_gids[i] != (gid_t) current->groups[i]) - return 0; + if (cred->uc_gids[i] != tsk_cred->groups[i]) + goto out_match; + put_ucred(tsk_cred); return 1; +out_match: + put_ucred(tsk_cred); + return 0; } return (cred->uc_uid == 0 && cred->uc_fsuid == 0 && cred->uc_gid == 0 && cred->uc_fsgid == 0 diff -u --recursive --new-file linux-2.5.3/net/sunrpc/sched.c linux-2.5.3-fixup_cred/net/sunrpc/sched.c --- linux-2.5.3/net/sunrpc/sched.c Tue Jan 29 00:11:45 2002 +++ linux-2.5.3-fixup_cred/net/sunrpc/sched.c Sat Feb 2 16:05:52 2002 @@ -804,7 +804,7 @@ task->tk_flags = flags; task->tk_exit = callback; init_waitqueue_head(&task->tk_wait); - if (current->uid != current->fsuid || current->gid != current->fsgid) + if (task_uid(current) != task_fsuid(current) || task_gid(current) != task_fsgid(current)) task->tk_flags |= RPC_TASK_SETUID; /* Initialize retry counters */ diff -u --recursive --new-file linux-2.5.3/net/unix/af_unix.c linux-2.5.3-fixup_cred/net/unix/af_unix.c --- linux-2.5.3/net/unix/af_unix.c Tue Jan 15 19:56:35 2002 +++ linux-2.5.3-fixup_cred/net/unix/af_unix.c Sat Feb 2 16:06:49 2002 @@ -446,8 +446,8 @@ sk->state=TCP_LISTEN; /* set credentials so connect can copy them */ sk->peercred.pid = current->pid; - sk->peercred.uid = current->euid; - sk->peercred.gid = current->egid; + sk->peercred.uid = task_euid(current); + sk->peercred.gid = task_egid(current); err = 0; out_unlock: @@ -963,8 +963,8 @@ newsk->state=TCP_ESTABLISHED; newsk->type=SOCK_STREAM; newsk->peercred.pid = current->pid; - newsk->peercred.uid = current->euid; - newsk->peercred.gid = current->egid; + newsk->peercred.uid = task_euid(current); + newsk->peercred.gid = task_egid(current); newsk->sleep = &newsk->protinfo.af_unix.peer_wait; /* copy address information from listening to new sock*/ @@ -1024,8 +1024,8 @@ unix_peer(ska)=skb; unix_peer(skb)=ska; ska->peercred.pid = skb->peercred.pid = current->pid; - ska->peercred.uid = skb->peercred.uid = current->euid; - ska->peercred.gid = skb->peercred.gid = current->egid; + ska->peercred.uid = skb->peercred.uid = task_euid(current); + ska->peercred.gid = skb->peercred.gid = task_egid(current); if (ska->type != SOCK_DGRAM) { @@ -1193,7 +1193,7 @@ if (skb==NULL) goto out; - memcpy(UNIXCREDS(skb), &scm->creds, sizeof(struct ucred)); + memcpy(UNIXCREDS(skb), &scm->creds, sizeof(struct scm_ucred)); if (scm->fp) unix_attach_fds(scm, skb); @@ -1346,7 +1346,7 @@ */ size = min_t(int, size, skb_tailroom(skb)); - memcpy(UNIXCREDS(skb), &scm->creds, sizeof(struct ucred)); + memcpy(UNIXCREDS(skb), &scm->creds, sizeof(struct scm_ucred)); if (scm->fp) unix_attach_fds(scm, skb);