linux_dsm_epyc7002/arch/ia64/kernel
David Howells ee18d64c1f KEYS: Add a keyctl to install a process's session keyring on its parent [try #6]
Add a keyctl to install a process's session keyring onto its parent.  This
replaces the parent's session keyring.  Because the COW credential code does
not permit one process to change another process's credentials directly, the
change is deferred until userspace next starts executing again.  Normally this
will be after a wait*() syscall.

To support this, three new security hooks have been provided:
cred_alloc_blank() to allocate unset security creds, cred_transfer() to fill in
the blank security creds and key_session_to_parent() - which asks the LSM if
the process may replace its parent's session keyring.

The replacement may only happen if the process has the same ownership details
as its parent, and the process has LINK permission on the session keyring, and
the session keyring is owned by the process, and the LSM permits it.

Note that this requires alteration to each architecture's notify_resume path.
This has been done for all arches barring blackfin, m68k* and xtensa, all of
which need assembly alteration to support TIF_NOTIFY_RESUME.  This allows the
replacement to be performed at the point the parent process resumes userspace
execution.

This allows the userspace AFS pioctl emulation to fully emulate newpag() and
the VIOCSETTOK and VIOCSETTOK2 pioctls, all of which require the ability to
alter the parent process's PAG membership.  However, since kAFS doesn't use
PAGs per se, but rather dumps the keys into the session keyring, the session
keyring of the parent must be replaced if, for example, VIOCSETTOK is passed
the newpag flag.

This can be tested with the following program:

	#include <stdio.h>
	#include <stdlib.h>
	#include <keyutils.h>

	#define KEYCTL_SESSION_TO_PARENT	18

	#define OSERROR(X, S) do { if ((long)(X) == -1) { perror(S); exit(1); } } while(0)

	int main(int argc, char **argv)
	{
		key_serial_t keyring, key;
		long ret;

		keyring = keyctl_join_session_keyring(argv[1]);
		OSERROR(keyring, "keyctl_join_session_keyring");

		key = add_key("user", "a", "b", 1, keyring);
		OSERROR(key, "add_key");

		ret = keyctl(KEYCTL_SESSION_TO_PARENT);
		OSERROR(ret, "KEYCTL_SESSION_TO_PARENT");

		return 0;
	}

Compiled and linked with -lkeyutils, you should see something like:

	[dhowells@andromeda ~]$ keyctl show
	Session Keyring
	       -3 --alswrv   4043  4043  keyring: _ses
	355907932 --alswrv   4043    -1   \_ keyring: _uid.4043
	[dhowells@andromeda ~]$ /tmp/newpag
	[dhowells@andromeda ~]$ keyctl show
	Session Keyring
	       -3 --alswrv   4043  4043  keyring: _ses
	1055658746 --alswrv   4043  4043   \_ user: a
	[dhowells@andromeda ~]$ /tmp/newpag hello
	[dhowells@andromeda ~]$ keyctl show
	Session Keyring
	       -3 --alswrv   4043  4043  keyring: hello
	340417692 --alswrv   4043  4043   \_ user: a

