diff options
Diffstat (limited to 'security/keys/keyring.c')
-rw-r--r-- | security/keys/keyring.c | 64 |
1 files changed, 0 insertions, 64 deletions
diff --git a/security/keys/keyring.c b/security/keys/keyring.c index 4e9fa8be44b8..0acecbd4fa37 100644 --- a/security/keys/keyring.c +++ b/security/keys/keyring.c | |||
@@ -48,7 +48,6 @@ static inline unsigned keyring_hash(const char *desc) | |||
48 | */ | 48 | */ |
49 | static int keyring_instantiate(struct key *keyring, | 49 | static int keyring_instantiate(struct key *keyring, |
50 | const void *data, size_t datalen); | 50 | const void *data, size_t datalen); |
51 | static int keyring_duplicate(struct key *keyring, const struct key *source); | ||
52 | static int keyring_match(const struct key *keyring, const void *criterion); | 51 | static int keyring_match(const struct key *keyring, const void *criterion); |
53 | static void keyring_destroy(struct key *keyring); | 52 | static void keyring_destroy(struct key *keyring); |
54 | static void keyring_describe(const struct key *keyring, struct seq_file *m); | 53 | static void keyring_describe(const struct key *keyring, struct seq_file *m); |
@@ -59,7 +58,6 @@ struct key_type key_type_keyring = { | |||
59 | .name = "keyring", | 58 | .name = "keyring", |
60 | .def_datalen = sizeof(struct keyring_list), | 59 | .def_datalen = sizeof(struct keyring_list), |
61 | .instantiate = keyring_instantiate, | 60 | .instantiate = keyring_instantiate, |
62 | .duplicate = keyring_duplicate, | ||
63 | .match = keyring_match, | 61 | .match = keyring_match, |
64 | .destroy = keyring_destroy, | 62 | .destroy = keyring_destroy, |
65 | .describe = keyring_describe, | 63 | .describe = keyring_describe, |
@@ -120,68 +118,6 @@ static int keyring_instantiate(struct key *keyring, | |||
120 | 118 | ||
121 | /*****************************************************************************/ | 119 | /*****************************************************************************/ |
122 | /* | 120 | /* |
123 | * duplicate the list of subscribed keys from a source keyring into this one | ||
124 | */ | ||
125 | static int keyring_duplicate(struct key *keyring, const struct key *source) | ||
126 | { | ||
127 | struct keyring_list *sklist, *klist; | ||
128 | unsigned max; | ||
129 | size_t size; | ||
130 | int loop, ret; | ||
131 | |||
132 | const unsigned limit = | ||
133 | (PAGE_SIZE - sizeof(*klist)) / sizeof(struct key *); | ||
134 | |||
135 | ret = 0; | ||
136 | |||
137 | /* find out how many keys are currently linked */ | ||
138 | rcu_read_lock(); | ||
139 | sklist = rcu_dereference(source->payload.subscriptions); | ||
140 | max = 0; | ||
141 | if (sklist) | ||
142 | max = sklist->nkeys; | ||
143 | rcu_read_unlock(); | ||
144 | |||
145 | /* allocate a new payload and stuff load with key links */ | ||
146 | if (max > 0) { | ||
147 | BUG_ON(max > limit); | ||
148 | |||
149 | max = (max + 3) & ~3; | ||
150 | if (max > limit) | ||
151 | max = limit; | ||
152 | |||
153 | ret = -ENOMEM; | ||
154 | size = sizeof(*klist) + sizeof(struct key *) * max; | ||
155 | klist = kmalloc(size, GFP_KERNEL); | ||
156 | if (!klist) | ||
157 | goto error; | ||
158 | |||
159 | /* set links */ | ||
160 | rcu_read_lock(); | ||
161 | sklist = rcu_dereference(source->payload.subscriptions); | ||
162 | |||
163 | klist->maxkeys = max; | ||
164 | klist->nkeys = sklist->nkeys; | ||
165 | memcpy(klist->keys, | ||
166 | sklist->keys, | ||
167 | sklist->nkeys * sizeof(struct key *)); | ||
168 | |||
169 | for (loop = klist->nkeys - 1; loop >= 0; loop--) | ||
170 | atomic_inc(&klist->keys[loop]->usage); | ||
171 | |||
172 | rcu_read_unlock(); | ||
173 | |||
174 | rcu_assign_pointer(keyring->payload.subscriptions, klist); | ||
175 | ret = 0; | ||
176 | } | ||
177 | |||
178 | error: | ||
179 | return ret; | ||
180 | |||
181 | } /* end keyring_duplicate() */ | ||
182 | |||
183 | /*****************************************************************************/ | ||
184 | /* | ||
185 | * match keyrings on their name | 121 | * match keyrings on their name |
186 | */ | 122 | */ |
187 | static int keyring_match(const struct key *keyring, const void *description) | 123 | static int keyring_match(const struct key *keyring, const void *description) |