12 #include <linux/module.h>
14 #include <linux/sched.h>
18 #include <asm/errno.h>
21 #ifdef CONFIG_KEYS_DEBUG_PROC_KEYS
23 static void *proc_keys_start(
struct seq_file *
p, loff_t *_pos);
24 static void *proc_keys_next(
struct seq_file *
p,
void *
v, loff_t *_pos);
25 static void proc_keys_stop(
struct seq_file *
p,
void *
v);
26 static int proc_keys_show(
struct seq_file *
m,
void *
v);
29 .
start = proc_keys_start,
30 .next = proc_keys_next,
31 .stop = proc_keys_stop,
32 .show = proc_keys_show,
36 .
open = proc_keys_open,
44 static void *proc_key_users_start(
struct seq_file *
p, loff_t *_pos);
45 static void *proc_key_users_next(
struct seq_file *
p,
void *
v, loff_t *_pos);
46 static void proc_key_users_stop(
struct seq_file *
p,
void *
v);
47 static int proc_key_users_show(
struct seq_file *
m,
void *
v);
50 .start = proc_key_users_start,
51 .next = proc_key_users_next,
52 .stop = proc_key_users_stop,
53 .show = proc_key_users_show,
57 .open = proc_key_users_open,
66 static int __init key_proc_init(
void)
70 #ifdef CONFIG_KEYS_DEBUG_PROC_KEYS
71 p = proc_create(
"keys", 0,
NULL, &proc_keys_fops);
73 panic(
"Cannot create /proc/keys\n");
76 p = proc_create(
"key-users", 0,
NULL, &proc_key_users_fops);
78 panic(
"Cannot create /proc/key-users\n");
89 #ifdef CONFIG_KEYS_DEBUG_PROC_KEYS
98 if (kuid_has_mapping(user_ns, key->user->uid))
107 return seq_open(file, &proc_keys_ops);
110 static struct key *find_ge_key(
struct seq_file *p, key_serial_t
id)
114 struct key *minkey =
NULL;
117 struct key *key =
rb_entry(n,
struct key, serial_node);
119 if (!minkey || minkey->serial > key->serial)
122 }
else if (
id > key->serial) {
135 if (kuid_has_mapping(user_ns, minkey->user->uid))
137 n =
rb_next(&minkey->serial_node);
140 minkey =
rb_entry(n,
struct key, serial_node);
144 static void *proc_keys_start(
struct seq_file *p, loff_t *_pos)
147 key_serial_t
pos = *_pos;
150 spin_lock(&key_serial_lock);
154 key = find_ge_key(p, pos);
158 return &key->serial_node;
161 static inline key_serial_t key_node_serial(
struct rb_node *n)
163 struct key *key =
rb_entry(n,
struct key, serial_node);
167 static void *proc_keys_next(
struct seq_file *p,
void *
v, loff_t *_pos)
171 n = key_serial_next(p, v);
173 *_pos = key_node_serial(n);
177 static void proc_keys_stop(
struct seq_file *p,
void *v)
180 spin_unlock(&key_serial_lock);
183 static int proc_keys_show(
struct seq_file *
m,
void *v)
187 struct key *key =
rb_entry(_p,
struct key, serial_node);
190 key_ref_t key_ref, skey_ref;
194 key_ref = make_key_ref(key, 0);
199 if (key->perm & KEY_POS_VIEW) {
203 if (!IS_ERR(skey_ref)) {
204 key_ref_put(skey_ref);
205 key_ref = make_key_ref(key, 1);
223 if (key->expiry == 0) {
225 }
else if (now.tv_sec >= key->expiry) {
228 timo = key->expiry - now.tv_sec;
232 else if (timo < 60*60)
233 sprintf(xbuf,
"%lum", timo / 60);
234 else if (timo < 60*60*24)
235 sprintf(xbuf,
"%luh", timo / (60*60));
236 else if (timo < 60*60*24*7)
237 sprintf(xbuf,
"%lud", timo / (60*60*24));
239 sprintf(xbuf,
"%luw", timo / (60*60*24*7));
242 #define showflag(KEY, LETTER, FLAG) \
243 (test_bit(FLAG, &(KEY)->flags) ? LETTER : '-')
245 seq_printf(m,
"%08x %c%c%c%c%c%c%c %5d %4s %08x %5d %5d %-9.9s ",
247 showflag(key,
'I', KEY_FLAG_INSTANTIATED),
248 showflag(key,
'R', KEY_FLAG_REVOKED),
249 showflag(key,
'D', KEY_FLAG_DEAD),
250 showflag(key,
'Q', KEY_FLAG_IN_QUOTA),
251 showflag(key,
'U', KEY_FLAG_USER_CONSTRUCT),
252 showflag(key,
'N', KEY_FLAG_NEGATIVE),
253 showflag(key,
'i', KEY_FLAG_INVALIDATED),
263 if (key->type->describe)
264 key->type->describe(key, m);
277 if (kuid_has_mapping(user_ns, user->
uid))
286 return __key_user_next(user_ns,
rb_next(n));
292 return __key_user_next(user_ns, n);
301 return seq_open(file, &proc_key_users_ops);
304 static void *proc_key_users_start(
struct seq_file *p, loff_t *_pos)
310 spin_lock(&key_user_lock);
313 while (pos > 0 && _p) {
315 _p = key_user_next(seq_user_ns(p), _p);
321 static void *proc_key_users_next(
struct seq_file *p,
void *v, loff_t *_pos)
324 return key_user_next(seq_user_ns(p), (
struct rb_node *)v);
327 static void proc_key_users_stop(
struct seq_file *p,
void *v)
330 spin_unlock(&key_user_lock);
333 static int proc_key_users_show(
struct seq_file *m,
void *v)