[OpenAFS-devel] Nothing but the PAG
Jan Harkes
jaharkes@cs.cmu.edu
Thu, 15 May 2003 20:53:35 -0400
Nothing but the pag, no credentials or anything.
All in all 33 lines of code changes, although more will be needed to add
the newpag/getpag syscalls for all architectures. After the patch
follows a simple userspace program that can start a shell in it's own
pag.
Again, this does not add anything to hold tokens, keys, credentials.
Associating userids and pags with those is up to some magical and
debatable 'token store' in the sky.
Jan
diff -urN --exclude-from=dontdiff linux-2.5.69/fs/file_table.c linux-2.5.69-pag/fs/file_table.c
--- linux-2.5.69/fs/file_table.c 2003-04-20 12:37:54.000000000 -0400
+++ linux-2.5.69-pag/fs/file_table.c 2003-05-15 02:37:57.000000000 -0400
@@ -80,6 +80,7 @@
atomic_set(&f->f_count, 1);
f->f_uid = current->fsuid;
f->f_gid = current->fsgid;
+ f->f_pag = current->pag;
f->f_owner.lock = RW_LOCK_UNLOCKED;
/* f->f_version: 0 */
INIT_LIST_HEAD(&f->f_list);
@@ -116,6 +117,7 @@
filp->f_dentry = dentry;
filp->f_uid = current->fsuid;
filp->f_gid = current->fsgid;
+ filp->f_pag = current->pag;
filp->f_op = dentry->d_inode->i_fop;
INIT_LIST_HEAD(&filp->f_list);
error = security_file_alloc(filp);
diff -urN --exclude-from=dontdiff linux-2.5.69/fs/proc/array.c linux-2.5.69-pag/fs/proc/array.c
--- linux-2.5.69/fs/proc/array.c 2003-05-05 00:06:12.000000000 -0400
+++ linux-2.5.69-pag/fs/proc/array.c 2003-05-15 02:07:07.000000000 -0400
@@ -154,13 +154,14 @@
read_lock(&tasklist_lock);
buffer += sprintf(buffer,
"State:\t%s\n"
+ "Pag:\t%ld\n"
"Tgid:\t%d\n"
"Pid:\t%d\n"
"PPid:\t%d\n"
"TracerPid:\t%d\n"
"Uid:\t%d\t%d\t%d\t%d\n"
"Gid:\t%d\t%d\t%d\t%d\n",
- get_task_state(p), p->tgid,
+ get_task_state(p), p->pag, p->tgid,
p->pid, p->pid ? p->real_parent->pid : 0,
p->pid && p->ptrace ? p->parent->pid : 0,
p->uid, p->euid, p->suid, p->fsuid,
diff -urN --exclude-from=dontdiff linux-2.5.69/include/asm-i386/posix_types.h linux-2.5.69-pag/include/asm-i386/posix_types.h
--- linux-2.5.69/include/asm-i386/posix_types.h 2003-04-20 12:37:58.000000000 -0400
+++ linux-2.5.69-pag/include/asm-i386/posix_types.h 2003-05-15 02:07:34.000000000 -0400
@@ -13,6 +13,7 @@
typedef unsigned short __kernel_nlink_t;
typedef long __kernel_off_t;
typedef int __kernel_pid_t;
+typedef unsigned long long __kernel_pag_t;
typedef unsigned short __kernel_ipc_pid_t;
typedef unsigned short __kernel_uid_t;
typedef unsigned short __kernel_gid_t;
diff -urN --exclude-from=dontdiff linux-2.5.69/include/asm-i386/unistd.h linux-2.5.69-pag/include/asm-i386/unistd.h
--- linux-2.5.69/include/asm-i386/unistd.h 2003-02-25 23:27:21.000000000 -0500
+++ linux-2.5.69-pag/include/asm-i386/unistd.h 2003-05-15 02:08:31.000000000 -0400
@@ -273,8 +273,10 @@
#define __NR_clock_gettime (__NR_timer_create+6)
#define __NR_clock_getres (__NR_timer_create+7)
#define __NR_clock_nanosleep (__NR_timer_create+8)
+#define __NR_newpag 268
+#define __NR_getpag 269
-#define NR_syscalls 268
+#define NR_syscalls 270
/* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */
diff -urN --exclude-from=dontdiff linux-2.5.69/include/linux/fs.h linux-2.5.69-pag/include/linux/fs.h
--- linux-2.5.69/include/linux/fs.h 2003-05-05 00:06:21.000000000 -0400
+++ linux-2.5.69-pag/include/linux/fs.h 2003-05-15 02:10:49.000000000 -0400
@@ -431,6 +431,7 @@
loff_t f_pos;
struct fown_struct f_owner;
unsigned int f_uid, f_gid;
+ pag_t f_pag;
int f_error;
struct file_ra_state f_ra;
diff -urN --exclude-from=dontdiff linux-2.5.69/include/linux/sched.h linux-2.5.69-pag/include/linux/sched.h
--- linux-2.5.69/include/linux/sched.h 2003-05-05 00:06:22.000000000 -0400
+++ linux-2.5.69-pag/include/linux/sched.h 2003-05-15 02:16:09.000000000 -0400
@@ -387,6 +387,7 @@
gid_t gid,egid,sgid,fsgid;
int ngroups;
gid_t groups[NGROUPS];
+ pag_t pag;
kernel_cap_t cap_effective, cap_inheritable, cap_permitted;
int keep_capabilities:1;
struct user_struct *user;
diff -urN --exclude-from=dontdiff linux-2.5.69/include/linux/types.h linux-2.5.69-pag/include/linux/types.h
--- linux-2.5.69/include/linux/types.h 2003-02-25 23:27:25.000000000 -0500
+++ linux-2.5.69-pag/include/linux/types.h 2003-05-15 02:11:30.000000000 -0400
@@ -24,6 +24,7 @@
typedef __kernel_nlink_t nlink_t;
typedef __kernel_off_t off_t;
typedef __kernel_pid_t pid_t;
+typedef __kernel_pag_t pag_t;
typedef __kernel_daddr_t daddr_t;
typedef __kernel_key_t key_t;
typedef __kernel_suseconds_t suseconds_t;
diff -urN --exclude-from=dontdiff linux-2.5.69/kernel/sys.c linux-2.5.69-pag/kernel/sys.c
--- linux-2.5.69/kernel/sys.c 2003-04-20 12:38:10.000000000 -0400
+++ linux-2.5.69-pag/kernel/sys.c 2003-05-15 03:02:31.000000000 -0400
@@ -1402,6 +1402,28 @@
return error;
}
+asmlinkage long sys_newpag(void)
+{
+ static pag_t pag_next = 1;
+
+ lock_kernel();
+
+ current->pag = pag_next;
+
+ do {
+ pag_next++;
+ } while(!pag_next);
+
+ unlock_kernel();
+
+ return 0;
+}
+
+asmlinkage long sys_getpag(pag_t *pag)
+{
+ return put_user(current->pag, pag);
+}
+
EXPORT_SYMBOL(notifier_chain_register);
EXPORT_SYMBOL(notifier_chain_unregister);
EXPORT_SYMBOL(notifier_call_chain);
======================================================================
/* pagsh.c - start a shell or process in an isolated security context */
#include <sys/syscall.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#define __NR_newpag 268
#define __NR_getpag 269
typedef unsigned long long pag_t;
_syscall0(long, newpag);
_syscall1(long, getpag, pag_t *, pag);
int main(int argc, char **argv)
{
char *def[] = { "/bin/sh", NULL };
char **args = def;
long err = 0;
pag_t pag;
if (argc > 1)
args = &argv[1];
err = newpag();
if (err) {
perror("newpag");
exit(-1);
}
err = getpag(&pag);
if (err) {
perror("getpag");
exit(-1);
}
printf("Running new shell in pag: %lu\n", pag);
execvp(args[0], args);
}