Where the test program creates a new session keyring, sticks a user key named
'a' into it and then installs it on its parent.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: James Morris <jmorris@namei.org>
2009-09-02 21:29:22 +10:00
..
cpufreq [IA64] improper printk format in acpi-cpufreq 2008-07-17 11:11:17 -07:00
.gitignore [IA64] Cleanup generated file not ignored by .gitignore 2008-08-04 11:06:16 -07:00
acpi-ext.c Pull acpi_os_free into release branch 2006-07-01 17:19:08 -04:00
acpi-processor.c ACPI: pdc init related memory leak with physical CPU hotplug 2009-06-20 00:50:52 -04:00
acpi.c irq: change ACPI GSI APIs to also take a device argument 2009-04-28 12:21:17 +02:00
asm-offsets.c ia64/pv_ops/xen: paravirtualize read/write ar.itc and ar.itm 2009-03-26 10:50:32 -07:00
audit.c [PATCH] audit signal recipients 2007-05-11 05:38:25 -04:00
brl_emu.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
crash_dump.c kdump: make elfcorehdr_addr independent of CONFIG_PROC_VMCORE 2008-10-20 08:52:39 -07:00
crash.c [IA64] simplify notify hooks in mca.c 2008-04-22 08:56:38 -07:00
cyclone.c clocksource: pass clocksource to read() callback 2009-04-21 13:41:47 -07:00
dma-mapping.c Add dma_debug_init() for ia64 2009-07-17 06:34:57 -07:00
efi_stub.S [IA64] make efi_stub.S fit in 80 cols 2006-06-21 14:35:28 -07:00
efi.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
entry.h Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
entry.S [IA64] hook up new rt_tgsigqueueinfo syscall 2009-06-16 13:13:41 -07:00
err_inject.c sysdev: Pass the attribute to the low level sysdev show/store function 2008-07-21 21:55:02 -07:00
esi_stub.S [IA64] esi-support 2006-06-21 11:19:22 -07:00
esi.c [IA64] Remove unnecessary semicolons 2009-06-30 14:18:32 -07:00
fsys.S ia64/pv_ops: paravirtualize mov = ar.itc. 2009-03-26 10:50:22 -07:00
fsyscall_gtod_data.h [IA64] generalize attribute of fsyscall_gtod_data 2008-02-04 15:36:36 -08:00
ftrace.c ftrace, ia64: IA64 dynamic ftrace support 2009-01-14 12:11:31 +01:00
gate-data.S Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
gate.lds.S ia64/pv_ops: gate page paravirtualization. 2009-03-26 10:51:02 -07:00
gate.S ia64/pv_ops: paravirtualize gate.S. 2009-03-26 11:01:46 -07:00
head.S ia64/pv_ops/pv_time_ops: add sched_clock hook. 2009-03-26 10:50:42 -07:00
ia64_ksyms.c IA64: includecheck fix: ia64, ia64_ksyms.c 2009-08-11 14:52:10 -07:00
init_task.c mm: consolidate init_mm definition 2009-06-16 19:47:28 -07:00
iosapic.c arch/ia64/kernel/iosapic: missing test after ioremap() 2009-08-11 14:52:11 -07:00
irq_ia64.c [IA64] remove obsolete irq_desc_t typedef 2009-06-15 14:34:31 -07:00
irq_lsapic.c [IA64] remove obsolete hw_interrupt_type 2009-06-15 14:35:10 -07:00
irq.c [IA64] remove obsolete irq_desc_t typedef 2009-06-15 14:34:31 -07:00
ivt.S ia64/pv_ops: paravirtualize mov = ar.itc. 2009-03-26 10:50:22 -07:00
jprobes.S [IA64] Move include/asm-ia64 to arch/ia64/include/asm 2008-08-01 10:21:21 -07:00
kprobes.c kprobes: check CONFIG_FREEZER instead of CONFIG_PM 2009-01-16 14:32:17 -05:00
machine_kexec.c vmcoreinfo: fix the configuration dependencies 2008-02-07 08:42:25 -08:00
machvec.c x86, ia64: convert to use generic dma_map_ops struct 2009-01-06 14:06:57 +01:00
Makefile Merge branch 'tracing-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-04-05 11:04:19 -07:00
Makefile.gate ia64/pv_ops: gate page paravirtualization. 2009-03-26 10:51:02 -07:00
mca_asm.S [IA64] Add API for allocating Dynamic TR resource. 2008-04-03 11:02:58 -07:00
mca_drv_asm.S [IA64] mca style cleanup 2008-02-04 15:42:06 -08:00
mca_drv.c CRED: Wrap task credential accesses in the IA64 arch 2008-11-14 10:38:37 +11:00
mca_drv.h [IA64] mca style cleanup 2008-02-04 15:42:06 -08:00
mca.c Pull for-2.6.31 into release 2009-06-17 09:35:24 -07:00
minstate.h [IA64] pvops: paravirtualize minstate.h. 2008-05-27 15:02:17 -07:00
module.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
msi_ia64.c [IA64] msi_ia64.c dmar_msi_type should be static 2009-06-15 14:35:54 -07:00
nr-irqs.c ia64/pv_ops/xen: define the nubmer of irqs which xen needs. 2008-10-17 10:06:59 -07:00
numa.c [IA64] Minimize per_cpu reservations. 2008-04-08 13:51:35 -07:00
pal.S [IA64] reformat pal.S to fit in 80 columns, fix typos 2006-10-17 14:54:19 -07:00
palinfo.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
paravirt_inst.h ia64/pv_ops: paravirtualized instruction checker. 2008-10-17 10:12:54 -07:00
paravirt_patch.c ia64/pv_op/binarypatch: add helper functions to support binary patching for paravirt_ops. 2009-03-26 11:02:31 -07:00
paravirt_patchlist.c [IA64] Fix build error in paravirt_patchlist.c 2009-06-17 09:04:40 -07:00
paravirt_patchlist.h ia64/pv_ops: gate page paravirtualization. 2009-03-26 10:51:02 -07:00
paravirt.c ia64: remove some warnings. 2009-03-27 11:11:04 -07:00
paravirtentry.S ia64/pv_ops: implement binary patching optimization for native. 2009-03-26 11:02:42 -07:00
patch.c ia64: remove some warnings. 2009-03-27 11:11:04 -07:00
pci-dma.c Bug Fix arch/ia64/kernel/pci-dma.c: fix recursive dma_supported() call in iommu_dma_supported() 2009-08-11 14:52:10 -07:00
pci-swiotlb.c Intel IOMMU Pass Through Support 2009-04-29 06:54:34 +01:00
perfmon_default_smpl.c [IA64] remove remaining __FUNCTION__ occurrences 2008-03-06 09:19:27 -08:00
perfmon_generic.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
perfmon_itanium.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
perfmon_mckinley.h [IA64] spelling fixes: arch/ia64/ 2007-05-11 14:55:43 -07:00
perfmon_montecito.h [IA64] sparse cleanups 2006-12-07 10:48:19 -08:00
perfmon.c [IA64] address compiler warnings perfmon.c/salinfo.c 2009-06-30 14:26:34 -07:00
process.c KEYS: Add a keyctl to install a process's session keyring on its parent [try #6] 2009-09-02 21:29:22 +10:00
ptrace.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
relocate_kernel.S [IA64] Removal of percpu TR cleanup in kexec code 2007-05-08 10:00:28 -07:00
sal.c [IA64] Update check_sal_cache_flush to use platform_send_ipi() 2008-06-11 16:40:33 -07:00
salinfo.c [IA64] address compiler warnings perfmon.c/salinfo.c 2009-06-30 14:26:34 -07:00
setup.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
sigframe.h [IA64] Add TIF_RESTORE_SIGMASK 2007-05-08 14:51:59 -07:00
signal.c CRED: Wrap task credential accesses in the IA64 arch 2008-11-14 10:38:37 +11:00
smp.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
smpboot.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
sys_ia64.c [CVE-2009-0029] Remove __attribute__((weak)) from sys_pipe/sys_pipe2 2009-01-14 14:15:15 +01:00
time.c [IA64] Convert ia64 to use int-ll64.h 2009-06-17 09:33:49 -07:00
topology.c ia64/topology.c: exit cache_add_dev when kobject_init_and_add fails 2009-08-11 14:52:11 -07:00
traps.c [IA64] honor notify_die() returning NOTIFY_STOP 2008-02-05 08:26:44 -08:00
unaligned.c [IA64] dump stack on kernel unaligned warnings 2009-01-15 10:38:56 -08:00
uncached.c Pull for-2.6.31 into release 2009-06-17 09:35:24 -07:00
unwind_decoder.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
unwind_i.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
unwind.c [IA64] Do not go beyond ARRAY_SIZE of unw.hash 2009-02-25 11:48:04 -08:00
vmlinux.lds.S Pull pvops into release branch 2009-03-31 14:25:08 -07:00