apparmor: make it so work buffers can be allocated from atomic context
[muen/linux.git] / security / apparmor / apparmorfs.c
1 /*
2  * AppArmor security module
3  *
4  * This file contains AppArmor /sys/kernel/security/apparmor interface functions
5  *
6  * Copyright (C) 1998-2008 Novell/SUSE
7  * Copyright 2009-2010 Canonical Ltd.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation, version 2 of the
12  * License.
13  */
14
15 #include <linux/ctype.h>
16 #include <linux/security.h>
17 #include <linux/vmalloc.h>
18 #include <linux/init.h>
19 #include <linux/seq_file.h>
20 #include <linux/uaccess.h>
21 #include <linux/mount.h>
22 #include <linux/namei.h>
23 #include <linux/capability.h>
24 #include <linux/rcupdate.h>
25 #include <linux/fs.h>
26 #include <linux/poll.h>
27 #include <linux/zlib.h>
28 #include <uapi/linux/major.h>
29 #include <uapi/linux/magic.h>
30
31 #include "include/apparmor.h"
32 #include "include/apparmorfs.h"
33 #include "include/audit.h"
34 #include "include/cred.h"
35 #include "include/crypto.h"
36 #include "include/ipc.h"
37 #include "include/label.h"
38 #include "include/policy.h"
39 #include "include/policy_ns.h"
40 #include "include/resource.h"
41 #include "include/policy_unpack.h"
42
43 /*
44  * The apparmor filesystem interface used for policy load and introspection
45  * The interface is split into two main components based on their function
46  * a securityfs component:
47  *   used for static files that are always available, and which allows
48  *   userspace to specificy the location of the security filesystem.
49  *
50  *   fns and data are prefixed with
51  *      aa_sfs_
52  *
53  * an apparmorfs component:
54  *   used loaded policy content and introspection. It is not part of  a
55  *   regular mounted filesystem and is available only through the magic
56  *   policy symlink in the root of the securityfs apparmor/ directory.
57  *   Tasks queries will be magically redirected to the correct portion
58  *   of the policy tree based on their confinement.
59  *
60  *   fns and data are prefixed with
61  *      aafs_
62  *
63  * The aa_fs_ prefix is used to indicate the fn is used by both the
64  * securityfs and apparmorfs filesystems.
65  */
66
67
68 /*
69  * support fns
70  */
71
72 struct rawdata_f_data {
73         struct aa_loaddata *loaddata;
74 };
75
76 #define RAWDATA_F_DATA_BUF(p) (char *)(p + 1)
77
78 static void rawdata_f_data_free(struct rawdata_f_data *private)
79 {
80         if (!private)
81                 return;
82
83         aa_put_loaddata(private->loaddata);
84         kvfree(private);
85 }
86
87 static struct rawdata_f_data *rawdata_f_data_alloc(size_t size)
88 {
89         struct rawdata_f_data *ret;
90
91         if (size > SIZE_MAX - sizeof(*ret))
92                 return ERR_PTR(-EINVAL);
93
94         ret = kvzalloc(sizeof(*ret) + size, GFP_KERNEL);
95         if (!ret)
96                 return ERR_PTR(-ENOMEM);
97
98         return ret;
99 }
100
101 /**
102  * aa_mangle_name - mangle a profile name to std profile layout form
103  * @name: profile name to mangle  (NOT NULL)
104  * @target: buffer to store mangled name, same length as @name (MAYBE NULL)
105  *
106  * Returns: length of mangled name
107  */
108 static int mangle_name(const char *name, char *target)
109 {
110         char *t = target;
111
112         while (*name == '/' || *name == '.')
113                 name++;
114
115         if (target) {
116                 for (; *name; name++) {
117                         if (*name == '/')
118                                 *(t)++ = '.';
119                         else if (isspace(*name))
120                                 *(t)++ = '_';
121                         else if (isalnum(*name) || strchr("._-", *name))
122                                 *(t)++ = *name;
123                 }
124
125                 *t = 0;
126         } else {
127                 int len = 0;
128                 for (; *name; name++) {
129                         if (isalnum(*name) || isspace(*name) ||
130                             strchr("/._-", *name))
131                                 len++;
132                 }
133
134                 return len;
135         }
136
137         return t - target;
138 }
139
140
141 /*
142  * aafs - core fns and data for the policy tree
143  */
144
145 #define AAFS_NAME               "apparmorfs"
146 static struct vfsmount *aafs_mnt;
147 static int aafs_count;
148
149
150 static int aafs_show_path(struct seq_file *seq, struct dentry *dentry)
151 {
152         seq_printf(seq, "%s:[%lu]", AAFS_NAME, d_inode(dentry)->i_ino);
153         return 0;
154 }
155
156 static void aafs_evict_inode(struct inode *inode)
157 {
158         truncate_inode_pages_final(&inode->i_data);
159         clear_inode(inode);
160         if (S_ISLNK(inode->i_mode))
161                 kfree(inode->i_link);
162 }
163
164 static const struct super_operations aafs_super_ops = {
165         .statfs = simple_statfs,
166         .evict_inode = aafs_evict_inode,
167         .show_path = aafs_show_path,
168 };
169
170 static int fill_super(struct super_block *sb, void *data, int silent)
171 {
172         static struct tree_descr files[] = { {""} };
173         int error;
174
175         error = simple_fill_super(sb, AAFS_MAGIC, files);
176         if (error)
177                 return error;
178         sb->s_op = &aafs_super_ops;
179
180         return 0;
181 }
182
183 static struct dentry *aafs_mount(struct file_system_type *fs_type,
184                                  int flags, const char *dev_name, void *data)
185 {
186         return mount_single(fs_type, flags, data, fill_super);
187 }
188
189 static struct file_system_type aafs_ops = {
190         .owner = THIS_MODULE,
191         .name = AAFS_NAME,
192         .mount = aafs_mount,
193         .kill_sb = kill_anon_super,
194 };
195
196 /**
197  * __aafs_setup_d_inode - basic inode setup for apparmorfs
198  * @dir: parent directory for the dentry
199  * @dentry: dentry we are seting the inode up for
200  * @mode: permissions the file should have
201  * @data: data to store on inode.i_private, available in open()
202  * @link: if symlink, symlink target string
203  * @fops: struct file_operations that should be used
204  * @iops: struct of inode_operations that should be used
205  */
206 static int __aafs_setup_d_inode(struct inode *dir, struct dentry *dentry,
207                                umode_t mode, void *data, char *link,
208                                const struct file_operations *fops,
209                                const struct inode_operations *iops)
210 {
211         struct inode *inode = new_inode(dir->i_sb);
212
213         AA_BUG(!dir);
214         AA_BUG(!dentry);
215
216         if (!inode)
217                 return -ENOMEM;
218
219         inode->i_ino = get_next_ino();
220         inode->i_mode = mode;
221         inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
222         inode->i_private = data;
223         if (S_ISDIR(mode)) {
224                 inode->i_op = iops ? iops : &simple_dir_inode_operations;
225                 inode->i_fop = &simple_dir_operations;
226                 inc_nlink(inode);
227                 inc_nlink(dir);
228         } else if (S_ISLNK(mode)) {
229                 inode->i_op = iops ? iops : &simple_symlink_inode_operations;
230                 inode->i_link = link;
231         } else {
232                 inode->i_fop = fops;
233         }
234         d_instantiate(dentry, inode);
235         dget(dentry);
236
237         return 0;
238 }
239
240 /**
241  * aafs_create - create a dentry in the apparmorfs filesystem
242  *
243  * @name: name of dentry to create
244  * @mode: permissions the file should have
245  * @parent: parent directory for this dentry
246  * @data: data to store on inode.i_private, available in open()
247  * @link: if symlink, symlink target string
248  * @fops: struct file_operations that should be used for
249  * @iops: struct of inode_operations that should be used
250  *
251  * This is the basic "create a xxx" function for apparmorfs.
252  *
253  * Returns a pointer to a dentry if it succeeds, that must be free with
254  * aafs_remove(). Will return ERR_PTR on failure.
255  */
256 static struct dentry *aafs_create(const char *name, umode_t mode,
257                                   struct dentry *parent, void *data, void *link,
258                                   const struct file_operations *fops,
259                                   const struct inode_operations *iops)
260 {
261         struct dentry *dentry;
262         struct inode *dir;
263         int error;
264
265         AA_BUG(!name);
266         AA_BUG(!parent);
267
268         if (!(mode & S_IFMT))
269                 mode = (mode & S_IALLUGO) | S_IFREG;
270
271         error = simple_pin_fs(&aafs_ops, &aafs_mnt, &aafs_count);
272         if (error)
273                 return ERR_PTR(error);
274
275         dir = d_inode(parent);
276
277         inode_lock(dir);
278         dentry = lookup_one_len(name, parent, strlen(name));
279         if (IS_ERR(dentry)) {
280                 error = PTR_ERR(dentry);
281                 goto fail_lock;
282         }
283
284         if (d_really_is_positive(dentry)) {
285                 error = -EEXIST;
286                 goto fail_dentry;
287         }
288
289         error = __aafs_setup_d_inode(dir, dentry, mode, data, link, fops, iops);
290         if (error)
291                 goto fail_dentry;
292         inode_unlock(dir);
293
294         return dentry;
295
296 fail_dentry:
297         dput(dentry);
298
299 fail_lock:
300         inode_unlock(dir);
301         simple_release_fs(&aafs_mnt, &aafs_count);
302
303         return ERR_PTR(error);
304 }
305
306 /**
307  * aafs_create_file - create a file in the apparmorfs filesystem
308  *
309  * @name: name of dentry to create
310  * @mode: permissions the file should have
311  * @parent: parent directory for this dentry
312  * @data: data to store on inode.i_private, available in open()
313  * @fops: struct file_operations that should be used for
314  *
315  * see aafs_create
316  */
317 static struct dentry *aafs_create_file(const char *name, umode_t mode,
318                                        struct dentry *parent, void *data,
319                                        const struct file_operations *fops)
320 {
321         return aafs_create(name, mode, parent, data, NULL, fops, NULL);
322 }
323
324 /**
325  * aafs_create_dir - create a directory in the apparmorfs filesystem
326  *
327  * @name: name of dentry to create
328  * @parent: parent directory for this dentry
329  *
330  * see aafs_create
331  */
332 static struct dentry *aafs_create_dir(const char *name, struct dentry *parent)
333 {
334         return aafs_create(name, S_IFDIR | 0755, parent, NULL, NULL, NULL,
335                            NULL);
336 }
337
338 /**
339  * aafs_create_symlink - create a symlink in the apparmorfs filesystem
340  * @name: name of dentry to create
341  * @parent: parent directory for this dentry
342  * @target: if symlink, symlink target string
343  * @private: private data
344  * @iops: struct of inode_operations that should be used
345  *
346  * If @target parameter is %NULL, then the @iops parameter needs to be
347  * setup to handle .readlink and .get_link inode_operations.
348  */
349 static struct dentry *aafs_create_symlink(const char *name,
350                                           struct dentry *parent,
351                                           const char *target,
352                                           void *private,
353                                           const struct inode_operations *iops)
354 {
355         struct dentry *dent;
356         char *link = NULL;
357
358         if (target) {
359                 if (!link)
360                         return ERR_PTR(-ENOMEM);
361         }
362         dent = aafs_create(name, S_IFLNK | 0444, parent, private, link, NULL,
363                            iops);
364         if (IS_ERR(dent))
365                 kfree(link);
366
367         return dent;
368 }
369
370 /**
371  * aafs_remove - removes a file or directory from the apparmorfs filesystem
372  *
373  * @dentry: dentry of the file/directory/symlink to removed.
374  */
375 static void aafs_remove(struct dentry *dentry)
376 {
377         struct inode *dir;
378
379         if (!dentry || IS_ERR(dentry))
380                 return;
381
382         dir = d_inode(dentry->d_parent);
383         inode_lock(dir);
384         if (simple_positive(dentry)) {
385                 if (d_is_dir(dentry))
386                         simple_rmdir(dir, dentry);
387                 else
388                         simple_unlink(dir, dentry);
389                 d_delete(dentry);
390                 dput(dentry);
391         }
392         inode_unlock(dir);
393         simple_release_fs(&aafs_mnt, &aafs_count);
394 }
395
396
397 /*
398  * aa_fs - policy load/replace/remove
399  */
400
401 /**
402  * aa_simple_write_to_buffer - common routine for getting policy from user
403  * @userbuf: user buffer to copy data from  (NOT NULL)
404  * @alloc_size: size of user buffer (REQUIRES: @alloc_size >= @copy_size)
405  * @copy_size: size of data to copy from user buffer
406  * @pos: position write is at in the file (NOT NULL)
407  *
408  * Returns: kernel buffer containing copy of user buffer data or an
409  *          ERR_PTR on failure.
410  */
411 static struct aa_loaddata *aa_simple_write_to_buffer(const char __user *userbuf,
412                                                      size_t alloc_size,
413                                                      size_t copy_size,
414                                                      loff_t *pos)
415 {
416         struct aa_loaddata *data;
417
418         AA_BUG(copy_size > alloc_size);
419
420         if (*pos != 0)
421                 /* only writes from pos 0, that is complete writes */
422                 return ERR_PTR(-ESPIPE);
423
424         /* freed by caller to simple_write_to_buffer */
425         data = aa_loaddata_alloc(alloc_size);
426         if (IS_ERR(data))
427                 return data;
428
429         data->size = copy_size;
430         if (copy_from_user(data->data, userbuf, copy_size)) {
431                 kvfree(data);
432                 return ERR_PTR(-EFAULT);
433         }
434
435         return data;
436 }
437
438 static ssize_t policy_update(u32 mask, const char __user *buf, size_t size,
439                              loff_t *pos, struct aa_ns *ns)
440 {
441         struct aa_loaddata *data;
442         struct aa_label *label;
443         ssize_t error;
444
445         label = begin_current_label_crit_section();
446
447         /* high level check about policy management - fine grained in
448          * below after unpack
449          */
450         error = aa_may_manage_policy(label, ns, mask);
451         if (error)
452                 return error;
453
454         data = aa_simple_write_to_buffer(buf, size, size, pos);
455         error = PTR_ERR(data);
456         if (!IS_ERR(data)) {
457                 error = aa_replace_profiles(ns, label, mask, data);
458                 aa_put_loaddata(data);
459         }
460         end_current_label_crit_section(label);
461
462         return error;
463 }
464
465 /* .load file hook fn to load policy */
466 static ssize_t profile_load(struct file *f, const char __user *buf, size_t size,
467                             loff_t *pos)
468 {
469         struct aa_ns *ns = aa_get_ns(f->f_inode->i_private);
470         int error = policy_update(AA_MAY_LOAD_POLICY, buf, size, pos, ns);
471
472         aa_put_ns(ns);
473
474         return error;
475 }
476
477 static const struct file_operations aa_fs_profile_load = {
478         .write = profile_load,
479         .llseek = default_llseek,
480 };
481
482 /* .replace file hook fn to load and/or replace policy */
483 static ssize_t profile_replace(struct file *f, const char __user *buf,
484                                size_t size, loff_t *pos)
485 {
486         struct aa_ns *ns = aa_get_ns(f->f_inode->i_private);
487         int error = policy_update(AA_MAY_LOAD_POLICY | AA_MAY_REPLACE_POLICY,
488                                   buf, size, pos, ns);
489         aa_put_ns(ns);
490
491         return error;
492 }
493
494 static const struct file_operations aa_fs_profile_replace = {
495         .write = profile_replace,
496         .llseek = default_llseek,
497 };
498
499 /* .remove file hook fn to remove loaded policy */
500 static ssize_t profile_remove(struct file *f, const char __user *buf,
501                               size_t size, loff_t *pos)
502 {
503         struct aa_loaddata *data;
504         struct aa_label *label;
505         ssize_t error;
506         struct aa_ns *ns = aa_get_ns(f->f_inode->i_private);
507
508         label = begin_current_label_crit_section();
509         /* high level check about policy management - fine grained in
510          * below after unpack
511          */
512         error = aa_may_manage_policy(label, ns, AA_MAY_REMOVE_POLICY);
513         if (error)
514                 goto out;
515
516         /*
517          * aa_remove_profile needs a null terminated string so 1 extra
518          * byte is allocated and the copied data is null terminated.
519          */
520         data = aa_simple_write_to_buffer(buf, size + 1, size, pos);
521
522         error = PTR_ERR(data);
523         if (!IS_ERR(data)) {
524                 data->data[size] = 0;
525                 error = aa_remove_profiles(ns, label, data->data, size);
526                 aa_put_loaddata(data);
527         }
528  out:
529         end_current_label_crit_section(label);
530         aa_put_ns(ns);
531         return error;
532 }
533
534 static const struct file_operations aa_fs_profile_remove = {
535         .write = profile_remove,
536         .llseek = default_llseek,
537 };
538
539 struct aa_revision {
540         struct aa_ns *ns;
541         long last_read;
542 };
543
544 /* revision file hook fn for policy loads */
545 static int ns_revision_release(struct inode *inode, struct file *file)
546 {
547         struct aa_revision *rev = file->private_data;
548
549         if (rev) {
550                 aa_put_ns(rev->ns);
551                 kfree(rev);
552         }
553
554         return 0;
555 }
556
557 static ssize_t ns_revision_read(struct file *file, char __user *buf,
558                                 size_t size, loff_t *ppos)
559 {
560         struct aa_revision *rev = file->private_data;
561         char buffer[32];
562         long last_read;
563         int avail;
564
565         mutex_lock_nested(&rev->ns->lock, rev->ns->level);
566         last_read = rev->last_read;
567         if (last_read == rev->ns->revision) {
568                 mutex_unlock(&rev->ns->lock);
569                 if (file->f_flags & O_NONBLOCK)
570                         return -EAGAIN;
571                 if (wait_event_interruptible(rev->ns->wait,
572                                              last_read !=
573                                              READ_ONCE(rev->ns->revision)))
574                         return -ERESTARTSYS;
575                 mutex_lock_nested(&rev->ns->lock, rev->ns->level);
576         }
577
578         avail = sprintf(buffer, "%ld\n", rev->ns->revision);
579         if (*ppos + size > avail) {
580                 rev->last_read = rev->ns->revision;
581                 *ppos = 0;
582         }
583         mutex_unlock(&rev->ns->lock);
584
585         return simple_read_from_buffer(buf, size, ppos, buffer, avail);
586 }
587
588 static int ns_revision_open(struct inode *inode, struct file *file)
589 {
590         struct aa_revision *rev = kzalloc(sizeof(*rev), GFP_KERNEL);
591
592         if (!rev)
593                 return -ENOMEM;
594
595         rev->ns = aa_get_ns(inode->i_private);
596         if (!rev->ns)
597                 rev->ns = aa_get_current_ns();
598         file->private_data = rev;
599
600         return 0;
601 }
602
603 static __poll_t ns_revision_poll(struct file *file, poll_table *pt)
604 {
605         struct aa_revision *rev = file->private_data;
606         __poll_t mask = 0;
607
608         if (rev) {
609                 mutex_lock_nested(&rev->ns->lock, rev->ns->level);
610                 poll_wait(file, &rev->ns->wait, pt);
611                 if (rev->last_read < rev->ns->revision)
612                         mask |= EPOLLIN | EPOLLRDNORM;
613                 mutex_unlock(&rev->ns->lock);
614         }
615
616         return mask;
617 }
618
619 void __aa_bump_ns_revision(struct aa_ns *ns)
620 {
621         ns->revision++;
622         wake_up_interruptible(&ns->wait);
623 }
624
625 static const struct file_operations aa_fs_ns_revision_fops = {
626         .owner          = THIS_MODULE,
627         .open           = ns_revision_open,
628         .poll           = ns_revision_poll,
629         .read           = ns_revision_read,
630         .llseek         = generic_file_llseek,
631         .release        = ns_revision_release,
632 };
633
634 static void profile_query_cb(struct aa_profile *profile, struct aa_perms *perms,
635                              const char *match_str, size_t match_len)
636 {
637         struct aa_perms tmp = { };
638         struct aa_dfa *dfa;
639         unsigned int state = 0;
640
641         if (profile_unconfined(profile))
642                 return;
643         if (profile->file.dfa && *match_str == AA_CLASS_FILE) {
644                 dfa = profile->file.dfa;
645                 state = aa_dfa_match_len(dfa, profile->file.start,
646                                          match_str + 1, match_len - 1);
647                 if (state) {
648                         struct path_cond cond = { };
649
650                         tmp = aa_compute_fperms(dfa, state, &cond);
651                 }
652         } else if (profile->policy.dfa) {
653                 if (!PROFILE_MEDIATES(profile, *match_str))
654                         return; /* no change to current perms */
655                 dfa = profile->policy.dfa;
656                 state = aa_dfa_match_len(dfa, profile->policy.start[0],
657                                          match_str, match_len);
658                 if (state)
659                         aa_compute_perms(dfa, state, &tmp);
660         }
661         aa_apply_modes_to_perms(profile, &tmp);
662         aa_perms_accum_raw(perms, &tmp);
663 }
664
665
666 /**
667  * query_data - queries a policy and writes its data to buf
668  * @buf: the resulting data is stored here (NOT NULL)
669  * @buf_len: size of buf
670  * @query: query string used to retrieve data
671  * @query_len: size of query including second NUL byte
672  *
673  * The buffers pointed to by buf and query may overlap. The query buffer is
674  * parsed before buf is written to.
675  *
676  * The query should look like "<LABEL>\0<KEY>\0", where <LABEL> is the name of
677  * the security confinement context and <KEY> is the name of the data to
678  * retrieve. <LABEL> and <KEY> must not be NUL-terminated.
679  *
680  * Don't expect the contents of buf to be preserved on failure.
681  *
682  * Returns: number of characters written to buf or -errno on failure
683  */
684 static ssize_t query_data(char *buf, size_t buf_len,
685                           char *query, size_t query_len)
686 {
687         char *out;
688         const char *key;
689         struct label_it i;
690         struct aa_label *label, *curr;
691         struct aa_profile *profile;
692         struct aa_data *data;
693         u32 bytes, blocks;
694         __le32 outle32;
695
696         if (!query_len)
697                 return -EINVAL; /* need a query */
698
699         key = query + strnlen(query, query_len) + 1;
700         if (key + 1 >= query + query_len)
701                 return -EINVAL; /* not enough space for a non-empty key */
702         if (key + strnlen(key, query + query_len - key) >= query + query_len)
703                 return -EINVAL; /* must end with NUL */
704
705         if (buf_len < sizeof(bytes) + sizeof(blocks))
706                 return -EINVAL; /* not enough space */
707
708         curr = begin_current_label_crit_section();
709         label = aa_label_parse(curr, query, GFP_KERNEL, false, false);
710         end_current_label_crit_section(curr);
711         if (IS_ERR(label))
712                 return PTR_ERR(label);
713
714         /* We are going to leave space for two numbers. The first is the total
715          * number of bytes we are writing after the first number. This is so
716          * users can read the full output without reallocation.
717          *
718          * The second number is the number of data blocks we're writing. An
719          * application might be confined by multiple policies having data in
720          * the same key.
721          */
722         memset(buf, 0, sizeof(bytes) + sizeof(blocks));
723         out = buf + sizeof(bytes) + sizeof(blocks);
724
725         blocks = 0;
726         label_for_each_confined(i, label, profile) {
727                 if (!profile->data)
728                         continue;
729
730                 data = rhashtable_lookup_fast(profile->data, &key,
731                                               profile->data->p);
732
733                 if (data) {
734                         if (out + sizeof(outle32) + data->size > buf +
735                             buf_len) {
736                                 aa_put_label(label);
737                                 return -EINVAL; /* not enough space */
738                         }
739                         outle32 = __cpu_to_le32(data->size);
740                         memcpy(out, &outle32, sizeof(outle32));
741                         out += sizeof(outle32);
742                         memcpy(out, data->data, data->size);
743                         out += data->size;
744                         blocks++;
745                 }
746         }
747         aa_put_label(label);
748
749         outle32 = __cpu_to_le32(out - buf - sizeof(bytes));
750         memcpy(buf, &outle32, sizeof(outle32));
751         outle32 = __cpu_to_le32(blocks);
752         memcpy(buf + sizeof(bytes), &outle32, sizeof(outle32));
753
754         return out - buf;
755 }
756
757 /**
758  * query_label - queries a label and writes permissions to buf
759  * @buf: the resulting permissions string is stored here (NOT NULL)
760  * @buf_len: size of buf
761  * @query: binary query string to match against the dfa
762  * @query_len: size of query
763  * @view_only: only compute for querier's view
764  *
765  * The buffers pointed to by buf and query may overlap. The query buffer is
766  * parsed before buf is written to.
767  *
768  * The query should look like "LABEL_NAME\0DFA_STRING" where LABEL_NAME is
769  * the name of the label, in the current namespace, that is to be queried and
770  * DFA_STRING is a binary string to match against the label(s)'s DFA.
771  *
772  * LABEL_NAME must be NUL terminated. DFA_STRING may contain NUL characters
773  * but must *not* be NUL terminated.
774  *
775  * Returns: number of characters written to buf or -errno on failure
776  */
777 static ssize_t query_label(char *buf, size_t buf_len,
778                            char *query, size_t query_len, bool view_only)
779 {
780         struct aa_profile *profile;
781         struct aa_label *label, *curr;
782         char *label_name, *match_str;
783         size_t label_name_len, match_len;
784         struct aa_perms perms;
785         struct label_it i;
786
787         if (!query_len)
788                 return -EINVAL;
789
790         label_name = query;
791         label_name_len = strnlen(query, query_len);
792         if (!label_name_len || label_name_len == query_len)
793                 return -EINVAL;
794
795         /**
796          * The extra byte is to account for the null byte between the
797          * profile name and dfa string. profile_name_len is greater
798          * than zero and less than query_len, so a byte can be safely
799          * added or subtracted.
800          */
801         match_str = label_name + label_name_len + 1;
802         match_len = query_len - label_name_len - 1;
803
804         curr = begin_current_label_crit_section();
805         label = aa_label_parse(curr, label_name, GFP_KERNEL, false, false);
806         end_current_label_crit_section(curr);
807         if (IS_ERR(label))
808                 return PTR_ERR(label);
809
810         perms = allperms;
811         if (view_only) {
812                 label_for_each_in_ns(i, labels_ns(label), label, profile) {
813                         profile_query_cb(profile, &perms, match_str, match_len);
814                 }
815         } else {
816                 label_for_each(i, label, profile) {
817                         profile_query_cb(profile, &perms, match_str, match_len);
818                 }
819         }
820         aa_put_label(label);
821
822         return scnprintf(buf, buf_len,
823                       "allow 0x%08x\ndeny 0x%08x\naudit 0x%08x\nquiet 0x%08x\n",
824                       perms.allow, perms.deny, perms.audit, perms.quiet);
825 }
826
827 /*
828  * Transaction based IO.
829  * The file expects a write which triggers the transaction, and then
830  * possibly a read(s) which collects the result - which is stored in a
831  * file-local buffer. Once a new write is performed, a new set of results
832  * are stored in the file-local buffer.
833  */
834 struct multi_transaction {
835         struct kref count;
836         ssize_t size;
837         char data[0];
838 };
839
840 #define MULTI_TRANSACTION_LIMIT (PAGE_SIZE - sizeof(struct multi_transaction))
841 /* TODO: replace with per file lock */
842 static DEFINE_SPINLOCK(multi_transaction_lock);
843
844 static void multi_transaction_kref(struct kref *kref)
845 {
846         struct multi_transaction *t;
847
848         t = container_of(kref, struct multi_transaction, count);
849         free_page((unsigned long) t);
850 }
851
852 static struct multi_transaction *
853 get_multi_transaction(struct multi_transaction *t)
854 {
855         if  (t)
856                 kref_get(&(t->count));
857
858         return t;
859 }
860
861 static void put_multi_transaction(struct multi_transaction *t)
862 {
863         if (t)
864                 kref_put(&(t->count), multi_transaction_kref);
865 }
866
867 /* does not increment @new's count */
868 static void multi_transaction_set(struct file *file,
869                                   struct multi_transaction *new, size_t n)
870 {
871         struct multi_transaction *old;
872
873         AA_BUG(n > MULTI_TRANSACTION_LIMIT);
874
875         new->size = n;
876         spin_lock(&multi_transaction_lock);
877         old = (struct multi_transaction *) file->private_data;
878         file->private_data = new;
879         spin_unlock(&multi_transaction_lock);
880         put_multi_transaction(old);
881 }
882
883 static struct multi_transaction *multi_transaction_new(struct file *file,
884                                                        const char __user *buf,
885                                                        size_t size)
886 {
887         struct multi_transaction *t;
888
889         if (size > MULTI_TRANSACTION_LIMIT - 1)
890                 return ERR_PTR(-EFBIG);
891
892         t = (struct multi_transaction *)get_zeroed_page(GFP_KERNEL);
893         if (!t)
894                 return ERR_PTR(-ENOMEM);
895         kref_init(&t->count);
896         if (copy_from_user(t->data, buf, size))
897                 return ERR_PTR(-EFAULT);
898
899         return t;
900 }
901
902 static ssize_t multi_transaction_read(struct file *file, char __user *buf,
903                                        size_t size, loff_t *pos)
904 {
905         struct multi_transaction *t;
906         ssize_t ret;
907
908         spin_lock(&multi_transaction_lock);
909         t = get_multi_transaction(file->private_data);
910         spin_unlock(&multi_transaction_lock);
911         if (!t)
912                 return 0;
913
914         ret = simple_read_from_buffer(buf, size, pos, t->data, t->size);
915         put_multi_transaction(t);
916
917         return ret;
918 }
919
920 static int multi_transaction_release(struct inode *inode, struct file *file)
921 {
922         put_multi_transaction(file->private_data);
923
924         return 0;
925 }
926
927 #define QUERY_CMD_LABEL         "label\0"
928 #define QUERY_CMD_LABEL_LEN     6
929 #define QUERY_CMD_PROFILE       "profile\0"
930 #define QUERY_CMD_PROFILE_LEN   8
931 #define QUERY_CMD_LABELALL      "labelall\0"
932 #define QUERY_CMD_LABELALL_LEN  9
933 #define QUERY_CMD_DATA          "data\0"
934 #define QUERY_CMD_DATA_LEN      5
935
936 /**
937  * aa_write_access - generic permissions and data query
938  * @file: pointer to open apparmorfs/access file
939  * @ubuf: user buffer containing the complete query string (NOT NULL)
940  * @count: size of ubuf
941  * @ppos: position in the file (MUST BE ZERO)
942  *
943  * Allows for one permissions or data query per open(), write(), and read()
944  * sequence. The only queries currently supported are label-based queries for
945  * permissions or data.
946  *
947  * For permissions queries, ubuf must begin with "label\0", followed by the
948  * profile query specific format described in the query_label() function
949  * documentation.
950  *
951  * For data queries, ubuf must have the form "data\0<LABEL>\0<KEY>\0", where
952  * <LABEL> is the name of the security confinement context and <KEY> is the
953  * name of the data to retrieve.
954  *
955  * Returns: number of bytes written or -errno on failure
956  */
957 static ssize_t aa_write_access(struct file *file, const char __user *ubuf,
958                                size_t count, loff_t *ppos)
959 {
960         struct multi_transaction *t;
961         ssize_t len;
962
963         if (*ppos)
964                 return -ESPIPE;
965
966         t = multi_transaction_new(file, ubuf, count);
967         if (IS_ERR(t))
968                 return PTR_ERR(t);
969
970         if (count > QUERY_CMD_PROFILE_LEN &&
971             !memcmp(t->data, QUERY_CMD_PROFILE, QUERY_CMD_PROFILE_LEN)) {
972                 len = query_label(t->data, MULTI_TRANSACTION_LIMIT,
973                                   t->data + QUERY_CMD_PROFILE_LEN,
974                                   count - QUERY_CMD_PROFILE_LEN, true);
975         } else if (count > QUERY_CMD_LABEL_LEN &&
976                    !memcmp(t->data, QUERY_CMD_LABEL, QUERY_CMD_LABEL_LEN)) {
977                 len = query_label(t->data, MULTI_TRANSACTION_LIMIT,
978                                   t->data + QUERY_CMD_LABEL_LEN,
979                                   count - QUERY_CMD_LABEL_LEN, true);
980         } else if (count > QUERY_CMD_LABELALL_LEN &&
981                    !memcmp(t->data, QUERY_CMD_LABELALL,
982                            QUERY_CMD_LABELALL_LEN)) {
983                 len = query_label(t->data, MULTI_TRANSACTION_LIMIT,
984                                   t->data + QUERY_CMD_LABELALL_LEN,
985                                   count - QUERY_CMD_LABELALL_LEN, false);
986         } else if (count > QUERY_CMD_DATA_LEN &&
987                    !memcmp(t->data, QUERY_CMD_DATA, QUERY_CMD_DATA_LEN)) {
988                 len = query_data(t->data, MULTI_TRANSACTION_LIMIT,
989                                  t->data + QUERY_CMD_DATA_LEN,
990                                  count - QUERY_CMD_DATA_LEN);
991         } else
992                 len = -EINVAL;
993
994         if (len < 0) {
995                 put_multi_transaction(t);
996                 return len;
997         }
998
999         multi_transaction_set(file, t, len);
1000
1001         return count;
1002 }
1003
1004 static const struct file_operations aa_sfs_access = {
1005         .write          = aa_write_access,
1006         .read           = multi_transaction_read,
1007         .release        = multi_transaction_release,
1008         .llseek         = generic_file_llseek,
1009 };
1010
1011 static int aa_sfs_seq_show(struct seq_file *seq, void *v)
1012 {
1013         struct aa_sfs_entry *fs_file = seq->private;
1014
1015         if (!fs_file)
1016                 return 0;
1017
1018         switch (fs_file->v_type) {
1019         case AA_SFS_TYPE_BOOLEAN:
1020                 seq_printf(seq, "%s\n", fs_file->v.boolean ? "yes" : "no");
1021                 break;
1022         case AA_SFS_TYPE_STRING:
1023                 seq_printf(seq, "%s\n", fs_file->v.string);
1024                 break;
1025         case AA_SFS_TYPE_U64:
1026                 seq_printf(seq, "%#08lx\n", fs_file->v.u64);
1027                 break;
1028         default:
1029                 /* Ignore unpritable entry types. */
1030                 break;
1031         }
1032
1033         return 0;
1034 }
1035
1036 static int aa_sfs_seq_open(struct inode *inode, struct file *file)
1037 {
1038         return single_open(file, aa_sfs_seq_show, inode->i_private);
1039 }
1040
1041 const struct file_operations aa_sfs_seq_file_ops = {
1042         .owner          = THIS_MODULE,
1043         .open           = aa_sfs_seq_open,
1044         .read           = seq_read,
1045         .llseek         = seq_lseek,
1046         .release        = single_release,
1047 };
1048
1049 /*
1050  * profile based file operations
1051  *     policy/profiles/XXXX/profiles/ *
1052  */
1053
1054 #define SEQ_PROFILE_FOPS(NAME)                                                \
1055 static int seq_profile_ ##NAME ##_open(struct inode *inode, struct file *file)\
1056 {                                                                             \
1057         return seq_profile_open(inode, file, seq_profile_ ##NAME ##_show);    \
1058 }                                                                             \
1059                                                                               \
1060 static const struct file_operations seq_profile_ ##NAME ##_fops = {           \
1061         .owner          = THIS_MODULE,                                        \
1062         .open           = seq_profile_ ##NAME ##_open,                        \
1063         .read           = seq_read,                                           \
1064         .llseek         = seq_lseek,                                          \
1065         .release        = seq_profile_release,                                \
1066 }                                                                             \
1067
1068 static int seq_profile_open(struct inode *inode, struct file *file,
1069                             int (*show)(struct seq_file *, void *))
1070 {
1071         struct aa_proxy *proxy = aa_get_proxy(inode->i_private);
1072         int error = single_open(file, show, proxy);
1073
1074         if (error) {
1075                 file->private_data = NULL;
1076                 aa_put_proxy(proxy);
1077         }
1078
1079         return error;
1080 }
1081
1082 static int seq_profile_release(struct inode *inode, struct file *file)
1083 {
1084         struct seq_file *seq = (struct seq_file *) file->private_data;
1085         if (seq)
1086                 aa_put_proxy(seq->private);
1087         return single_release(inode, file);
1088 }
1089
1090 static int seq_profile_name_show(struct seq_file *seq, void *v)
1091 {
1092         struct aa_proxy *proxy = seq->private;
1093         struct aa_label *label = aa_get_label_rcu(&proxy->label);
1094         struct aa_profile *profile = labels_profile(label);
1095         seq_printf(seq, "%s\n", profile->base.name);
1096         aa_put_label(label);
1097
1098         return 0;
1099 }
1100
1101 static int seq_profile_mode_show(struct seq_file *seq, void *v)
1102 {
1103         struct aa_proxy *proxy = seq->private;
1104         struct aa_label *label = aa_get_label_rcu(&proxy->label);
1105         struct aa_profile *profile = labels_profile(label);
1106         seq_printf(seq, "%s\n", aa_profile_mode_names[profile->mode]);
1107         aa_put_label(label);
1108
1109         return 0;
1110 }
1111
1112 static int seq_profile_attach_show(struct seq_file *seq, void *v)
1113 {
1114         struct aa_proxy *proxy = seq->private;
1115         struct aa_label *label = aa_get_label_rcu(&proxy->label);
1116         struct aa_profile *profile = labels_profile(label);
1117         if (profile->attach)
1118                 seq_printf(seq, "%s\n", profile->attach);
1119         else if (profile->xmatch)
1120                 seq_puts(seq, "<unknown>\n");
1121         else
1122                 seq_printf(seq, "%s\n", profile->base.name);
1123         aa_put_label(label);
1124
1125         return 0;
1126 }
1127
1128 static int seq_profile_hash_show(struct seq_file *seq, void *v)
1129 {
1130         struct aa_proxy *proxy = seq->private;
1131         struct aa_label *label = aa_get_label_rcu(&proxy->label);
1132         struct aa_profile *profile = labels_profile(label);
1133         unsigned int i, size = aa_hash_size();
1134
1135         if (profile->hash) {
1136                 for (i = 0; i < size; i++)
1137                         seq_printf(seq, "%.2x", profile->hash[i]);
1138                 seq_putc(seq, '\n');
1139         }
1140         aa_put_label(label);
1141
1142         return 0;
1143 }
1144
1145 SEQ_PROFILE_FOPS(name);
1146 SEQ_PROFILE_FOPS(mode);
1147 SEQ_PROFILE_FOPS(attach);
1148 SEQ_PROFILE_FOPS(hash);
1149
1150 /*
1151  * namespace based files
1152  *     several root files and
1153  *     policy/ *
1154  */
1155
1156 #define SEQ_NS_FOPS(NAME)                                                     \
1157 static int seq_ns_ ##NAME ##_open(struct inode *inode, struct file *file)     \
1158 {                                                                             \
1159         return single_open(file, seq_ns_ ##NAME ##_show, inode->i_private);   \
1160 }                                                                             \
1161                                                                               \
1162 static const struct file_operations seq_ns_ ##NAME ##_fops = {        \
1163         .owner          = THIS_MODULE,                                        \
1164         .open           = seq_ns_ ##NAME ##_open,                             \
1165         .read           = seq_read,                                           \
1166         .llseek         = seq_lseek,                                          \
1167         .release        = single_release,                                     \
1168 }                                                                             \
1169
1170 static int seq_ns_stacked_show(struct seq_file *seq, void *v)
1171 {
1172         struct aa_label *label;
1173
1174         label = begin_current_label_crit_section();
1175         seq_printf(seq, "%s\n", label->size > 1 ? "yes" : "no");
1176         end_current_label_crit_section(label);
1177
1178         return 0;
1179 }
1180
1181 static int seq_ns_nsstacked_show(struct seq_file *seq, void *v)
1182 {
1183         struct aa_label *label;
1184         struct aa_profile *profile;
1185         struct label_it it;
1186         int count = 1;
1187
1188         label = begin_current_label_crit_section();
1189
1190         if (label->size > 1) {
1191                 label_for_each(it, label, profile)
1192                         if (profile->ns != labels_ns(label)) {
1193                                 count++;
1194                                 break;
1195                         }
1196         }
1197
1198         seq_printf(seq, "%s\n", count > 1 ? "yes" : "no");
1199         end_current_label_crit_section(label);
1200
1201         return 0;
1202 }
1203
1204 static int seq_ns_level_show(struct seq_file *seq, void *v)
1205 {
1206         struct aa_label *label;
1207
1208         label = begin_current_label_crit_section();
1209         seq_printf(seq, "%d\n", labels_ns(label)->level);
1210         end_current_label_crit_section(label);
1211
1212         return 0;
1213 }
1214
1215 static int seq_ns_name_show(struct seq_file *seq, void *v)
1216 {
1217         struct aa_label *label = begin_current_label_crit_section();
1218         seq_printf(seq, "%s\n", labels_ns(label)->base.name);
1219         end_current_label_crit_section(label);
1220
1221         return 0;
1222 }
1223
1224 SEQ_NS_FOPS(stacked);
1225 SEQ_NS_FOPS(nsstacked);
1226 SEQ_NS_FOPS(level);
1227 SEQ_NS_FOPS(name);
1228
1229
1230 /* policy/raw_data/ * file ops */
1231
1232 #define SEQ_RAWDATA_FOPS(NAME)                                                \
1233 static int seq_rawdata_ ##NAME ##_open(struct inode *inode, struct file *file)\
1234 {                                                                             \
1235         return seq_rawdata_open(inode, file, seq_rawdata_ ##NAME ##_show);    \
1236 }                                                                             \
1237                                                                               \
1238 static const struct file_operations seq_rawdata_ ##NAME ##_fops = {           \
1239         .owner          = THIS_MODULE,                                        \
1240         .open           = seq_rawdata_ ##NAME ##_open,                        \
1241         .read           = seq_read,                                           \
1242         .llseek         = seq_lseek,                                          \
1243         .release        = seq_rawdata_release,                                \
1244 }                                                                             \
1245
1246 static int seq_rawdata_open(struct inode *inode, struct file *file,
1247                             int (*show)(struct seq_file *, void *))
1248 {
1249         struct aa_loaddata *data = __aa_get_loaddata(inode->i_private);
1250         int error;
1251
1252         if (!data)
1253                 /* lost race this ent is being reaped */
1254                 return -ENOENT;
1255
1256         error = single_open(file, show, data);
1257         if (error) {
1258                 AA_BUG(file->private_data &&
1259                        ((struct seq_file *)file->private_data)->private);
1260                 aa_put_loaddata(data);
1261         }
1262
1263         return error;
1264 }
1265
1266 static int seq_rawdata_release(struct inode *inode, struct file *file)
1267 {
1268         struct seq_file *seq = (struct seq_file *) file->private_data;
1269
1270         if (seq)
1271                 aa_put_loaddata(seq->private);
1272
1273         return single_release(inode, file);
1274 }
1275
1276 static int seq_rawdata_abi_show(struct seq_file *seq, void *v)
1277 {
1278         struct aa_loaddata *data = seq->private;
1279
1280         seq_printf(seq, "v%d\n", data->abi);
1281
1282         return 0;
1283 }
1284
1285 static int seq_rawdata_revision_show(struct seq_file *seq, void *v)
1286 {
1287         struct aa_loaddata *data = seq->private;
1288
1289         seq_printf(seq, "%ld\n", data->revision);
1290
1291         return 0;
1292 }
1293
1294 static int seq_rawdata_hash_show(struct seq_file *seq, void *v)
1295 {
1296         struct aa_loaddata *data = seq->private;
1297         unsigned int i, size = aa_hash_size();
1298
1299         if (data->hash) {
1300                 for (i = 0; i < size; i++)
1301                         seq_printf(seq, "%.2x", data->hash[i]);
1302                 seq_putc(seq, '\n');
1303         }
1304
1305         return 0;
1306 }
1307
1308 static int seq_rawdata_compressed_size_show(struct seq_file *seq, void *v)
1309 {
1310         struct aa_loaddata *data = seq->private;
1311
1312         seq_printf(seq, "%zu\n", data->compressed_size);
1313
1314         return 0;
1315 }
1316
1317 SEQ_RAWDATA_FOPS(abi);
1318 SEQ_RAWDATA_FOPS(revision);
1319 SEQ_RAWDATA_FOPS(hash);
1320 SEQ_RAWDATA_FOPS(compressed_size);
1321
1322 static int deflate_decompress(char *src, size_t slen, char *dst, size_t dlen)
1323 {
1324         int error;
1325         struct z_stream_s strm;
1326
1327         if (aa_g_rawdata_compression_level == 0) {
1328                 if (dlen < slen)
1329                         return -EINVAL;
1330                 memcpy(dst, src, slen);
1331                 return 0;
1332         }
1333
1334         memset(&strm, 0, sizeof(strm));
1335
1336         strm.workspace = kvzalloc(zlib_inflate_workspacesize(), GFP_KERNEL);
1337         if (!strm.workspace)
1338                 return -ENOMEM;
1339
1340         strm.next_in = src;
1341         strm.avail_in = slen;
1342
1343         error = zlib_inflateInit(&strm);
1344         if (error != Z_OK) {
1345                 error = -ENOMEM;
1346                 goto fail_inflate_init;
1347         }
1348
1349         strm.next_out = dst;
1350         strm.avail_out = dlen;
1351
1352         error = zlib_inflate(&strm, Z_FINISH);
1353         if (error != Z_STREAM_END)
1354                 error = -EINVAL;
1355         else
1356                 error = 0;
1357
1358         zlib_inflateEnd(&strm);
1359 fail_inflate_init:
1360         kvfree(strm.workspace);
1361         return error;
1362 }
1363
1364 static ssize_t rawdata_read(struct file *file, char __user *buf, size_t size,
1365                             loff_t *ppos)
1366 {
1367         struct rawdata_f_data *private = file->private_data;
1368
1369         return simple_read_from_buffer(buf, size, ppos,
1370                                        RAWDATA_F_DATA_BUF(private),
1371                                        private->loaddata->size);
1372 }
1373
1374 static int rawdata_release(struct inode *inode, struct file *file)
1375 {
1376         rawdata_f_data_free(file->private_data);
1377
1378         return 0;
1379 }
1380
1381 static int rawdata_open(struct inode *inode, struct file *file)
1382 {
1383         int error;
1384         struct aa_loaddata *loaddata;
1385         struct rawdata_f_data *private;
1386
1387         if (!policy_view_capable(NULL))
1388                 return -EACCES;
1389
1390         loaddata = __aa_get_loaddata(inode->i_private);
1391         if (!loaddata)
1392                 /* lost race: this entry is being reaped */
1393                 return -ENOENT;
1394
1395         private = rawdata_f_data_alloc(loaddata->size);
1396         if (IS_ERR(private)) {
1397                 error = PTR_ERR(private);
1398                 goto fail_private_alloc;
1399         }
1400
1401         private->loaddata = loaddata;
1402
1403         error = deflate_decompress(loaddata->data, loaddata->compressed_size,
1404                                    RAWDATA_F_DATA_BUF(private),
1405                                    loaddata->size);
1406         if (error)
1407                 goto fail_decompress;
1408
1409         file->private_data = private;
1410         return 0;
1411
1412 fail_decompress:
1413         rawdata_f_data_free(private);
1414         return error;
1415
1416 fail_private_alloc:
1417         aa_put_loaddata(loaddata);
1418         return error;
1419 }
1420
1421 static const struct file_operations rawdata_fops = {
1422         .open = rawdata_open,
1423         .read = rawdata_read,
1424         .llseek = generic_file_llseek,
1425         .release = rawdata_release,
1426 };
1427
1428 static void remove_rawdata_dents(struct aa_loaddata *rawdata)
1429 {
1430         int i;
1431
1432         for (i = 0; i < AAFS_LOADDATA_NDENTS; i++) {
1433                 if (!IS_ERR_OR_NULL(rawdata->dents[i])) {
1434                         /* no refcounts on i_private */
1435                         aafs_remove(rawdata->dents[i]);
1436                         rawdata->dents[i] = NULL;
1437                 }
1438         }
1439 }
1440
1441 void __aa_fs_remove_rawdata(struct aa_loaddata *rawdata)
1442 {
1443         AA_BUG(rawdata->ns && !mutex_is_locked(&rawdata->ns->lock));
1444
1445         if (rawdata->ns) {
1446                 remove_rawdata_dents(rawdata);
1447                 list_del_init(&rawdata->list);
1448                 aa_put_ns(rawdata->ns);
1449                 rawdata->ns = NULL;
1450         }
1451 }
1452
1453 int __aa_fs_create_rawdata(struct aa_ns *ns, struct aa_loaddata *rawdata)
1454 {
1455         struct dentry *dent, *dir;
1456
1457         AA_BUG(!ns);
1458         AA_BUG(!rawdata);
1459         AA_BUG(!mutex_is_locked(&ns->lock));
1460         AA_BUG(!ns_subdata_dir(ns));
1461
1462         /*
1463          * just use ns revision dir was originally created at. This is
1464          * under ns->lock and if load is successful revision will be
1465          * bumped and is guaranteed to be unique
1466          */
1467         rawdata->name = kasprintf(GFP_KERNEL, "%ld", ns->revision);
1468         if (!rawdata->name)
1469                 return -ENOMEM;
1470
1471         dir = aafs_create_dir(rawdata->name, ns_subdata_dir(ns));
1472         if (IS_ERR(dir))
1473                 /* ->name freed when rawdata freed */
1474                 return PTR_ERR(dir);
1475         rawdata->dents[AAFS_LOADDATA_DIR] = dir;
1476
1477         dent = aafs_create_file("abi", S_IFREG | 0444, dir, rawdata,
1478                                       &seq_rawdata_abi_fops);
1479         if (IS_ERR(dent))
1480                 goto fail;
1481         rawdata->dents[AAFS_LOADDATA_ABI] = dent;
1482
1483         dent = aafs_create_file("revision", S_IFREG | 0444, dir, rawdata,
1484                                       &seq_rawdata_revision_fops);
1485         if (IS_ERR(dent))
1486                 goto fail;
1487         rawdata->dents[AAFS_LOADDATA_REVISION] = dent;
1488
1489         if (aa_g_hash_policy) {
1490                 dent = aafs_create_file("sha1", S_IFREG | 0444, dir,
1491                                               rawdata, &seq_rawdata_hash_fops);
1492                 if (IS_ERR(dent))
1493                         goto fail;
1494                 rawdata->dents[AAFS_LOADDATA_HASH] = dent;
1495         }
1496
1497         dent = aafs_create_file("compressed_size", S_IFREG | 0444, dir,
1498                                 rawdata,
1499                                 &seq_rawdata_compressed_size_fops);
1500         if (IS_ERR(dent))
1501                 goto fail;
1502         rawdata->dents[AAFS_LOADDATA_COMPRESSED_SIZE] = dent;
1503
1504         dent = aafs_create_file("raw_data", S_IFREG | 0444,
1505                                       dir, rawdata, &rawdata_fops);
1506         if (IS_ERR(dent))
1507                 goto fail;
1508         rawdata->dents[AAFS_LOADDATA_DATA] = dent;
1509         d_inode(dent)->i_size = rawdata->size;
1510
1511         rawdata->ns = aa_get_ns(ns);
1512         list_add(&rawdata->list, &ns->rawdata_list);
1513         /* no refcount on inode rawdata */
1514
1515         return 0;
1516
1517 fail:
1518         remove_rawdata_dents(rawdata);
1519
1520         return PTR_ERR(dent);
1521 }
1522
1523 /** fns to setup dynamic per profile/namespace files **/
1524
1525 /**
1526  *
1527  * Requires: @profile->ns->lock held
1528  */
1529 void __aafs_profile_rmdir(struct aa_profile *profile)
1530 {
1531         struct aa_profile *child;
1532         int i;
1533
1534         if (!profile)
1535                 return;
1536
1537         list_for_each_entry(child, &profile->base.profiles, base.list)
1538                 __aafs_profile_rmdir(child);
1539
1540         for (i = AAFS_PROF_SIZEOF - 1; i >= 0; --i) {
1541                 struct aa_proxy *proxy;
1542                 if (!profile->dents[i])
1543                         continue;
1544
1545                 proxy = d_inode(profile->dents[i])->i_private;
1546                 aafs_remove(profile->dents[i]);
1547                 aa_put_proxy(proxy);
1548                 profile->dents[i] = NULL;
1549         }
1550 }
1551
1552 /**
1553  *
1554  * Requires: @old->ns->lock held
1555  */
1556 void __aafs_profile_migrate_dents(struct aa_profile *old,
1557                                   struct aa_profile *new)
1558 {
1559         int i;
1560
1561         AA_BUG(!old);
1562         AA_BUG(!new);
1563         AA_BUG(!mutex_is_locked(&profiles_ns(old)->lock));
1564
1565         for (i = 0; i < AAFS_PROF_SIZEOF; i++) {
1566                 new->dents[i] = old->dents[i];
1567                 if (new->dents[i])
1568                         new->dents[i]->d_inode->i_mtime = current_time(new->dents[i]->d_inode);
1569                 old->dents[i] = NULL;
1570         }
1571 }
1572
1573 static struct dentry *create_profile_file(struct dentry *dir, const char *name,
1574                                           struct aa_profile *profile,
1575                                           const struct file_operations *fops)
1576 {
1577         struct aa_proxy *proxy = aa_get_proxy(profile->label.proxy);
1578         struct dentry *dent;
1579
1580         dent = aafs_create_file(name, S_IFREG | 0444, dir, proxy, fops);
1581         if (IS_ERR(dent))
1582                 aa_put_proxy(proxy);
1583
1584         return dent;
1585 }
1586
1587 static int profile_depth(struct aa_profile *profile)
1588 {
1589         int depth = 0;
1590
1591         rcu_read_lock();
1592         for (depth = 0; profile; profile = rcu_access_pointer(profile->parent))
1593                 depth++;
1594         rcu_read_unlock();
1595
1596         return depth;
1597 }
1598
1599 static char *gen_symlink_name(int depth, const char *dirname, const char *fname)
1600 {
1601         char *buffer, *s;
1602         int error;
1603         int size = depth * 6 + strlen(dirname) + strlen(fname) + 11;
1604
1605         s = buffer = kmalloc(size, GFP_KERNEL);
1606         if (!buffer)
1607                 return ERR_PTR(-ENOMEM);
1608
1609         for (; depth > 0; depth--) {
1610                 strcpy(s, "../../");
1611                 s += 6;
1612                 size -= 6;
1613         }
1614
1615         error = snprintf(s, size, "raw_data/%s/%s", dirname, fname);
1616         if (error >= size || error < 0) {
1617                 kfree(buffer);
1618                 return ERR_PTR(-ENAMETOOLONG);
1619         }
1620
1621         return buffer;
1622 }
1623
1624 static void rawdata_link_cb(void *arg)
1625 {
1626         kfree(arg);
1627 }
1628
1629 static const char *rawdata_get_link_base(struct dentry *dentry,
1630                                          struct inode *inode,
1631                                          struct delayed_call *done,
1632                                          const char *name)
1633 {
1634         struct aa_proxy *proxy = inode->i_private;
1635         struct aa_label *label;
1636         struct aa_profile *profile;
1637         char *target;
1638         int depth;
1639
1640         if (!dentry)
1641                 return ERR_PTR(-ECHILD);
1642
1643         label = aa_get_label_rcu(&proxy->label);
1644         profile = labels_profile(label);
1645         depth = profile_depth(profile);
1646         target = gen_symlink_name(depth, profile->rawdata->name, name);
1647         aa_put_label(label);
1648
1649         if (IS_ERR(target))
1650                 return target;
1651
1652         set_delayed_call(done, rawdata_link_cb, target);
1653
1654         return target;
1655 }
1656
1657 static const char *rawdata_get_link_sha1(struct dentry *dentry,
1658                                          struct inode *inode,
1659                                          struct delayed_call *done)
1660 {
1661         return rawdata_get_link_base(dentry, inode, done, "sha1");
1662 }
1663
1664 static const char *rawdata_get_link_abi(struct dentry *dentry,
1665                                         struct inode *inode,
1666                                         struct delayed_call *done)
1667 {
1668         return rawdata_get_link_base(dentry, inode, done, "abi");
1669 }
1670
1671 static const char *rawdata_get_link_data(struct dentry *dentry,
1672                                          struct inode *inode,
1673                                          struct delayed_call *done)
1674 {
1675         return rawdata_get_link_base(dentry, inode, done, "raw_data");
1676 }
1677
1678 static const struct inode_operations rawdata_link_sha1_iops = {
1679         .get_link       = rawdata_get_link_sha1,
1680 };
1681
1682 static const struct inode_operations rawdata_link_abi_iops = {
1683         .get_link       = rawdata_get_link_abi,
1684 };
1685 static const struct inode_operations rawdata_link_data_iops = {
1686         .get_link       = rawdata_get_link_data,
1687 };
1688
1689
1690 /*
1691  * Requires: @profile->ns->lock held
1692  */
1693 int __aafs_profile_mkdir(struct aa_profile *profile, struct dentry *parent)
1694 {
1695         struct aa_profile *child;
1696         struct dentry *dent = NULL, *dir;
1697         int error;
1698
1699         AA_BUG(!profile);
1700         AA_BUG(!mutex_is_locked(&profiles_ns(profile)->lock));
1701
1702         if (!parent) {
1703                 struct aa_profile *p;
1704                 p = aa_deref_parent(profile);
1705                 dent = prof_dir(p);
1706                 /* adding to parent that previously didn't have children */
1707                 dent = aafs_create_dir("profiles", dent);
1708                 if (IS_ERR(dent))
1709                         goto fail;
1710                 prof_child_dir(p) = parent = dent;
1711         }
1712
1713         if (!profile->dirname) {
1714                 int len, id_len;
1715                 len = mangle_name(profile->base.name, NULL);
1716                 id_len = snprintf(NULL, 0, ".%ld", profile->ns->uniq_id);
1717
1718                 profile->dirname = kmalloc(len + id_len + 1, GFP_KERNEL);
1719                 if (!profile->dirname) {
1720                         error = -ENOMEM;
1721                         goto fail2;
1722                 }
1723
1724                 mangle_name(profile->base.name, profile->dirname);
1725                 sprintf(profile->dirname + len, ".%ld", profile->ns->uniq_id++);
1726         }
1727
1728         dent = aafs_create_dir(profile->dirname, parent);
1729         if (IS_ERR(dent))
1730                 goto fail;
1731         prof_dir(profile) = dir = dent;
1732
1733         dent = create_profile_file(dir, "name", profile,
1734                                    &seq_profile_name_fops);
1735         if (IS_ERR(dent))
1736                 goto fail;
1737         profile->dents[AAFS_PROF_NAME] = dent;
1738
1739         dent = create_profile_file(dir, "mode", profile,
1740                                    &seq_profile_mode_fops);
1741         if (IS_ERR(dent))
1742                 goto fail;
1743         profile->dents[AAFS_PROF_MODE] = dent;
1744
1745         dent = create_profile_file(dir, "attach", profile,
1746                                    &seq_profile_attach_fops);
1747         if (IS_ERR(dent))
1748                 goto fail;
1749         profile->dents[AAFS_PROF_ATTACH] = dent;
1750
1751         if (profile->hash) {
1752                 dent = create_profile_file(dir, "sha1", profile,
1753                                            &seq_profile_hash_fops);
1754                 if (IS_ERR(dent))
1755                         goto fail;
1756                 profile->dents[AAFS_PROF_HASH] = dent;
1757         }
1758
1759         if (profile->rawdata) {
1760                 dent = aafs_create_symlink("raw_sha1", dir, NULL,
1761                                            profile->label.proxy,
1762                                            &rawdata_link_sha1_iops);
1763                 if (IS_ERR(dent))
1764                         goto fail;
1765                 aa_get_proxy(profile->label.proxy);
1766                 profile->dents[AAFS_PROF_RAW_HASH] = dent;
1767
1768                 dent = aafs_create_symlink("raw_abi", dir, NULL,
1769                                            profile->label.proxy,
1770                                            &rawdata_link_abi_iops);
1771                 if (IS_ERR(dent))
1772                         goto fail;
1773                 aa_get_proxy(profile->label.proxy);
1774                 profile->dents[AAFS_PROF_RAW_ABI] = dent;
1775
1776                 dent = aafs_create_symlink("raw_data", dir, NULL,
1777                                            profile->label.proxy,
1778                                            &rawdata_link_data_iops);
1779                 if (IS_ERR(dent))
1780                         goto fail;
1781                 aa_get_proxy(profile->label.proxy);
1782                 profile->dents[AAFS_PROF_RAW_DATA] = dent;
1783         }
1784
1785         list_for_each_entry(child, &profile->base.profiles, base.list) {
1786                 error = __aafs_profile_mkdir(child, prof_child_dir(profile));
1787                 if (error)
1788                         goto fail2;
1789         }
1790
1791         return 0;
1792
1793 fail:
1794         error = PTR_ERR(dent);
1795
1796 fail2:
1797         __aafs_profile_rmdir(profile);
1798
1799         return error;
1800 }
1801
1802 static int ns_mkdir_op(struct inode *dir, struct dentry *dentry, umode_t mode)
1803 {
1804         struct aa_ns *ns, *parent;
1805         /* TODO: improve permission check */
1806         struct aa_label *label;
1807         int error;
1808
1809         label = begin_current_label_crit_section();
1810         error = aa_may_manage_policy(label, NULL, AA_MAY_LOAD_POLICY);
1811         end_current_label_crit_section(label);
1812         if (error)
1813                 return error;
1814
1815         parent = aa_get_ns(dir->i_private);
1816         AA_BUG(d_inode(ns_subns_dir(parent)) != dir);
1817
1818         /* we have to unlock and then relock to get locking order right
1819          * for pin_fs
1820          */
1821         inode_unlock(dir);
1822         error = simple_pin_fs(&aafs_ops, &aafs_mnt, &aafs_count);
1823         mutex_lock_nested(&parent->lock, parent->level);
1824         inode_lock_nested(dir, I_MUTEX_PARENT);
1825         if (error)
1826                 goto out;
1827
1828         error = __aafs_setup_d_inode(dir, dentry, mode | S_IFDIR,  NULL,
1829                                      NULL, NULL, NULL);
1830         if (error)
1831                 goto out_pin;
1832
1833         ns = __aa_find_or_create_ns(parent, READ_ONCE(dentry->d_name.name),
1834                                     dentry);
1835         if (IS_ERR(ns)) {
1836                 error = PTR_ERR(ns);
1837                 ns = NULL;
1838         }
1839
1840         aa_put_ns(ns);          /* list ref remains */
1841 out_pin:
1842         if (error)
1843                 simple_release_fs(&aafs_mnt, &aafs_count);
1844 out:
1845         mutex_unlock(&parent->lock);
1846         aa_put_ns(parent);
1847
1848         return error;
1849 }
1850
1851 static int ns_rmdir_op(struct inode *dir, struct dentry *dentry)
1852 {
1853         struct aa_ns *ns, *parent;
1854         /* TODO: improve permission check */
1855         struct aa_label *label;
1856         int error;
1857
1858         label = begin_current_label_crit_section();
1859         error = aa_may_manage_policy(label, NULL, AA_MAY_LOAD_POLICY);
1860         end_current_label_crit_section(label);
1861         if (error)
1862                 return error;
1863
1864         parent = aa_get_ns(dir->i_private);
1865         /* rmdir calls the generic securityfs functions to remove files
1866          * from the apparmor dir. It is up to the apparmor ns locking
1867          * to avoid races.
1868          */
1869         inode_unlock(dir);
1870         inode_unlock(dentry->d_inode);
1871
1872         mutex_lock_nested(&parent->lock, parent->level);
1873         ns = aa_get_ns(__aa_findn_ns(&parent->sub_ns, dentry->d_name.name,
1874                                      dentry->d_name.len));
1875         if (!ns) {
1876                 error = -ENOENT;
1877                 goto out;
1878         }
1879         AA_BUG(ns_dir(ns) != dentry);
1880
1881         __aa_remove_ns(ns);
1882         aa_put_ns(ns);
1883
1884 out:
1885         mutex_unlock(&parent->lock);
1886         inode_lock_nested(dir, I_MUTEX_PARENT);
1887         inode_lock(dentry->d_inode);
1888         aa_put_ns(parent);
1889
1890         return error;
1891 }
1892
1893 static const struct inode_operations ns_dir_inode_operations = {
1894         .lookup         = simple_lookup,
1895         .mkdir          = ns_mkdir_op,
1896         .rmdir          = ns_rmdir_op,
1897 };
1898
1899 static void __aa_fs_list_remove_rawdata(struct aa_ns *ns)
1900 {
1901         struct aa_loaddata *ent, *tmp;
1902
1903         AA_BUG(!mutex_is_locked(&ns->lock));
1904
1905         list_for_each_entry_safe(ent, tmp, &ns->rawdata_list, list)
1906                 __aa_fs_remove_rawdata(ent);
1907 }
1908
1909 /**
1910  *
1911  * Requires: @ns->lock held
1912  */
1913 void __aafs_ns_rmdir(struct aa_ns *ns)
1914 {
1915         struct aa_ns *sub;
1916         struct aa_profile *child;
1917         int i;
1918
1919         if (!ns)
1920                 return;
1921         AA_BUG(!mutex_is_locked(&ns->lock));
1922
1923         list_for_each_entry(child, &ns->base.profiles, base.list)
1924                 __aafs_profile_rmdir(child);
1925
1926         list_for_each_entry(sub, &ns->sub_ns, base.list) {
1927                 mutex_lock_nested(&sub->lock, sub->level);
1928                 __aafs_ns_rmdir(sub);
1929                 mutex_unlock(&sub->lock);
1930         }
1931
1932         __aa_fs_list_remove_rawdata(ns);
1933
1934         if (ns_subns_dir(ns)) {
1935                 sub = d_inode(ns_subns_dir(ns))->i_private;
1936                 aa_put_ns(sub);
1937         }
1938         if (ns_subload(ns)) {
1939                 sub = d_inode(ns_subload(ns))->i_private;
1940                 aa_put_ns(sub);
1941         }
1942         if (ns_subreplace(ns)) {
1943                 sub = d_inode(ns_subreplace(ns))->i_private;
1944                 aa_put_ns(sub);
1945         }
1946         if (ns_subremove(ns)) {
1947                 sub = d_inode(ns_subremove(ns))->i_private;
1948                 aa_put_ns(sub);
1949         }
1950         if (ns_subrevision(ns)) {
1951                 sub = d_inode(ns_subrevision(ns))->i_private;
1952                 aa_put_ns(sub);
1953         }
1954
1955         for (i = AAFS_NS_SIZEOF - 1; i >= 0; --i) {
1956                 aafs_remove(ns->dents[i]);
1957                 ns->dents[i] = NULL;
1958         }
1959 }
1960
1961 /* assumes cleanup in caller */
1962 static int __aafs_ns_mkdir_entries(struct aa_ns *ns, struct dentry *dir)
1963 {
1964         struct dentry *dent;
1965
1966         AA_BUG(!ns);
1967         AA_BUG(!dir);
1968
1969         dent = aafs_create_dir("profiles", dir);
1970         if (IS_ERR(dent))
1971                 return PTR_ERR(dent);
1972         ns_subprofs_dir(ns) = dent;
1973
1974         dent = aafs_create_dir("raw_data", dir);
1975         if (IS_ERR(dent))
1976                 return PTR_ERR(dent);
1977         ns_subdata_dir(ns) = dent;
1978
1979         dent = aafs_create_file("revision", 0444, dir, ns,
1980                                 &aa_fs_ns_revision_fops);
1981         if (IS_ERR(dent))
1982                 return PTR_ERR(dent);
1983         aa_get_ns(ns);
1984         ns_subrevision(ns) = dent;
1985
1986         dent = aafs_create_file(".load", 0640, dir, ns,
1987                                       &aa_fs_profile_load);
1988         if (IS_ERR(dent))
1989                 return PTR_ERR(dent);
1990         aa_get_ns(ns);
1991         ns_subload(ns) = dent;
1992
1993         dent = aafs_create_file(".replace", 0640, dir, ns,
1994                                       &aa_fs_profile_replace);
1995         if (IS_ERR(dent))
1996                 return PTR_ERR(dent);
1997         aa_get_ns(ns);
1998         ns_subreplace(ns) = dent;
1999
2000         dent = aafs_create_file(".remove", 0640, dir, ns,
2001                                       &aa_fs_profile_remove);
2002         if (IS_ERR(dent))
2003                 return PTR_ERR(dent);
2004         aa_get_ns(ns);
2005         ns_subremove(ns) = dent;
2006
2007           /* use create_dentry so we can supply private data */
2008         dent = aafs_create("namespaces", S_IFDIR | 0755, dir, ns, NULL, NULL,
2009                            &ns_dir_inode_operations);
2010         if (IS_ERR(dent))
2011                 return PTR_ERR(dent);
2012         aa_get_ns(ns);
2013         ns_subns_dir(ns) = dent;
2014
2015         return 0;
2016 }
2017
2018 /*
2019  * Requires: @ns->lock held
2020  */
2021 int __aafs_ns_mkdir(struct aa_ns *ns, struct dentry *parent, const char *name,
2022                     struct dentry *dent)
2023 {
2024         struct aa_ns *sub;
2025         struct aa_profile *child;
2026         struct dentry *dir;
2027         int error;
2028
2029         AA_BUG(!ns);
2030         AA_BUG(!parent);
2031         AA_BUG(!mutex_is_locked(&ns->lock));
2032
2033         if (!name)
2034                 name = ns->base.name;
2035
2036         if (!dent) {
2037                 /* create ns dir if it doesn't already exist */
2038                 dent = aafs_create_dir(name, parent);
2039                 if (IS_ERR(dent))
2040                         goto fail;
2041         } else
2042                 dget(dent);
2043         ns_dir(ns) = dir = dent;
2044         error = __aafs_ns_mkdir_entries(ns, dir);
2045         if (error)
2046                 goto fail2;
2047
2048         /* profiles */
2049         list_for_each_entry(child, &ns->base.profiles, base.list) {
2050                 error = __aafs_profile_mkdir(child, ns_subprofs_dir(ns));
2051                 if (error)
2052                         goto fail2;
2053         }
2054
2055         /* subnamespaces */
2056         list_for_each_entry(sub, &ns->sub_ns, base.list) {
2057                 mutex_lock_nested(&sub->lock, sub->level);
2058                 error = __aafs_ns_mkdir(sub, ns_subns_dir(ns), NULL, NULL);
2059                 mutex_unlock(&sub->lock);
2060                 if (error)
2061                         goto fail2;
2062         }
2063
2064         return 0;
2065
2066 fail:
2067         error = PTR_ERR(dent);
2068
2069 fail2:
2070         __aafs_ns_rmdir(ns);
2071
2072         return error;
2073 }
2074
2075
2076 #define list_entry_is_head(pos, head, member) (&pos->member == (head))
2077
2078 /**
2079  * __next_ns - find the next namespace to list
2080  * @root: root namespace to stop search at (NOT NULL)
2081  * @ns: current ns position (NOT NULL)
2082  *
2083  * Find the next namespace from @ns under @root and handle all locking needed
2084  * while switching current namespace.
2085  *
2086  * Returns: next namespace or NULL if at last namespace under @root
2087  * Requires: ns->parent->lock to be held
2088  * NOTE: will not unlock root->lock
2089  */
2090 static struct aa_ns *__next_ns(struct aa_ns *root, struct aa_ns *ns)
2091 {
2092         struct aa_ns *parent, *next;
2093
2094         AA_BUG(!root);
2095         AA_BUG(!ns);
2096         AA_BUG(ns != root && !mutex_is_locked(&ns->parent->lock));
2097
2098         /* is next namespace a child */
2099         if (!list_empty(&ns->sub_ns)) {
2100                 next = list_first_entry(&ns->sub_ns, typeof(*ns), base.list);
2101                 mutex_lock_nested(&next->lock, next->level);
2102                 return next;
2103         }
2104
2105         /* check if the next ns is a sibling, parent, gp, .. */
2106         parent = ns->parent;
2107         while (ns != root) {
2108                 mutex_unlock(&ns->lock);
2109                 next = list_next_entry(ns, base.list);
2110                 if (!list_entry_is_head(next, &parent->sub_ns, base.list)) {
2111                         mutex_lock_nested(&next->lock, next->level);
2112                         return next;
2113                 }
2114                 ns = parent;
2115                 parent = parent->parent;
2116         }
2117
2118         return NULL;
2119 }
2120
2121 /**
2122  * __first_profile - find the first profile in a namespace
2123  * @root: namespace that is root of profiles being displayed (NOT NULL)
2124  * @ns: namespace to start in   (NOT NULL)
2125  *
2126  * Returns: unrefcounted profile or NULL if no profile
2127  * Requires: profile->ns.lock to be held
2128  */
2129 static struct aa_profile *__first_profile(struct aa_ns *root,
2130                                           struct aa_ns *ns)
2131 {
2132         AA_BUG(!root);
2133         AA_BUG(ns && !mutex_is_locked(&ns->lock));
2134
2135         for (; ns; ns = __next_ns(root, ns)) {
2136                 if (!list_empty(&ns->base.profiles))
2137                         return list_first_entry(&ns->base.profiles,
2138                                                 struct aa_profile, base.list);
2139         }
2140         return NULL;
2141 }
2142
2143 /**
2144  * __next_profile - step to the next profile in a profile tree
2145  * @profile: current profile in tree (NOT NULL)
2146  *
2147  * Perform a depth first traversal on the profile tree in a namespace
2148  *
2149  * Returns: next profile or NULL if done
2150  * Requires: profile->ns.lock to be held
2151  */
2152 static struct aa_profile *__next_profile(struct aa_profile *p)
2153 {
2154         struct aa_profile *parent;
2155         struct aa_ns *ns = p->ns;
2156
2157         AA_BUG(!mutex_is_locked(&profiles_ns(p)->lock));
2158
2159         /* is next profile a child */
2160         if (!list_empty(&p->base.profiles))
2161                 return list_first_entry(&p->base.profiles, typeof(*p),
2162                                         base.list);
2163
2164         /* is next profile a sibling, parent sibling, gp, sibling, .. */
2165         parent = rcu_dereference_protected(p->parent,
2166                                            mutex_is_locked(&p->ns->lock));
2167         while (parent) {
2168                 p = list_next_entry(p, base.list);
2169                 if (!list_entry_is_head(p, &parent->base.profiles, base.list))
2170                         return p;
2171                 p = parent;
2172                 parent = rcu_dereference_protected(parent->parent,
2173                                             mutex_is_locked(&parent->ns->lock));
2174         }
2175
2176         /* is next another profile in the namespace */
2177         p = list_next_entry(p, base.list);
2178         if (!list_entry_is_head(p, &ns->base.profiles, base.list))
2179                 return p;
2180
2181         return NULL;
2182 }
2183
2184 /**
2185  * next_profile - step to the next profile in where ever it may be
2186  * @root: root namespace  (NOT NULL)
2187  * @profile: current profile  (NOT NULL)
2188  *
2189  * Returns: next profile or NULL if there isn't one
2190  */
2191 static struct aa_profile *next_profile(struct aa_ns *root,
2192                                        struct aa_profile *profile)
2193 {
2194         struct aa_profile *next = __next_profile(profile);
2195         if (next)
2196                 return next;
2197
2198         /* finished all profiles in namespace move to next namespace */
2199         return __first_profile(root, __next_ns(root, profile->ns));
2200 }
2201
2202 /**
2203  * p_start - start a depth first traversal of profile tree
2204  * @f: seq_file to fill
2205  * @pos: current position
2206  *
2207  * Returns: first profile under current namespace or NULL if none found
2208  *
2209  * acquires first ns->lock
2210  */
2211 static void *p_start(struct seq_file *f, loff_t *pos)
2212 {
2213         struct aa_profile *profile = NULL;
2214         struct aa_ns *root = aa_get_current_ns();
2215         loff_t l = *pos;
2216         f->private = root;
2217
2218         /* find the first profile */
2219         mutex_lock_nested(&root->lock, root->level);
2220         profile = __first_profile(root, root);
2221
2222         /* skip to position */
2223         for (; profile && l > 0; l--)
2224                 profile = next_profile(root, profile);
2225
2226         return profile;
2227 }
2228
2229 /**
2230  * p_next - read the next profile entry
2231  * @f: seq_file to fill
2232  * @p: profile previously returned
2233  * @pos: current position
2234  *
2235  * Returns: next profile after @p or NULL if none
2236  *
2237  * may acquire/release locks in namespace tree as necessary
2238  */
2239 static void *p_next(struct seq_file *f, void *p, loff_t *pos)
2240 {
2241         struct aa_profile *profile = p;
2242         struct aa_ns *ns = f->private;
2243         (*pos)++;
2244
2245         return next_profile(ns, profile);
2246 }
2247
2248 /**
2249  * p_stop - stop depth first traversal
2250  * @f: seq_file we are filling
2251  * @p: the last profile writen
2252  *
2253  * Release all locking done by p_start/p_next on namespace tree
2254  */
2255 static void p_stop(struct seq_file *f, void *p)
2256 {
2257         struct aa_profile *profile = p;
2258         struct aa_ns *root = f->private, *ns;
2259
2260         if (profile) {
2261                 for (ns = profile->ns; ns && ns != root; ns = ns->parent)
2262                         mutex_unlock(&ns->lock);
2263         }
2264         mutex_unlock(&root->lock);
2265         aa_put_ns(root);
2266 }
2267
2268 /**
2269  * seq_show_profile - show a profile entry
2270  * @f: seq_file to file
2271  * @p: current position (profile)    (NOT NULL)
2272  *
2273  * Returns: error on failure
2274  */
2275 static int seq_show_profile(struct seq_file *f, void *p)
2276 {
2277         struct aa_profile *profile = (struct aa_profile *)p;
2278         struct aa_ns *root = f->private;
2279
2280         aa_label_seq_xprint(f, root, &profile->label,
2281                             FLAG_SHOW_MODE | FLAG_VIEW_SUBNS, GFP_KERNEL);
2282         seq_putc(f, '\n');
2283
2284         return 0;
2285 }
2286
2287 static const struct seq_operations aa_sfs_profiles_op = {
2288         .start = p_start,
2289         .next = p_next,
2290         .stop = p_stop,
2291         .show = seq_show_profile,
2292 };
2293
2294 static int profiles_open(struct inode *inode, struct file *file)
2295 {
2296         if (!policy_view_capable(NULL))
2297                 return -EACCES;
2298
2299         return seq_open(file, &aa_sfs_profiles_op);
2300 }
2301
2302 static int profiles_release(struct inode *inode, struct file *file)
2303 {
2304         return seq_release(inode, file);
2305 }
2306
2307 static const struct file_operations aa_sfs_profiles_fops = {
2308         .open = profiles_open,
2309         .read = seq_read,
2310         .llseek = seq_lseek,
2311         .release = profiles_release,
2312 };
2313
2314
2315 /** Base file system setup **/
2316 static struct aa_sfs_entry aa_sfs_entry_file[] = {
2317         AA_SFS_FILE_STRING("mask",
2318                            "create read write exec append mmap_exec link lock"),
2319         { }
2320 };
2321
2322 static struct aa_sfs_entry aa_sfs_entry_ptrace[] = {
2323         AA_SFS_FILE_STRING("mask", "read trace"),
2324         { }
2325 };
2326
2327 static struct aa_sfs_entry aa_sfs_entry_signal[] = {
2328         AA_SFS_FILE_STRING("mask", AA_SFS_SIG_MASK),
2329         { }
2330 };
2331
2332 static struct aa_sfs_entry aa_sfs_entry_attach[] = {
2333         AA_SFS_FILE_BOOLEAN("xattr", 1),
2334         { }
2335 };
2336 static struct aa_sfs_entry aa_sfs_entry_domain[] = {
2337         AA_SFS_FILE_BOOLEAN("change_hat",       1),
2338         AA_SFS_FILE_BOOLEAN("change_hatv",      1),
2339         AA_SFS_FILE_BOOLEAN("change_onexec",    1),
2340         AA_SFS_FILE_BOOLEAN("change_profile",   1),
2341         AA_SFS_FILE_BOOLEAN("stack",            1),
2342         AA_SFS_FILE_BOOLEAN("fix_binfmt_elf_mmap",      1),
2343         AA_SFS_FILE_BOOLEAN("post_nnp_subset",  1),
2344         AA_SFS_FILE_BOOLEAN("computed_longest_left",    1),
2345         AA_SFS_DIR("attach_conditions",         aa_sfs_entry_attach),
2346         AA_SFS_FILE_STRING("version", "1.2"),
2347         { }
2348 };
2349
2350 static struct aa_sfs_entry aa_sfs_entry_versions[] = {
2351         AA_SFS_FILE_BOOLEAN("v5",       1),
2352         AA_SFS_FILE_BOOLEAN("v6",       1),
2353         AA_SFS_FILE_BOOLEAN("v7",       1),
2354         AA_SFS_FILE_BOOLEAN("v8",       1),
2355         { }
2356 };
2357
2358 static struct aa_sfs_entry aa_sfs_entry_policy[] = {
2359         AA_SFS_DIR("versions",                  aa_sfs_entry_versions),
2360         AA_SFS_FILE_BOOLEAN("set_load",         1),
2361         { }
2362 };
2363
2364 static struct aa_sfs_entry aa_sfs_entry_mount[] = {
2365         AA_SFS_FILE_STRING("mask", "mount umount pivot_root"),
2366         { }
2367 };
2368
2369 static struct aa_sfs_entry aa_sfs_entry_ns[] = {
2370         AA_SFS_FILE_BOOLEAN("profile",          1),
2371         AA_SFS_FILE_BOOLEAN("pivot_root",       0),
2372         { }
2373 };
2374
2375 static struct aa_sfs_entry aa_sfs_entry_query_label[] = {
2376         AA_SFS_FILE_STRING("perms", "allow deny audit quiet"),
2377         AA_SFS_FILE_BOOLEAN("data",             1),
2378         AA_SFS_FILE_BOOLEAN("multi_transaction",        1),
2379         { }
2380 };
2381
2382 static struct aa_sfs_entry aa_sfs_entry_query[] = {
2383         AA_SFS_DIR("label",                     aa_sfs_entry_query_label),
2384         { }
2385 };
2386 static struct aa_sfs_entry aa_sfs_entry_features[] = {
2387         AA_SFS_DIR("policy",                    aa_sfs_entry_policy),
2388         AA_SFS_DIR("domain",                    aa_sfs_entry_domain),
2389         AA_SFS_DIR("file",                      aa_sfs_entry_file),
2390         AA_SFS_DIR("network_v8",                aa_sfs_entry_network),
2391         AA_SFS_DIR("mount",                     aa_sfs_entry_mount),
2392         AA_SFS_DIR("namespaces",                aa_sfs_entry_ns),
2393         AA_SFS_FILE_U64("capability",           VFS_CAP_FLAGS_MASK),
2394         AA_SFS_DIR("rlimit",                    aa_sfs_entry_rlimit),
2395         AA_SFS_DIR("caps",                      aa_sfs_entry_caps),
2396         AA_SFS_DIR("ptrace",                    aa_sfs_entry_ptrace),
2397         AA_SFS_DIR("signal",                    aa_sfs_entry_signal),
2398         AA_SFS_DIR("query",                     aa_sfs_entry_query),
2399         { }
2400 };
2401
2402 static struct aa_sfs_entry aa_sfs_entry_apparmor[] = {
2403         AA_SFS_FILE_FOPS(".access", 0666, &aa_sfs_access),
2404         AA_SFS_FILE_FOPS(".stacked", 0444, &seq_ns_stacked_fops),
2405         AA_SFS_FILE_FOPS(".ns_stacked", 0444, &seq_ns_nsstacked_fops),
2406         AA_SFS_FILE_FOPS(".ns_level", 0444, &seq_ns_level_fops),
2407         AA_SFS_FILE_FOPS(".ns_name", 0444, &seq_ns_name_fops),
2408         AA_SFS_FILE_FOPS("profiles", 0444, &aa_sfs_profiles_fops),
2409         AA_SFS_DIR("features", aa_sfs_entry_features),
2410         { }
2411 };
2412
2413 static struct aa_sfs_entry aa_sfs_entry =
2414         AA_SFS_DIR("apparmor", aa_sfs_entry_apparmor);
2415
2416 /**
2417  * entry_create_file - create a file entry in the apparmor securityfs
2418  * @fs_file: aa_sfs_entry to build an entry for (NOT NULL)
2419  * @parent: the parent dentry in the securityfs
2420  *
2421  * Use entry_remove_file to remove entries created with this fn.
2422  */
2423 static int __init entry_create_file(struct aa_sfs_entry *fs_file,
2424                                     struct dentry *parent)
2425 {
2426         int error = 0;
2427
2428         fs_file->dentry = securityfs_create_file(fs_file->name,
2429                                                  S_IFREG | fs_file->mode,
2430                                                  parent, fs_file,
2431                                                  fs_file->file_ops);
2432         if (IS_ERR(fs_file->dentry)) {
2433                 error = PTR_ERR(fs_file->dentry);
2434                 fs_file->dentry = NULL;
2435         }
2436         return error;
2437 }
2438
2439 static void __init entry_remove_dir(struct aa_sfs_entry *fs_dir);
2440 /**
2441  * entry_create_dir - recursively create a directory entry in the securityfs
2442  * @fs_dir: aa_sfs_entry (and all child entries) to build (NOT NULL)
2443  * @parent: the parent dentry in the securityfs
2444  *
2445  * Use entry_remove_dir to remove entries created with this fn.
2446  */
2447 static int __init entry_create_dir(struct aa_sfs_entry *fs_dir,
2448                                    struct dentry *parent)
2449 {
2450         struct aa_sfs_entry *fs_file;
2451         struct dentry *dir;
2452         int error;
2453
2454         dir = securityfs_create_dir(fs_dir->name, parent);
2455         if (IS_ERR(dir))
2456                 return PTR_ERR(dir);
2457         fs_dir->dentry = dir;
2458
2459         for (fs_file = fs_dir->v.files; fs_file && fs_file->name; ++fs_file) {
2460                 if (fs_file->v_type == AA_SFS_TYPE_DIR)
2461                         error = entry_create_dir(fs_file, fs_dir->dentry);
2462                 else
2463                         error = entry_create_file(fs_file, fs_dir->dentry);
2464                 if (error)
2465                         goto failed;
2466         }
2467
2468         return 0;
2469
2470 failed:
2471         entry_remove_dir(fs_dir);
2472
2473         return error;
2474 }
2475
2476 /**
2477  * entry_remove_file - drop a single file entry in the apparmor securityfs
2478  * @fs_file: aa_sfs_entry to detach from the securityfs (NOT NULL)
2479  */
2480 static void __init entry_remove_file(struct aa_sfs_entry *fs_file)
2481 {
2482         if (!fs_file->dentry)
2483                 return;
2484
2485         securityfs_remove(fs_file->dentry);
2486         fs_file->dentry = NULL;
2487 }
2488
2489 /**
2490  * entry_remove_dir - recursively drop a directory entry from the securityfs
2491  * @fs_dir: aa_sfs_entry (and all child entries) to detach (NOT NULL)
2492  */
2493 static void __init entry_remove_dir(struct aa_sfs_entry *fs_dir)
2494 {
2495         struct aa_sfs_entry *fs_file;
2496
2497         for (fs_file = fs_dir->v.files; fs_file && fs_file->name; ++fs_file) {
2498                 if (fs_file->v_type == AA_SFS_TYPE_DIR)
2499                         entry_remove_dir(fs_file);
2500                 else
2501                         entry_remove_file(fs_file);
2502         }
2503
2504         entry_remove_file(fs_dir);
2505 }
2506
2507 /**
2508  * aa_destroy_aafs - cleanup and free aafs
2509  *
2510  * releases dentries allocated by aa_create_aafs
2511  */
2512 void __init aa_destroy_aafs(void)
2513 {
2514         entry_remove_dir(&aa_sfs_entry);
2515 }
2516
2517
2518 #define NULL_FILE_NAME ".null"
2519 struct path aa_null;
2520
2521 static int aa_mk_null_file(struct dentry *parent)
2522 {
2523         struct vfsmount *mount = NULL;
2524         struct dentry *dentry;
2525         struct inode *inode;
2526         int count = 0;
2527         int error = simple_pin_fs(parent->d_sb->s_type, &mount, &count);
2528
2529         if (error)
2530                 return error;
2531
2532         inode_lock(d_inode(parent));
2533         dentry = lookup_one_len(NULL_FILE_NAME, parent, strlen(NULL_FILE_NAME));
2534         if (IS_ERR(dentry)) {
2535                 error = PTR_ERR(dentry);
2536                 goto out;
2537         }
2538         inode = new_inode(parent->d_inode->i_sb);
2539         if (!inode) {
2540                 error = -ENOMEM;
2541                 goto out1;
2542         }
2543
2544         inode->i_ino = get_next_ino();
2545         inode->i_mode = S_IFCHR | S_IRUGO | S_IWUGO;
2546         inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
2547         init_special_inode(inode, S_IFCHR | S_IRUGO | S_IWUGO,
2548                            MKDEV(MEM_MAJOR, 3));
2549         d_instantiate(dentry, inode);
2550         aa_null.dentry = dget(dentry);
2551         aa_null.mnt = mntget(mount);
2552
2553         error = 0;
2554
2555 out1:
2556         dput(dentry);
2557 out:
2558         inode_unlock(d_inode(parent));
2559         simple_release_fs(&mount, &count);
2560         return error;
2561 }
2562
2563
2564
2565 static const char *policy_get_link(struct dentry *dentry,
2566                                    struct inode *inode,
2567                                    struct delayed_call *done)
2568 {
2569         struct aa_ns *ns;
2570         struct path path;
2571
2572         if (!dentry)
2573                 return ERR_PTR(-ECHILD);
2574         ns = aa_get_current_ns();
2575         path.mnt = mntget(aafs_mnt);
2576         path.dentry = dget(ns_dir(ns));
2577         nd_jump_link(&path);
2578         aa_put_ns(ns);
2579
2580         return NULL;
2581 }
2582
2583 static int policy_readlink(struct dentry *dentry, char __user *buffer,
2584                            int buflen)
2585 {
2586         char name[32];
2587         int res;
2588
2589         res = snprintf(name, sizeof(name), "%s:[%lu]", AAFS_NAME,
2590                        d_inode(dentry)->i_ino);
2591         if (res > 0 && res < sizeof(name))
2592                 res = readlink_copy(buffer, buflen, name);
2593         else
2594                 res = -ENOENT;
2595
2596         return res;
2597 }
2598
2599 static const struct inode_operations policy_link_iops = {
2600         .readlink       = policy_readlink,
2601         .get_link       = policy_get_link,
2602 };
2603
2604
2605 /**
2606  * aa_create_aafs - create the apparmor security filesystem
2607  *
2608  * dentries created here are released by aa_destroy_aafs
2609  *
2610  * Returns: error on failure
2611  */
2612 static int __init aa_create_aafs(void)
2613 {
2614         struct dentry *dent;
2615         int error;
2616
2617         if (!apparmor_initialized)
2618                 return 0;
2619
2620         if (aa_sfs_entry.dentry) {
2621                 AA_ERROR("%s: AppArmor securityfs already exists\n", __func__);
2622                 return -EEXIST;
2623         }
2624
2625         /* setup apparmorfs used to virtualize policy/ */
2626         aafs_mnt = kern_mount(&aafs_ops);
2627         if (IS_ERR(aafs_mnt))
2628                 panic("can't set apparmorfs up\n");
2629         aafs_mnt->mnt_sb->s_flags &= ~SB_NOUSER;
2630
2631         /* Populate fs tree. */
2632         error = entry_create_dir(&aa_sfs_entry, NULL);
2633         if (error)
2634                 goto error;
2635
2636         dent = securityfs_create_file(".load", 0666, aa_sfs_entry.dentry,
2637                                       NULL, &aa_fs_profile_load);
2638         if (IS_ERR(dent))
2639                 goto dent_error;
2640         ns_subload(root_ns) = dent;
2641
2642         dent = securityfs_create_file(".replace", 0666, aa_sfs_entry.dentry,
2643                                       NULL, &aa_fs_profile_replace);
2644         if (IS_ERR(dent))
2645                 goto dent_error;
2646         ns_subreplace(root_ns) = dent;
2647
2648         dent = securityfs_create_file(".remove", 0666, aa_sfs_entry.dentry,
2649                                       NULL, &aa_fs_profile_remove);
2650         if (IS_ERR(dent))
2651                 goto dent_error;
2652         ns_subremove(root_ns) = dent;
2653
2654         dent = securityfs_create_file("revision", 0444, aa_sfs_entry.dentry,
2655                                       NULL, &aa_fs_ns_revision_fops);
2656         if (IS_ERR(dent))
2657                 goto dent_error;
2658         ns_subrevision(root_ns) = dent;
2659
2660         /* policy tree referenced by magic policy symlink */
2661         mutex_lock_nested(&root_ns->lock, root_ns->level);
2662         error = __aafs_ns_mkdir(root_ns, aafs_mnt->mnt_root, ".policy",
2663                                 aafs_mnt->mnt_root);
2664         mutex_unlock(&root_ns->lock);
2665         if (error)
2666                 goto error;
2667
2668         /* magic symlink similar to nsfs redirects based on task policy */
2669         dent = securityfs_create_symlink("policy", aa_sfs_entry.dentry,
2670                                          NULL, &policy_link_iops);
2671         if (IS_ERR(dent))
2672                 goto dent_error;
2673
2674         error = aa_mk_null_file(aa_sfs_entry.dentry);
2675         if (error)
2676                 goto error;
2677
2678         /* TODO: add default profile to apparmorfs */
2679
2680         /* Report that AppArmor fs is enabled */
2681         aa_info_message("AppArmor Filesystem Enabled");
2682         return 0;
2683
2684 dent_error:
2685         error = PTR_ERR(dent);
2686 error:
2687         aa_destroy_aafs();
2688         AA_ERROR("Error creating AppArmor securityfs\n");
2689         return error;
2690 }
2691
2692 fs_initcall(aa_create_aafs);