diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /security/keys/compat.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'security/keys/compat.c')
-rw-r--r-- | security/keys/compat.c | 67 |
1 files changed, 58 insertions, 9 deletions
diff --git a/security/keys/compat.c b/security/keys/compat.c index 792c0a611a6d..338b510e9027 100644 --- a/security/keys/compat.c +++ b/security/keys/compat.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* compat.c: 32-bit compatibility syscall for 64-bit systems | 1 | /* 32-bit compatibility syscall for 64-bit systems |
2 | * | 2 | * |
3 | * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved. | 3 | * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved. |
4 | * Written by David Howells (dhowells@redhat.com) | 4 | * Written by David Howells (dhowells@redhat.com) |
@@ -12,15 +12,58 @@ | |||
12 | #include <linux/syscalls.h> | 12 | #include <linux/syscalls.h> |
13 | #include <linux/keyctl.h> | 13 | #include <linux/keyctl.h> |
14 | #include <linux/compat.h> | 14 | #include <linux/compat.h> |
15 | #include <linux/slab.h> | ||
15 | #include "internal.h" | 16 | #include "internal.h" |
16 | 17 | ||
17 | /*****************************************************************************/ | ||
18 | /* | 18 | /* |
19 | * the key control system call, 32-bit compatibility version for 64-bit archs | 19 | * Instantiate a key with the specified compatibility multipart payload and |
20 | * - this should only be called if the 64-bit arch uses weird pointers in | 20 | * link the key into the destination keyring if one is given. |
21 | * 32-bit mode or doesn't guarantee that the top 32-bits of the argument | 21 | * |
22 | * registers on taking a 32-bit syscall are zero | 22 | * The caller must have the appropriate instantiation permit set for this to |
23 | * - if you can, you should call sys_keyctl directly | 23 | * work (see keyctl_assume_authority). No other permissions are required. |
24 | * | ||
25 | * If successful, 0 will be returned. | ||
26 | */ | ||
27 | long compat_keyctl_instantiate_key_iov( | ||
28 | key_serial_t id, | ||
29 | const struct compat_iovec __user *_payload_iov, | ||
30 | unsigned ioc, | ||
31 | key_serial_t ringid) | ||
32 | { | ||
33 | struct iovec iovstack[UIO_FASTIOV], *iov = iovstack; | ||
34 | long ret; | ||
35 | |||
36 | if (_payload_iov == 0 || ioc == 0) | ||
37 | goto no_payload; | ||
38 | |||
39 | ret = compat_rw_copy_check_uvector(WRITE, _payload_iov, ioc, | ||
40 | ARRAY_SIZE(iovstack), | ||
41 | iovstack, &iov); | ||
42 | if (ret < 0) | ||
43 | return ret; | ||
44 | if (ret == 0) | ||
45 | goto no_payload_free; | ||
46 | |||
47 | ret = keyctl_instantiate_key_common(id, iov, ioc, ret, ringid); | ||
48 | |||
49 | if (iov != iovstack) | ||
50 | kfree(iov); | ||
51 | return ret; | ||
52 | |||
53 | no_payload_free: | ||
54 | if (iov != iovstack) | ||
55 | kfree(iov); | ||
56 | no_payload: | ||
57 | return keyctl_instantiate_key_common(id, NULL, 0, 0, ringid); | ||
58 | } | ||
59 | |||
60 | /* | ||
61 | * The key control system call, 32-bit compatibility version for 64-bit archs | ||
62 | * | ||
63 | * This should only be called if the 64-bit arch uses weird pointers in 32-bit | ||
64 | * mode or doesn't guarantee that the top 32-bits of the argument registers on | ||
65 | * taking a 32-bit syscall are zero. If you can, you should call sys_keyctl() | ||
66 | * directly. | ||
24 | */ | 67 | */ |
25 | asmlinkage long compat_sys_keyctl(u32 option, | 68 | asmlinkage long compat_sys_keyctl(u32 option, |
26 | u32 arg2, u32 arg3, u32 arg4, u32 arg5) | 69 | u32 arg2, u32 arg3, u32 arg4, u32 arg5) |
@@ -85,8 +128,14 @@ asmlinkage long compat_sys_keyctl(u32 option, | |||
85 | case KEYCTL_SESSION_TO_PARENT: | 128 | case KEYCTL_SESSION_TO_PARENT: |
86 | return keyctl_session_to_parent(); | 129 | return keyctl_session_to_parent(); |
87 | 130 | ||
131 | case KEYCTL_REJECT: | ||
132 | return keyctl_reject_key(arg2, arg3, arg4, arg5); | ||
133 | |||
134 | case KEYCTL_INSTANTIATE_IOV: | ||
135 | return compat_keyctl_instantiate_key_iov( | ||
136 | arg2, compat_ptr(arg3), arg4, arg5); | ||
137 | |||
88 | default: | 138 | default: |
89 | return -EOPNOTSUPP; | 139 | return -EOPNOTSUPP; |
90 | } | 140 | } |
91 | 141 | } | |
92 | } /* end compat_sys_keyctl() */ | ||