Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm...
[linux-drm-fsl-dcu.git] / security / smack / smackfs.c
1 /*
2  * Copyright (C) 2007 Casey Schaufler <casey@schaufler-ca.com>
3  *
4  *      This program is free software; you can redistribute it and/or modify
5  *      it under the terms of the GNU General Public License as published by
6  *      the Free Software Foundation, version 2.
7  *
8  * Authors:
9  *      Casey Schaufler <casey@schaufler-ca.com>
10  *      Ahmed S. Darwish <darwish.07@gmail.com>
11  *
12  * Special thanks to the authors of selinuxfs.
13  *
14  *      Karl MacMillan <kmacmillan@tresys.com>
15  *      James Morris <jmorris@redhat.com>
16  *
17  */
18
19 #include <linux/kernel.h>
20 #include <linux/vmalloc.h>
21 #include <linux/security.h>
22 #include <linux/mutex.h>
23 #include <linux/slab.h>
24 #include <net/net_namespace.h>
25 #include <net/cipso_ipv4.h>
26 #include <linux/seq_file.h>
27 #include <linux/ctype.h>
28 #include <linux/audit.h>
29 #include <linux/magic.h>
30 #include "smack.h"
31
32 /*
33  * smackfs pseudo filesystem.
34  */
35
36 enum smk_inos {
37         SMK_ROOT_INO    = 2,
38         SMK_LOAD        = 3,    /* load policy */
39         SMK_CIPSO       = 4,    /* load label -> CIPSO mapping */
40         SMK_DOI         = 5,    /* CIPSO DOI */
41         SMK_DIRECT      = 6,    /* CIPSO level indicating direct label */
42         SMK_AMBIENT     = 7,    /* internet ambient label */
43         SMK_NETLBLADDR  = 8,    /* single label hosts */
44         SMK_ONLYCAP     = 9,    /* the only "capable" label */
45         SMK_LOGGING     = 10,   /* logging */
46         SMK_LOAD_SELF   = 11,   /* task specific rules */
47         SMK_ACCESSES    = 12,   /* access policy */
48         SMK_MAPPED      = 13,   /* CIPSO level indicating mapped label */
49         SMK_LOAD2       = 14,   /* load policy with long labels */
50         SMK_LOAD_SELF2  = 15,   /* load task specific rules with long labels */
51         SMK_ACCESS2     = 16,   /* make an access check with long labels */
52         SMK_CIPSO2      = 17,   /* load long label -> CIPSO mapping */
53         SMK_REVOKE_SUBJ = 18,   /* set rules with subject label to '-' */
54         SMK_CHANGE_RULE = 19,   /* change or add rules (long labels) */
55         SMK_SYSLOG      = 20,   /* change syslog label) */
56         SMK_PTRACE      = 21,   /* set ptrace rule */
57 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
58         SMK_UNCONFINED  = 22,   /* define an unconfined label */
59 #endif
60 };
61
62 /*
63  * List locks
64  */
65 static DEFINE_MUTEX(smack_cipso_lock);
66 static DEFINE_MUTEX(smack_ambient_lock);
67 static DEFINE_MUTEX(smk_netlbladdr_lock);
68
69 /*
70  * This is the "ambient" label for network traffic.
71  * If it isn't somehow marked, use this.
72  * It can be reset via smackfs/ambient
73  */
74 struct smack_known *smack_net_ambient;
75
76 /*
77  * This is the level in a CIPSO header that indicates a
78  * smack label is contained directly in the category set.
79  * It can be reset via smackfs/direct
80  */
81 int smack_cipso_direct = SMACK_CIPSO_DIRECT_DEFAULT;
82
83 /*
84  * This is the level in a CIPSO header that indicates a
85  * secid is contained directly in the category set.
86  * It can be reset via smackfs/mapped
87  */
88 int smack_cipso_mapped = SMACK_CIPSO_MAPPED_DEFAULT;
89
90 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
91 /*
92  * Allow one label to be unconfined. This is for
93  * debugging and application bring-up purposes only.
94  * It is bad and wrong, but everyone seems to expect
95  * to have it.
96  */
97 struct smack_known *smack_unconfined;
98 #endif
99
100 /*
101  * If this value is set restrict syslog use to the label specified.
102  * It can be reset via smackfs/syslog
103  */
104 struct smack_known *smack_syslog_label;
105
106 /*
107  * Ptrace current rule
108  * SMACK_PTRACE_DEFAULT    regular smack ptrace rules (/proc based)
109  * SMACK_PTRACE_EXACT      labels must match, but can be overriden with
110  *                         CAP_SYS_PTRACE
111  * SMACK_PTRACE_DRACONIAN  lables must match, CAP_SYS_PTRACE has no effect
112  */
113 int smack_ptrace_rule = SMACK_PTRACE_DEFAULT;
114
115 /*
116  * Certain IP addresses may be designated as single label hosts.
117  * Packets are sent there unlabeled, but only from tasks that
118  * can write to the specified label.
119  */
120
121 LIST_HEAD(smk_netlbladdr_list);
122
123 /*
124  * Rule lists are maintained for each label.
125  * This master list is just for reading /smack/load and /smack/load2.
126  */
127 struct smack_master_list {
128         struct list_head        list;
129         struct smack_rule       *smk_rule;
130 };
131
132 LIST_HEAD(smack_rule_list);
133
134 struct smack_parsed_rule {
135         struct smack_known      *smk_subject;
136         struct smack_known      *smk_object;
137         int                     smk_access1;
138         int                     smk_access2;
139 };
140
141 static int smk_cipso_doi_value = SMACK_CIPSO_DOI_DEFAULT;
142
143 struct smack_known smack_cipso_option = {
144         .smk_known      = SMACK_CIPSO_OPTION,
145         .smk_secid      = 0,
146 };
147
148 /*
149  * Values for parsing cipso rules
150  * SMK_DIGITLEN: Length of a digit field in a rule.
151  * SMK_CIPSOMIN: Minimum possible cipso rule length.
152  * SMK_CIPSOMAX: Maximum possible cipso rule length.
153  */
154 #define SMK_DIGITLEN 4
155 #define SMK_CIPSOMIN (SMK_LABELLEN + 2 * SMK_DIGITLEN)
156 #define SMK_CIPSOMAX (SMK_CIPSOMIN + SMACK_CIPSO_MAXCATNUM * SMK_DIGITLEN)
157
158 /*
159  * Values for parsing MAC rules
160  * SMK_ACCESS: Maximum possible combination of access permissions
161  * SMK_ACCESSLEN: Maximum length for a rule access field
162  * SMK_LOADLEN: Smack rule length
163  */
164 #define SMK_OACCESS     "rwxa"
165 #define SMK_ACCESS      "rwxatl"
166 #define SMK_OACCESSLEN  (sizeof(SMK_OACCESS) - 1)
167 #define SMK_ACCESSLEN   (sizeof(SMK_ACCESS) - 1)
168 #define SMK_OLOADLEN    (SMK_LABELLEN + SMK_LABELLEN + SMK_OACCESSLEN)
169 #define SMK_LOADLEN     (SMK_LABELLEN + SMK_LABELLEN + SMK_ACCESSLEN)
170
171 /*
172  * Stricly for CIPSO level manipulation.
173  * Set the category bit number in a smack label sized buffer.
174  */
175 static inline void smack_catset_bit(unsigned int cat, char *catsetp)
176 {
177         if (cat == 0 || cat > (SMK_CIPSOLEN * 8))
178                 return;
179
180         catsetp[(cat - 1) / 8] |= 0x80 >> ((cat - 1) % 8);
181 }
182
183 /**
184  * smk_netlabel_audit_set - fill a netlbl_audit struct
185  * @nap: structure to fill
186  */
187 static void smk_netlabel_audit_set(struct netlbl_audit *nap)
188 {
189         struct smack_known *skp = smk_of_current();
190
191         nap->loginuid = audit_get_loginuid(current);
192         nap->sessionid = audit_get_sessionid(current);
193         nap->secid = skp->smk_secid;
194 }
195
196 /*
197  * Value for parsing single label host rules
198  * "1.2.3.4 X"
199  */
200 #define SMK_NETLBLADDRMIN       9
201
202 /**
203  * smk_set_access - add a rule to the rule list or replace an old rule
204  * @srp: the rule to add or replace
205  * @rule_list: the list of rules
206  * @rule_lock: the rule list lock
207  * @global: if non-zero, indicates a global rule
208  *
209  * Looks through the current subject/object/access list for
210  * the subject/object pair and replaces the access that was
211  * there. If the pair isn't found add it with the specified
212  * access.
213  *
214  * Returns 0 if nothing goes wrong or -ENOMEM if it fails
215  * during the allocation of the new pair to add.
216  */
217 static int smk_set_access(struct smack_parsed_rule *srp,
218                                 struct list_head *rule_list,
219                                 struct mutex *rule_lock, int global)
220 {
221         struct smack_rule *sp;
222         struct smack_master_list *smlp;
223         int found = 0;
224         int rc = 0;
225
226         mutex_lock(rule_lock);
227
228         /*
229          * Because the object label is less likely to match
230          * than the subject label check it first
231          */
232         list_for_each_entry_rcu(sp, rule_list, list) {
233                 if (sp->smk_object == srp->smk_object &&
234                     sp->smk_subject == srp->smk_subject) {
235                         found = 1;
236                         sp->smk_access |= srp->smk_access1;
237                         sp->smk_access &= ~srp->smk_access2;
238                         break;
239                 }
240         }
241
242         if (found == 0) {
243                 sp = kzalloc(sizeof(*sp), GFP_KERNEL);
244                 if (sp == NULL) {
245                         rc = -ENOMEM;
246                         goto out;
247                 }
248
249                 sp->smk_subject = srp->smk_subject;
250                 sp->smk_object = srp->smk_object;
251                 sp->smk_access = srp->smk_access1 & ~srp->smk_access2;
252
253                 list_add_rcu(&sp->list, rule_list);
254                 /*
255                  * If this is a global as opposed to self and a new rule
256                  * it needs to get added for reporting.
257                  */
258                 if (global) {
259                         smlp = kzalloc(sizeof(*smlp), GFP_KERNEL);
260                         if (smlp != NULL) {
261                                 smlp->smk_rule = sp;
262                                 list_add_rcu(&smlp->list, &smack_rule_list);
263                         } else
264                                 rc = -ENOMEM;
265                 }
266         }
267
268 out:
269         mutex_unlock(rule_lock);
270         return rc;
271 }
272
273 /**
274  * smk_perm_from_str - parse smack accesses from a text string
275  * @string: a text string that contains a Smack accesses code
276  *
277  * Returns an integer with respective bits set for specified accesses.
278  */
279 static int smk_perm_from_str(const char *string)
280 {
281         int perm = 0;
282         const char *cp;
283
284         for (cp = string; ; cp++)
285                 switch (*cp) {
286                 case '-':
287                         break;
288                 case 'r':
289                 case 'R':
290                         perm |= MAY_READ;
291                         break;
292                 case 'w':
293                 case 'W':
294                         perm |= MAY_WRITE;
295                         break;
296                 case 'x':
297                 case 'X':
298                         perm |= MAY_EXEC;
299                         break;
300                 case 'a':
301                 case 'A':
302                         perm |= MAY_APPEND;
303                         break;
304                 case 't':
305                 case 'T':
306                         perm |= MAY_TRANSMUTE;
307                         break;
308                 case 'l':
309                 case 'L':
310                         perm |= MAY_LOCK;
311                         break;
312                 case 'b':
313                 case 'B':
314                         perm |= MAY_BRINGUP;
315                         break;
316                 default:
317                         return perm;
318                 }
319 }
320
321 /**
322  * smk_fill_rule - Fill Smack rule from strings
323  * @subject: subject label string
324  * @object: object label string
325  * @access1: access string
326  * @access2: string with permissions to be removed
327  * @rule: Smack rule
328  * @import: if non-zero, import labels
329  * @len: label length limit
330  *
331  * Returns 0 on success, appropriate error code on failure.
332  */
333 static int smk_fill_rule(const char *subject, const char *object,
334                                 const char *access1, const char *access2,
335                                 struct smack_parsed_rule *rule, int import,
336                                 int len)
337 {
338         const char *cp;
339         struct smack_known *skp;
340
341         if (import) {
342                 rule->smk_subject = smk_import_entry(subject, len);
343                 if (IS_ERR(rule->smk_subject))
344                         return PTR_ERR(rule->smk_subject);
345
346                 rule->smk_object = smk_import_entry(object, len);
347                 if (IS_ERR(rule->smk_object))
348                         return PTR_ERR(rule->smk_object);
349         } else {
350                 cp = smk_parse_smack(subject, len);
351                 if (IS_ERR(cp))
352                         return PTR_ERR(cp);
353                 skp = smk_find_entry(cp);
354                 kfree(cp);
355                 if (skp == NULL)
356                         return -ENOENT;
357                 rule->smk_subject = skp;
358
359                 cp = smk_parse_smack(object, len);
360                 if (IS_ERR(cp))
361                         return PTR_ERR(cp);
362                 skp = smk_find_entry(cp);
363                 kfree(cp);
364                 if (skp == NULL)
365                         return -ENOENT;
366                 rule->smk_object = skp;
367         }
368
369         rule->smk_access1 = smk_perm_from_str(access1);
370         if (access2)
371                 rule->smk_access2 = smk_perm_from_str(access2);
372         else
373                 rule->smk_access2 = ~rule->smk_access1;
374
375         return 0;
376 }
377
378 /**
379  * smk_parse_rule - parse Smack rule from load string
380  * @data: string to be parsed whose size is SMK_LOADLEN
381  * @rule: Smack rule
382  * @import: if non-zero, import labels
383  *
384  * Returns 0 on success, -1 on errors.
385  */
386 static int smk_parse_rule(const char *data, struct smack_parsed_rule *rule,
387                                 int import)
388 {
389         int rc;
390
391         rc = smk_fill_rule(data, data + SMK_LABELLEN,
392                            data + SMK_LABELLEN + SMK_LABELLEN, NULL, rule,
393                            import, SMK_LABELLEN);
394         return rc;
395 }
396
397 /**
398  * smk_parse_long_rule - parse Smack rule from rule string
399  * @data: string to be parsed, null terminated
400  * @rule: Will be filled with Smack parsed rule
401  * @import: if non-zero, import labels
402  * @tokens: numer of substrings expected in data
403  *
404  * Returns number of processed bytes on success, -ERRNO on failure.
405  */
406 static ssize_t smk_parse_long_rule(char *data, struct smack_parsed_rule *rule,
407                                 int import, int tokens)
408 {
409         ssize_t cnt = 0;
410         char *tok[4];
411         int rc;
412         int i;
413
414         /*
415          * Parsing the rule in-place, filling all white-spaces with '\0'
416          */
417         for (i = 0; i < tokens; ++i) {
418                 while (isspace(data[cnt]))
419                         data[cnt++] = '\0';
420
421                 if (data[cnt] == '\0')
422                         /* Unexpected end of data */
423                         return -EINVAL;
424
425                 tok[i] = data + cnt;
426
427                 while (data[cnt] && !isspace(data[cnt]))
428                         ++cnt;
429         }
430         while (isspace(data[cnt]))
431                 data[cnt++] = '\0';
432
433         while (i < 4)
434                 tok[i++] = NULL;
435
436         rc = smk_fill_rule(tok[0], tok[1], tok[2], tok[3], rule, import, 0);
437         return rc == 0 ? cnt : rc;
438 }
439
440 #define SMK_FIXED24_FMT 0       /* Fixed 24byte label format */
441 #define SMK_LONG_FMT    1       /* Variable long label format */
442 #define SMK_CHANGE_FMT  2       /* Rule modification format */
443 /**
444  * smk_write_rules_list - write() for any /smack rule file
445  * @file: file pointer, not actually used
446  * @buf: where to get the data from
447  * @count: bytes sent
448  * @ppos: where to start - must be 0
449  * @rule_list: the list of rules to write to
450  * @rule_lock: lock for the rule list
451  * @format: /smack/load or /smack/load2 or /smack/change-rule format.
452  *
453  * Get one smack access rule from above.
454  * The format for SMK_LONG_FMT is:
455  *      "subject<whitespace>object<whitespace>access[<whitespace>...]"
456  * The format for SMK_FIXED24_FMT is exactly:
457  *      "subject                 object                  rwxat"
458  * The format for SMK_CHANGE_FMT is:
459  *      "subject<whitespace>object<whitespace>
460  *       acc_enable<whitespace>acc_disable[<whitespace>...]"
461  */
462 static ssize_t smk_write_rules_list(struct file *file, const char __user *buf,
463                                         size_t count, loff_t *ppos,
464                                         struct list_head *rule_list,
465                                         struct mutex *rule_lock, int format)
466 {
467         struct smack_parsed_rule rule;
468         char *data;
469         int rc;
470         int trunc = 0;
471         int tokens;
472         ssize_t cnt = 0;
473
474         /*
475          * No partial writes.
476          * Enough data must be present.
477          */
478         if (*ppos != 0)
479                 return -EINVAL;
480
481         if (format == SMK_FIXED24_FMT) {
482                 /*
483                  * Minor hack for backward compatibility
484                  */
485                 if (count < SMK_OLOADLEN || count > SMK_LOADLEN)
486                         return -EINVAL;
487         } else {
488                 if (count >= PAGE_SIZE) {
489                         count = PAGE_SIZE - 1;
490                         trunc = 1;
491                 }
492         }
493
494         data = kmalloc(count + 1, GFP_KERNEL);
495         if (data == NULL)
496                 return -ENOMEM;
497
498         if (copy_from_user(data, buf, count) != 0) {
499                 rc = -EFAULT;
500                 goto out;
501         }
502
503         /*
504          * In case of parsing only part of user buf,
505          * avoid having partial rule at the data buffer
506          */
507         if (trunc) {
508                 while (count > 0 && (data[count - 1] != '\n'))
509                         --count;
510                 if (count == 0) {
511                         rc = -EINVAL;
512                         goto out;
513                 }
514         }
515
516         data[count] = '\0';
517         tokens = (format == SMK_CHANGE_FMT ? 4 : 3);
518         while (cnt < count) {
519                 if (format == SMK_FIXED24_FMT) {
520                         rc = smk_parse_rule(data, &rule, 1);
521                         if (rc < 0)
522                                 goto out;
523                         cnt = count;
524                 } else {
525                         rc = smk_parse_long_rule(data + cnt, &rule, 1, tokens);
526                         if (rc < 0)
527                                 goto out;
528                         if (rc == 0) {
529                                 rc = -EINVAL;
530                                 goto out;
531                         }
532                         cnt += rc;
533                 }
534
535                 if (rule_list == NULL)
536                         rc = smk_set_access(&rule, &rule.smk_subject->smk_rules,
537                                 &rule.smk_subject->smk_rules_lock, 1);
538                 else
539                         rc = smk_set_access(&rule, rule_list, rule_lock, 0);
540
541                 if (rc)
542                         goto out;
543         }
544
545         rc = cnt;
546 out:
547         kfree(data);
548         return rc;
549 }
550
551 /*
552  * Core logic for smackfs seq list operations.
553  */
554
555 static void *smk_seq_start(struct seq_file *s, loff_t *pos,
556                                 struct list_head *head)
557 {
558         struct list_head *list;
559         int i = *pos;
560
561         rcu_read_lock();
562         for (list = rcu_dereference(list_next_rcu(head));
563                 list != head;
564                 list = rcu_dereference(list_next_rcu(list))) {
565                 if (i-- == 0)
566                         return list;
567         }
568
569         return NULL;
570 }
571
572 static void *smk_seq_next(struct seq_file *s, void *v, loff_t *pos,
573                                 struct list_head *head)
574 {
575         struct list_head *list = v;
576
577         ++*pos;
578         list = rcu_dereference(list_next_rcu(list));
579
580         return (list == head) ? NULL : list;
581 }
582
583 static void smk_seq_stop(struct seq_file *s, void *v)
584 {
585         rcu_read_unlock();
586 }
587
588 static void smk_rule_show(struct seq_file *s, struct smack_rule *srp, int max)
589 {
590         /*
591          * Don't show any rules with label names too long for
592          * interface file (/smack/load or /smack/load2)
593          * because you should expect to be able to write
594          * anything you read back.
595          */
596         if (strlen(srp->smk_subject->smk_known) >= max ||
597             strlen(srp->smk_object->smk_known) >= max)
598                 return;
599
600         if (srp->smk_access == 0)
601                 return;
602
603         seq_printf(s, "%s %s",
604                    srp->smk_subject->smk_known,
605                    srp->smk_object->smk_known);
606
607         seq_putc(s, ' ');
608
609         if (srp->smk_access & MAY_READ)
610                 seq_putc(s, 'r');
611         if (srp->smk_access & MAY_WRITE)
612                 seq_putc(s, 'w');
613         if (srp->smk_access & MAY_EXEC)
614                 seq_putc(s, 'x');
615         if (srp->smk_access & MAY_APPEND)
616                 seq_putc(s, 'a');
617         if (srp->smk_access & MAY_TRANSMUTE)
618                 seq_putc(s, 't');
619         if (srp->smk_access & MAY_LOCK)
620                 seq_putc(s, 'l');
621         if (srp->smk_access & MAY_BRINGUP)
622                 seq_putc(s, 'b');
623
624         seq_putc(s, '\n');
625 }
626
627 /*
628  * Seq_file read operations for /smack/load
629  */
630
631 static void *load2_seq_start(struct seq_file *s, loff_t *pos)
632 {
633         return smk_seq_start(s, pos, &smack_rule_list);
634 }
635
636 static void *load2_seq_next(struct seq_file *s, void *v, loff_t *pos)
637 {
638         return smk_seq_next(s, v, pos, &smack_rule_list);
639 }
640
641 static int load_seq_show(struct seq_file *s, void *v)
642 {
643         struct list_head *list = v;
644         struct smack_master_list *smlp =
645                 list_entry_rcu(list, struct smack_master_list, list);
646
647         smk_rule_show(s, smlp->smk_rule, SMK_LABELLEN);
648
649         return 0;
650 }
651
652 static const struct seq_operations load_seq_ops = {
653         .start = load2_seq_start,
654         .next  = load2_seq_next,
655         .show  = load_seq_show,
656         .stop  = smk_seq_stop,
657 };
658
659 /**
660  * smk_open_load - open() for /smack/load
661  * @inode: inode structure representing file
662  * @file: "load" file pointer
663  *
664  * For reading, use load_seq_* seq_file reading operations.
665  */
666 static int smk_open_load(struct inode *inode, struct file *file)
667 {
668         return seq_open(file, &load_seq_ops);
669 }
670
671 /**
672  * smk_write_load - write() for /smack/load
673  * @file: file pointer, not actually used
674  * @buf: where to get the data from
675  * @count: bytes sent
676  * @ppos: where to start - must be 0
677  *
678  */
679 static ssize_t smk_write_load(struct file *file, const char __user *buf,
680                               size_t count, loff_t *ppos)
681 {
682         /*
683          * Must have privilege.
684          * No partial writes.
685          * Enough data must be present.
686          */
687         if (!smack_privileged(CAP_MAC_ADMIN))
688                 return -EPERM;
689
690         return smk_write_rules_list(file, buf, count, ppos, NULL, NULL,
691                                     SMK_FIXED24_FMT);
692 }
693
694 static const struct file_operations smk_load_ops = {
695         .open           = smk_open_load,
696         .read           = seq_read,
697         .llseek         = seq_lseek,
698         .write          = smk_write_load,
699         .release        = seq_release,
700 };
701
702 /**
703  * smk_cipso_doi - initialize the CIPSO domain
704  */
705 static void smk_cipso_doi(void)
706 {
707         int rc;
708         struct cipso_v4_doi *doip;
709         struct netlbl_audit nai;
710
711         smk_netlabel_audit_set(&nai);
712
713         rc = netlbl_cfg_map_del(NULL, PF_INET, NULL, NULL, &nai);
714         if (rc != 0)
715                 printk(KERN_WARNING "%s:%d remove rc = %d\n",
716                        __func__, __LINE__, rc);
717
718         doip = kmalloc(sizeof(struct cipso_v4_doi), GFP_KERNEL);
719         if (doip == NULL)
720                 panic("smack:  Failed to initialize cipso DOI.\n");
721         doip->map.std = NULL;
722         doip->doi = smk_cipso_doi_value;
723         doip->type = CIPSO_V4_MAP_PASS;
724         doip->tags[0] = CIPSO_V4_TAG_RBITMAP;
725         for (rc = 1; rc < CIPSO_V4_TAG_MAXCNT; rc++)
726                 doip->tags[rc] = CIPSO_V4_TAG_INVALID;
727
728         rc = netlbl_cfg_cipsov4_add(doip, &nai);
729         if (rc != 0) {
730                 printk(KERN_WARNING "%s:%d cipso add rc = %d\n",
731                        __func__, __LINE__, rc);
732                 kfree(doip);
733                 return;
734         }
735         rc = netlbl_cfg_cipsov4_map_add(doip->doi, NULL, NULL, NULL, &nai);
736         if (rc != 0) {
737                 printk(KERN_WARNING "%s:%d map add rc = %d\n",
738                        __func__, __LINE__, rc);
739                 kfree(doip);
740                 return;
741         }
742 }
743
744 /**
745  * smk_unlbl_ambient - initialize the unlabeled domain
746  * @oldambient: previous domain string
747  */
748 static void smk_unlbl_ambient(char *oldambient)
749 {
750         int rc;
751         struct netlbl_audit nai;
752
753         smk_netlabel_audit_set(&nai);
754
755         if (oldambient != NULL) {
756                 rc = netlbl_cfg_map_del(oldambient, PF_INET, NULL, NULL, &nai);
757                 if (rc != 0)
758                         printk(KERN_WARNING "%s:%d remove rc = %d\n",
759                                __func__, __LINE__, rc);
760         }
761         if (smack_net_ambient == NULL)
762                 smack_net_ambient = &smack_known_floor;
763
764         rc = netlbl_cfg_unlbl_map_add(smack_net_ambient->smk_known, PF_INET,
765                                       NULL, NULL, &nai);
766         if (rc != 0)
767                 printk(KERN_WARNING "%s:%d add rc = %d\n",
768                        __func__, __LINE__, rc);
769 }
770
771 /*
772  * Seq_file read operations for /smack/cipso
773  */
774
775 static void *cipso_seq_start(struct seq_file *s, loff_t *pos)
776 {
777         return smk_seq_start(s, pos, &smack_known_list);
778 }
779
780 static void *cipso_seq_next(struct seq_file *s, void *v, loff_t *pos)
781 {
782         return smk_seq_next(s, v, pos, &smack_known_list);
783 }
784
785 /*
786  * Print cipso labels in format:
787  * label level[/cat[,cat]]
788  */
789 static int cipso_seq_show(struct seq_file *s, void *v)
790 {
791         struct list_head  *list = v;
792         struct smack_known *skp =
793                 list_entry_rcu(list, struct smack_known, list);
794         struct netlbl_lsm_catmap *cmp = skp->smk_netlabel.attr.mls.cat;
795         char sep = '/';
796         int i;
797
798         /*
799          * Don't show a label that could not have been set using
800          * /smack/cipso. This is in support of the notion that
801          * anything read from /smack/cipso ought to be writeable
802          * to /smack/cipso.
803          *
804          * /smack/cipso2 should be used instead.
805          */
806         if (strlen(skp->smk_known) >= SMK_LABELLEN)
807                 return 0;
808
809         seq_printf(s, "%s %3d", skp->smk_known, skp->smk_netlabel.attr.mls.lvl);
810
811         for (i = netlbl_catmap_walk(cmp, 0); i >= 0;
812              i = netlbl_catmap_walk(cmp, i + 1)) {
813                 seq_printf(s, "%c%d", sep, i);
814                 sep = ',';
815         }
816
817         seq_putc(s, '\n');
818
819         return 0;
820 }
821
822 static const struct seq_operations cipso_seq_ops = {
823         .start = cipso_seq_start,
824         .next  = cipso_seq_next,
825         .show  = cipso_seq_show,
826         .stop  = smk_seq_stop,
827 };
828
829 /**
830  * smk_open_cipso - open() for /smack/cipso
831  * @inode: inode structure representing file
832  * @file: "cipso" file pointer
833  *
834  * Connect our cipso_seq_* operations with /smack/cipso
835  * file_operations
836  */
837 static int smk_open_cipso(struct inode *inode, struct file *file)
838 {
839         return seq_open(file, &cipso_seq_ops);
840 }
841
842 /**
843  * smk_set_cipso - do the work for write() for cipso and cipso2
844  * @file: file pointer, not actually used
845  * @buf: where to get the data from
846  * @count: bytes sent
847  * @ppos: where to start
848  * @format: /smack/cipso or /smack/cipso2
849  *
850  * Accepts only one cipso rule per write call.
851  * Returns number of bytes written or error code, as appropriate
852  */
853 static ssize_t smk_set_cipso(struct file *file, const char __user *buf,
854                                 size_t count, loff_t *ppos, int format)
855 {
856         struct smack_known *skp;
857         struct netlbl_lsm_secattr ncats;
858         char mapcatset[SMK_CIPSOLEN];
859         int maplevel;
860         unsigned int cat;
861         int catlen;
862         ssize_t rc = -EINVAL;
863         char *data = NULL;
864         char *rule;
865         int ret;
866         int i;
867
868         /*
869          * Must have privilege.
870          * No partial writes.
871          * Enough data must be present.
872          */
873         if (!smack_privileged(CAP_MAC_ADMIN))
874                 return -EPERM;
875         if (*ppos != 0)
876                 return -EINVAL;
877         if (format == SMK_FIXED24_FMT &&
878             (count < SMK_CIPSOMIN || count > SMK_CIPSOMAX))
879                 return -EINVAL;
880
881         data = kzalloc(count + 1, GFP_KERNEL);
882         if (data == NULL)
883                 return -ENOMEM;
884
885         if (copy_from_user(data, buf, count) != 0) {
886                 rc = -EFAULT;
887                 goto unlockedout;
888         }
889
890         data[count] = '\0';
891         rule = data;
892         /*
893          * Only allow one writer at a time. Writes should be
894          * quite rare and small in any case.
895          */
896         mutex_lock(&smack_cipso_lock);
897
898         skp = smk_import_entry(rule, 0);
899         if (IS_ERR(skp)) {
900                 rc = PTR_ERR(skp);
901                 goto out;
902         }
903
904         if (format == SMK_FIXED24_FMT)
905                 rule += SMK_LABELLEN;
906         else
907                 rule += strlen(skp->smk_known) + 1;
908
909         ret = sscanf(rule, "%d", &maplevel);
910         if (ret != 1 || maplevel > SMACK_CIPSO_MAXLEVEL)
911                 goto out;
912
913         rule += SMK_DIGITLEN;
914         ret = sscanf(rule, "%d", &catlen);
915         if (ret != 1 || catlen > SMACK_CIPSO_MAXCATNUM)
916                 goto out;
917
918         if (format == SMK_FIXED24_FMT &&
919             count != (SMK_CIPSOMIN + catlen * SMK_DIGITLEN))
920                 goto out;
921
922         memset(mapcatset, 0, sizeof(mapcatset));
923
924         for (i = 0; i < catlen; i++) {
925                 rule += SMK_DIGITLEN;
926                 ret = sscanf(rule, "%u", &cat);
927                 if (ret != 1 || cat > SMACK_CIPSO_MAXCATNUM)
928                         goto out;
929
930                 smack_catset_bit(cat, mapcatset);
931         }
932
933         rc = smk_netlbl_mls(maplevel, mapcatset, &ncats, SMK_CIPSOLEN);
934         if (rc >= 0) {
935                 netlbl_catmap_free(skp->smk_netlabel.attr.mls.cat);
936                 skp->smk_netlabel.attr.mls.cat = ncats.attr.mls.cat;
937                 skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl;
938                 rc = count;
939         }
940
941 out:
942         mutex_unlock(&smack_cipso_lock);
943 unlockedout:
944         kfree(data);
945         return rc;
946 }
947
948 /**
949  * smk_write_cipso - write() for /smack/cipso
950  * @file: file pointer, not actually used
951  * @buf: where to get the data from
952  * @count: bytes sent
953  * @ppos: where to start
954  *
955  * Accepts only one cipso rule per write call.
956  * Returns number of bytes written or error code, as appropriate
957  */
958 static ssize_t smk_write_cipso(struct file *file, const char __user *buf,
959                                size_t count, loff_t *ppos)
960 {
961         return smk_set_cipso(file, buf, count, ppos, SMK_FIXED24_FMT);
962 }
963
964 static const struct file_operations smk_cipso_ops = {
965         .open           = smk_open_cipso,
966         .read           = seq_read,
967         .llseek         = seq_lseek,
968         .write          = smk_write_cipso,
969         .release        = seq_release,
970 };
971
972 /*
973  * Seq_file read operations for /smack/cipso2
974  */
975
976 /*
977  * Print cipso labels in format:
978  * label level[/cat[,cat]]
979  */
980 static int cipso2_seq_show(struct seq_file *s, void *v)
981 {
982         struct list_head  *list = v;
983         struct smack_known *skp =
984                 list_entry_rcu(list, struct smack_known, list);
985         struct netlbl_lsm_catmap *cmp = skp->smk_netlabel.attr.mls.cat;
986         char sep = '/';
987         int i;
988
989         seq_printf(s, "%s %3d", skp->smk_known, skp->smk_netlabel.attr.mls.lvl);
990
991         for (i = netlbl_catmap_walk(cmp, 0); i >= 0;
992              i = netlbl_catmap_walk(cmp, i + 1)) {
993                 seq_printf(s, "%c%d", sep, i);
994                 sep = ',';
995         }
996
997         seq_putc(s, '\n');
998
999         return 0;
1000 }
1001
1002 static const struct seq_operations cipso2_seq_ops = {
1003         .start = cipso_seq_start,
1004         .next  = cipso_seq_next,
1005         .show  = cipso2_seq_show,
1006         .stop  = smk_seq_stop,
1007 };
1008
1009 /**
1010  * smk_open_cipso2 - open() for /smack/cipso2
1011  * @inode: inode structure representing file
1012  * @file: "cipso2" file pointer
1013  *
1014  * Connect our cipso_seq_* operations with /smack/cipso2
1015  * file_operations
1016  */
1017 static int smk_open_cipso2(struct inode *inode, struct file *file)
1018 {
1019         return seq_open(file, &cipso2_seq_ops);
1020 }
1021
1022 /**
1023  * smk_write_cipso2 - write() for /smack/cipso2
1024  * @file: file pointer, not actually used
1025  * @buf: where to get the data from
1026  * @count: bytes sent
1027  * @ppos: where to start
1028  *
1029  * Accepts only one cipso rule per write call.
1030  * Returns number of bytes written or error code, as appropriate
1031  */
1032 static ssize_t smk_write_cipso2(struct file *file, const char __user *buf,
1033                               size_t count, loff_t *ppos)
1034 {
1035         return smk_set_cipso(file, buf, count, ppos, SMK_LONG_FMT);
1036 }
1037
1038 static const struct file_operations smk_cipso2_ops = {
1039         .open           = smk_open_cipso2,
1040         .read           = seq_read,
1041         .llseek         = seq_lseek,
1042         .write          = smk_write_cipso2,
1043         .release        = seq_release,
1044 };
1045
1046 /*
1047  * Seq_file read operations for /smack/netlabel
1048  */
1049
1050 static void *netlbladdr_seq_start(struct seq_file *s, loff_t *pos)
1051 {
1052         return smk_seq_start(s, pos, &smk_netlbladdr_list);
1053 }
1054
1055 static void *netlbladdr_seq_next(struct seq_file *s, void *v, loff_t *pos)
1056 {
1057         return smk_seq_next(s, v, pos, &smk_netlbladdr_list);
1058 }
1059 #define BEBITS  (sizeof(__be32) * 8)
1060
1061 /*
1062  * Print host/label pairs
1063  */
1064 static int netlbladdr_seq_show(struct seq_file *s, void *v)
1065 {
1066         struct list_head *list = v;
1067         struct smk_netlbladdr *skp =
1068                         list_entry_rcu(list, struct smk_netlbladdr, list);
1069         unsigned char *hp = (char *) &skp->smk_host.sin_addr.s_addr;
1070         int maskn;
1071         u32 temp_mask = be32_to_cpu(skp->smk_mask.s_addr);
1072
1073         for (maskn = 0; temp_mask; temp_mask <<= 1, maskn++);
1074
1075         seq_printf(s, "%u.%u.%u.%u/%d %s\n",
1076                 hp[0], hp[1], hp[2], hp[3], maskn, skp->smk_label->smk_known);
1077
1078         return 0;
1079 }
1080
1081 static const struct seq_operations netlbladdr_seq_ops = {
1082         .start = netlbladdr_seq_start,
1083         .next  = netlbladdr_seq_next,
1084         .show  = netlbladdr_seq_show,
1085         .stop  = smk_seq_stop,
1086 };
1087
1088 /**
1089  * smk_open_netlbladdr - open() for /smack/netlabel
1090  * @inode: inode structure representing file
1091  * @file: "netlabel" file pointer
1092  *
1093  * Connect our netlbladdr_seq_* operations with /smack/netlabel
1094  * file_operations
1095  */
1096 static int smk_open_netlbladdr(struct inode *inode, struct file *file)
1097 {
1098         return seq_open(file, &netlbladdr_seq_ops);
1099 }
1100
1101 /**
1102  * smk_netlbladdr_insert
1103  * @new : netlabel to insert
1104  *
1105  * This helper insert netlabel in the smack_netlbladdrs list
1106  * sorted by netmask length (longest to smallest)
1107  * locked by &smk_netlbladdr_lock in smk_write_netlbladdr
1108  *
1109  */
1110 static void smk_netlbladdr_insert(struct smk_netlbladdr *new)
1111 {
1112         struct smk_netlbladdr *m, *m_next;
1113
1114         if (list_empty(&smk_netlbladdr_list)) {
1115                 list_add_rcu(&new->list, &smk_netlbladdr_list);
1116                 return;
1117         }
1118
1119         m = list_entry_rcu(smk_netlbladdr_list.next,
1120                            struct smk_netlbladdr, list);
1121
1122         /* the comparison '>' is a bit hacky, but works */
1123         if (new->smk_mask.s_addr > m->smk_mask.s_addr) {
1124                 list_add_rcu(&new->list, &smk_netlbladdr_list);
1125                 return;
1126         }
1127
1128         list_for_each_entry_rcu(m, &smk_netlbladdr_list, list) {
1129                 if (list_is_last(&m->list, &smk_netlbladdr_list)) {
1130                         list_add_rcu(&new->list, &m->list);
1131                         return;
1132                 }
1133                 m_next = list_entry_rcu(m->list.next,
1134                                         struct smk_netlbladdr, list);
1135                 if (new->smk_mask.s_addr > m_next->smk_mask.s_addr) {
1136                         list_add_rcu(&new->list, &m->list);
1137                         return;
1138                 }
1139         }
1140 }
1141
1142
1143 /**
1144  * smk_write_netlbladdr - write() for /smack/netlabel
1145  * @file: file pointer, not actually used
1146  * @buf: where to get the data from
1147  * @count: bytes sent
1148  * @ppos: where to start
1149  *
1150  * Accepts only one netlbladdr per write call.
1151  * Returns number of bytes written or error code, as appropriate
1152  */
1153 static ssize_t smk_write_netlbladdr(struct file *file, const char __user *buf,
1154                                 size_t count, loff_t *ppos)
1155 {
1156         struct smk_netlbladdr *snp;
1157         struct sockaddr_in newname;
1158         char *smack;
1159         struct smack_known *skp;
1160         char *data;
1161         char *host = (char *)&newname.sin_addr.s_addr;
1162         int rc;
1163         struct netlbl_audit audit_info;
1164         struct in_addr mask;
1165         unsigned int m;
1166         int found;
1167         u32 mask_bits = (1<<31);
1168         __be32 nsa;
1169         u32 temp_mask;
1170
1171         /*
1172          * Must have privilege.
1173          * No partial writes.
1174          * Enough data must be present.
1175          * "<addr/mask, as a.b.c.d/e><space><label>"
1176          * "<addr, as a.b.c.d><space><label>"
1177          */
1178         if (!smack_privileged(CAP_MAC_ADMIN))
1179                 return -EPERM;
1180         if (*ppos != 0)
1181                 return -EINVAL;
1182         if (count < SMK_NETLBLADDRMIN)
1183                 return -EINVAL;
1184
1185         data = kzalloc(count + 1, GFP_KERNEL);
1186         if (data == NULL)
1187                 return -ENOMEM;
1188
1189         if (copy_from_user(data, buf, count) != 0) {
1190                 rc = -EFAULT;
1191                 goto free_data_out;
1192         }
1193
1194         smack = kzalloc(count + 1, GFP_KERNEL);
1195         if (smack == NULL) {
1196                 rc = -ENOMEM;
1197                 goto free_data_out;
1198         }
1199
1200         data[count] = '\0';
1201
1202         rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd/%u %s",
1203                 &host[0], &host[1], &host[2], &host[3], &m, smack);
1204         if (rc != 6) {
1205                 rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd %s",
1206                         &host[0], &host[1], &host[2], &host[3], smack);
1207                 if (rc != 5) {
1208                         rc = -EINVAL;
1209                         goto free_out;
1210                 }
1211                 m = BEBITS;
1212         }
1213         if (m > BEBITS) {
1214                 rc = -EINVAL;
1215                 goto free_out;
1216         }
1217
1218         /*
1219          * If smack begins with '-', it is an option, don't import it
1220          */
1221         if (smack[0] != '-') {
1222                 skp = smk_import_entry(smack, 0);
1223                 if (IS_ERR(skp)) {
1224                         rc = PTR_ERR(skp);
1225                         goto free_out;
1226                 }
1227         } else {
1228                 /* check known options */
1229                 if (strcmp(smack, smack_cipso_option.smk_known) == 0)
1230                         skp = &smack_cipso_option;
1231                 else {
1232                         rc = -EINVAL;
1233                         goto free_out;
1234                 }
1235         }
1236
1237         for (temp_mask = 0; m > 0; m--) {
1238                 temp_mask |= mask_bits;
1239                 mask_bits >>= 1;
1240         }
1241         mask.s_addr = cpu_to_be32(temp_mask);
1242
1243         newname.sin_addr.s_addr &= mask.s_addr;
1244         /*
1245          * Only allow one writer at a time. Writes should be
1246          * quite rare and small in any case.
1247          */
1248         mutex_lock(&smk_netlbladdr_lock);
1249
1250         nsa = newname.sin_addr.s_addr;
1251         /* try to find if the prefix is already in the list */
1252         found = 0;
1253         list_for_each_entry_rcu(snp, &smk_netlbladdr_list, list) {
1254                 if (snp->smk_host.sin_addr.s_addr == nsa &&
1255                     snp->smk_mask.s_addr == mask.s_addr) {
1256                         found = 1;
1257                         break;
1258                 }
1259         }
1260         smk_netlabel_audit_set(&audit_info);
1261
1262         if (found == 0) {
1263                 snp = kzalloc(sizeof(*snp), GFP_KERNEL);
1264                 if (snp == NULL)
1265                         rc = -ENOMEM;
1266                 else {
1267                         rc = 0;
1268                         snp->smk_host.sin_addr.s_addr = newname.sin_addr.s_addr;
1269                         snp->smk_mask.s_addr = mask.s_addr;
1270                         snp->smk_label = skp;
1271                         smk_netlbladdr_insert(snp);
1272                 }
1273         } else {
1274                 /* we delete the unlabeled entry, only if the previous label
1275                  * wasn't the special CIPSO option */
1276                 if (snp->smk_label != &smack_cipso_option)
1277                         rc = netlbl_cfg_unlbl_static_del(&init_net, NULL,
1278                                         &snp->smk_host.sin_addr, &snp->smk_mask,
1279                                         PF_INET, &audit_info);
1280                 else
1281                         rc = 0;
1282                 snp->smk_label = skp;
1283         }
1284
1285         /*
1286          * Now tell netlabel about the single label nature of
1287          * this host so that incoming packets get labeled.
1288          * but only if we didn't get the special CIPSO option
1289          */
1290         if (rc == 0 && skp != &smack_cipso_option)
1291                 rc = netlbl_cfg_unlbl_static_add(&init_net, NULL,
1292                         &snp->smk_host.sin_addr, &snp->smk_mask, PF_INET,
1293                         snp->smk_label->smk_secid, &audit_info);
1294
1295         if (rc == 0)
1296                 rc = count;
1297
1298         mutex_unlock(&smk_netlbladdr_lock);
1299
1300 free_out:
1301         kfree(smack);
1302 free_data_out:
1303         kfree(data);
1304
1305         return rc;
1306 }
1307
1308 static const struct file_operations smk_netlbladdr_ops = {
1309         .open           = smk_open_netlbladdr,
1310         .read           = seq_read,
1311         .llseek         = seq_lseek,
1312         .write          = smk_write_netlbladdr,
1313         .release        = seq_release,
1314 };
1315
1316 /**
1317  * smk_read_doi - read() for /smack/doi
1318  * @filp: file pointer, not actually used
1319  * @buf: where to put the result
1320  * @count: maximum to send along
1321  * @ppos: where to start
1322  *
1323  * Returns number of bytes read or error code, as appropriate
1324  */
1325 static ssize_t smk_read_doi(struct file *filp, char __user *buf,
1326                             size_t count, loff_t *ppos)
1327 {
1328         char temp[80];
1329         ssize_t rc;
1330
1331         if (*ppos != 0)
1332                 return 0;
1333
1334         sprintf(temp, "%d", smk_cipso_doi_value);
1335         rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1336
1337         return rc;
1338 }
1339
1340 /**
1341  * smk_write_doi - write() for /smack/doi
1342  * @file: file pointer, not actually used
1343  * @buf: where to get the data from
1344  * @count: bytes sent
1345  * @ppos: where to start
1346  *
1347  * Returns number of bytes written or error code, as appropriate
1348  */
1349 static ssize_t smk_write_doi(struct file *file, const char __user *buf,
1350                              size_t count, loff_t *ppos)
1351 {
1352         char temp[80];
1353         int i;
1354
1355         if (!smack_privileged(CAP_MAC_ADMIN))
1356                 return -EPERM;
1357
1358         if (count >= sizeof(temp) || count == 0)
1359                 return -EINVAL;
1360
1361         if (copy_from_user(temp, buf, count) != 0)
1362                 return -EFAULT;
1363
1364         temp[count] = '\0';
1365
1366         if (sscanf(temp, "%d", &i) != 1)
1367                 return -EINVAL;
1368
1369         smk_cipso_doi_value = i;
1370
1371         smk_cipso_doi();
1372
1373         return count;
1374 }
1375
1376 static const struct file_operations smk_doi_ops = {
1377         .read           = smk_read_doi,
1378         .write          = smk_write_doi,
1379         .llseek         = default_llseek,
1380 };
1381
1382 /**
1383  * smk_read_direct - read() for /smack/direct
1384  * @filp: file pointer, not actually used
1385  * @buf: where to put the result
1386  * @count: maximum to send along
1387  * @ppos: where to start
1388  *
1389  * Returns number of bytes read or error code, as appropriate
1390  */
1391 static ssize_t smk_read_direct(struct file *filp, char __user *buf,
1392                                size_t count, loff_t *ppos)
1393 {
1394         char temp[80];
1395         ssize_t rc;
1396
1397         if (*ppos != 0)
1398                 return 0;
1399
1400         sprintf(temp, "%d", smack_cipso_direct);
1401         rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1402
1403         return rc;
1404 }
1405
1406 /**
1407  * smk_write_direct - write() for /smack/direct
1408  * @file: file pointer, not actually used
1409  * @buf: where to get the data from
1410  * @count: bytes sent
1411  * @ppos: where to start
1412  *
1413  * Returns number of bytes written or error code, as appropriate
1414  */
1415 static ssize_t smk_write_direct(struct file *file, const char __user *buf,
1416                                 size_t count, loff_t *ppos)
1417 {
1418         struct smack_known *skp;
1419         char temp[80];
1420         int i;
1421
1422         if (!smack_privileged(CAP_MAC_ADMIN))
1423                 return -EPERM;
1424
1425         if (count >= sizeof(temp) || count == 0)
1426                 return -EINVAL;
1427
1428         if (copy_from_user(temp, buf, count) != 0)
1429                 return -EFAULT;
1430
1431         temp[count] = '\0';
1432
1433         if (sscanf(temp, "%d", &i) != 1)
1434                 return -EINVAL;
1435
1436         /*
1437          * Don't do anything if the value hasn't actually changed.
1438          * If it is changing reset the level on entries that were
1439          * set up to be direct when they were created.
1440          */
1441         if (smack_cipso_direct != i) {
1442                 mutex_lock(&smack_known_lock);
1443                 list_for_each_entry_rcu(skp, &smack_known_list, list)
1444                         if (skp->smk_netlabel.attr.mls.lvl ==
1445                             smack_cipso_direct)
1446                                 skp->smk_netlabel.attr.mls.lvl = i;
1447                 smack_cipso_direct = i;
1448                 mutex_unlock(&smack_known_lock);
1449         }
1450
1451         return count;
1452 }
1453
1454 static const struct file_operations smk_direct_ops = {
1455         .read           = smk_read_direct,
1456         .write          = smk_write_direct,
1457         .llseek         = default_llseek,
1458 };
1459
1460 /**
1461  * smk_read_mapped - read() for /smack/mapped
1462  * @filp: file pointer, not actually used
1463  * @buf: where to put the result
1464  * @count: maximum to send along
1465  * @ppos: where to start
1466  *
1467  * Returns number of bytes read or error code, as appropriate
1468  */
1469 static ssize_t smk_read_mapped(struct file *filp, char __user *buf,
1470                                size_t count, loff_t *ppos)
1471 {
1472         char temp[80];
1473         ssize_t rc;
1474
1475         if (*ppos != 0)
1476                 return 0;
1477
1478         sprintf(temp, "%d", smack_cipso_mapped);
1479         rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1480
1481         return rc;
1482 }
1483
1484 /**
1485  * smk_write_mapped - write() for /smack/mapped
1486  * @file: file pointer, not actually used
1487  * @buf: where to get the data from
1488  * @count: bytes sent
1489  * @ppos: where to start
1490  *
1491  * Returns number of bytes written or error code, as appropriate
1492  */
1493 static ssize_t smk_write_mapped(struct file *file, const char __user *buf,
1494                                 size_t count, loff_t *ppos)
1495 {
1496         struct smack_known *skp;
1497         char temp[80];
1498         int i;
1499
1500         if (!smack_privileged(CAP_MAC_ADMIN))
1501                 return -EPERM;
1502
1503         if (count >= sizeof(temp) || count == 0)
1504                 return -EINVAL;
1505
1506         if (copy_from_user(temp, buf, count) != 0)
1507                 return -EFAULT;
1508
1509         temp[count] = '\0';
1510
1511         if (sscanf(temp, "%d", &i) != 1)
1512                 return -EINVAL;
1513
1514         /*
1515          * Don't do anything if the value hasn't actually changed.
1516          * If it is changing reset the level on entries that were
1517          * set up to be mapped when they were created.
1518          */
1519         if (smack_cipso_mapped != i) {
1520                 mutex_lock(&smack_known_lock);
1521                 list_for_each_entry_rcu(skp, &smack_known_list, list)
1522                         if (skp->smk_netlabel.attr.mls.lvl ==
1523                             smack_cipso_mapped)
1524                                 skp->smk_netlabel.attr.mls.lvl = i;
1525                 smack_cipso_mapped = i;
1526                 mutex_unlock(&smack_known_lock);
1527         }
1528
1529         return count;
1530 }
1531
1532 static const struct file_operations smk_mapped_ops = {
1533         .read           = smk_read_mapped,
1534         .write          = smk_write_mapped,
1535         .llseek         = default_llseek,
1536 };
1537
1538 /**
1539  * smk_read_ambient - read() for /smack/ambient
1540  * @filp: file pointer, not actually used
1541  * @buf: where to put the result
1542  * @cn: maximum to send along
1543  * @ppos: where to start
1544  *
1545  * Returns number of bytes read or error code, as appropriate
1546  */
1547 static ssize_t smk_read_ambient(struct file *filp, char __user *buf,
1548                                 size_t cn, loff_t *ppos)
1549 {
1550         ssize_t rc;
1551         int asize;
1552
1553         if (*ppos != 0)
1554                 return 0;
1555         /*
1556          * Being careful to avoid a problem in the case where
1557          * smack_net_ambient gets changed in midstream.
1558          */
1559         mutex_lock(&smack_ambient_lock);
1560
1561         asize = strlen(smack_net_ambient->smk_known) + 1;
1562
1563         if (cn >= asize)
1564                 rc = simple_read_from_buffer(buf, cn, ppos,
1565                                              smack_net_ambient->smk_known,
1566                                              asize);
1567         else
1568                 rc = -EINVAL;
1569
1570         mutex_unlock(&smack_ambient_lock);
1571
1572         return rc;
1573 }
1574
1575 /**
1576  * smk_write_ambient - write() for /smack/ambient
1577  * @file: file pointer, not actually used
1578  * @buf: where to get the data from
1579  * @count: bytes sent
1580  * @ppos: where to start
1581  *
1582  * Returns number of bytes written or error code, as appropriate
1583  */
1584 static ssize_t smk_write_ambient(struct file *file, const char __user *buf,
1585                                  size_t count, loff_t *ppos)
1586 {
1587         struct smack_known *skp;
1588         char *oldambient;
1589         char *data;
1590         int rc = count;
1591
1592         if (!smack_privileged(CAP_MAC_ADMIN))
1593                 return -EPERM;
1594
1595         data = kzalloc(count + 1, GFP_KERNEL);
1596         if (data == NULL)
1597                 return -ENOMEM;
1598
1599         if (copy_from_user(data, buf, count) != 0) {
1600                 rc = -EFAULT;
1601                 goto out;
1602         }
1603
1604         skp = smk_import_entry(data, count);
1605         if (IS_ERR(skp)) {
1606                 rc = PTR_ERR(skp);
1607                 goto out;
1608         }
1609
1610         mutex_lock(&smack_ambient_lock);
1611
1612         oldambient = smack_net_ambient->smk_known;
1613         smack_net_ambient = skp;
1614         smk_unlbl_ambient(oldambient);
1615
1616         mutex_unlock(&smack_ambient_lock);
1617
1618 out:
1619         kfree(data);
1620         return rc;
1621 }
1622
1623 static const struct file_operations smk_ambient_ops = {
1624         .read           = smk_read_ambient,
1625         .write          = smk_write_ambient,
1626         .llseek         = default_llseek,
1627 };
1628
1629 /*
1630  * Seq_file operations for /smack/onlycap
1631  */
1632 static void *onlycap_seq_start(struct seq_file *s, loff_t *pos)
1633 {
1634         return smk_seq_start(s, pos, &smack_onlycap_list);
1635 }
1636
1637 static void *onlycap_seq_next(struct seq_file *s, void *v, loff_t *pos)
1638 {
1639         return smk_seq_next(s, v, pos, &smack_onlycap_list);
1640 }
1641
1642 static int onlycap_seq_show(struct seq_file *s, void *v)
1643 {
1644         struct list_head *list = v;
1645         struct smack_onlycap *sop =
1646                 list_entry_rcu(list, struct smack_onlycap, list);
1647
1648         seq_puts(s, sop->smk_label->smk_known);
1649         seq_putc(s, ' ');
1650
1651         return 0;
1652 }
1653
1654 static const struct seq_operations onlycap_seq_ops = {
1655         .start = onlycap_seq_start,
1656         .next  = onlycap_seq_next,
1657         .show  = onlycap_seq_show,
1658         .stop  = smk_seq_stop,
1659 };
1660
1661 static int smk_open_onlycap(struct inode *inode, struct file *file)
1662 {
1663         return seq_open(file, &onlycap_seq_ops);
1664 }
1665
1666 /**
1667  * smk_list_swap_rcu - swap public list with a private one in RCU-safe way
1668  * The caller must hold appropriate mutex to prevent concurrent modifications
1669  * to the public list.
1670  * Private list is assumed to be not accessible to other threads yet.
1671  *
1672  * @public: public list
1673  * @private: private list
1674  */
1675 static void smk_list_swap_rcu(struct list_head *public,
1676                               struct list_head *private)
1677 {
1678         struct list_head *first, *last;
1679
1680         if (list_empty(public)) {
1681                 list_splice_init_rcu(private, public, synchronize_rcu);
1682         } else {
1683                 /* Remember public list before replacing it */
1684                 first = public->next;
1685                 last = public->prev;
1686
1687                 /* Publish private list in place of public in RCU-safe way */
1688                 private->prev->next = public;
1689                 private->next->prev = public;
1690                 rcu_assign_pointer(public->next, private->next);
1691                 public->prev = private->prev;
1692
1693                 synchronize_rcu();
1694
1695                 /* When all readers are done with the old public list,
1696                  * attach it in place of private */
1697                 private->next = first;
1698                 private->prev = last;
1699                 first->prev = private;
1700                 last->next = private;
1701         }
1702 }
1703
1704 /**
1705  * smk_write_onlycap - write() for smackfs/onlycap
1706  * @file: file pointer, not actually used
1707  * @buf: where to get the data from
1708  * @count: bytes sent
1709  * @ppos: where to start
1710  *
1711  * Returns number of bytes written or error code, as appropriate
1712  */
1713 static ssize_t smk_write_onlycap(struct file *file, const char __user *buf,
1714                                  size_t count, loff_t *ppos)
1715 {
1716         char *data;
1717         char *data_parse;
1718         char *tok;
1719         struct smack_known *skp;
1720         struct smack_onlycap *sop;
1721         struct smack_onlycap *sop2;
1722         LIST_HEAD(list_tmp);
1723         int rc = count;
1724
1725         if (!smack_privileged(CAP_MAC_ADMIN))
1726                 return -EPERM;
1727
1728         data = kzalloc(count + 1, GFP_KERNEL);
1729         if (data == NULL)
1730                 return -ENOMEM;
1731
1732         if (copy_from_user(data, buf, count) != 0) {
1733                 kfree(data);
1734                 return -EFAULT;
1735         }
1736
1737         data_parse = data;
1738         while ((tok = strsep(&data_parse, " ")) != NULL) {
1739                 if (!*tok)
1740                         continue;
1741
1742                 skp = smk_import_entry(tok, 0);
1743                 if (IS_ERR(skp)) {
1744                         rc = PTR_ERR(skp);
1745                         break;
1746                 }
1747
1748                 sop = kzalloc(sizeof(*sop), GFP_KERNEL);
1749                 if (sop == NULL) {
1750                         rc = -ENOMEM;
1751                         break;
1752                 }
1753
1754                 sop->smk_label = skp;
1755                 list_add_rcu(&sop->list, &list_tmp);
1756         }
1757         kfree(data);
1758
1759         /*
1760          * Clear the smack_onlycap on invalid label errors. This means
1761          * that we can pass a null string to unset the onlycap value.
1762          *
1763          * Importing will also reject a label beginning with '-',
1764          * so "-usecapabilities" will also work.
1765          *
1766          * But do so only on invalid label, not on system errors.
1767          * The invalid label must be first to count as clearing attempt.
1768          */
1769         if (rc == -EINVAL && list_empty(&list_tmp))
1770                 rc = count;
1771
1772         if (rc >= 0) {
1773                 mutex_lock(&smack_onlycap_lock);
1774                 smk_list_swap_rcu(&smack_onlycap_list, &list_tmp);
1775                 mutex_unlock(&smack_onlycap_lock);
1776         }
1777
1778         list_for_each_entry_safe(sop, sop2, &list_tmp, list)
1779                 kfree(sop);
1780
1781         return rc;
1782 }
1783
1784 static const struct file_operations smk_onlycap_ops = {
1785         .open           = smk_open_onlycap,
1786         .read           = seq_read,
1787         .write          = smk_write_onlycap,
1788         .llseek         = seq_lseek,
1789         .release        = seq_release,
1790 };
1791
1792 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
1793 /**
1794  * smk_read_unconfined - read() for smackfs/unconfined
1795  * @filp: file pointer, not actually used
1796  * @buf: where to put the result
1797  * @cn: maximum to send along
1798  * @ppos: where to start
1799  *
1800  * Returns number of bytes read or error code, as appropriate
1801  */
1802 static ssize_t smk_read_unconfined(struct file *filp, char __user *buf,
1803                                         size_t cn, loff_t *ppos)
1804 {
1805         char *smack = "";
1806         ssize_t rc = -EINVAL;
1807         int asize;
1808
1809         if (*ppos != 0)
1810                 return 0;
1811
1812         if (smack_unconfined != NULL)
1813                 smack = smack_unconfined->smk_known;
1814
1815         asize = strlen(smack) + 1;
1816
1817         if (cn >= asize)
1818                 rc = simple_read_from_buffer(buf, cn, ppos, smack, asize);
1819
1820         return rc;
1821 }
1822
1823 /**
1824  * smk_write_unconfined - write() for smackfs/unconfined
1825  * @file: file pointer, not actually used
1826  * @buf: where to get the data from
1827  * @count: bytes sent
1828  * @ppos: where to start
1829  *
1830  * Returns number of bytes written or error code, as appropriate
1831  */
1832 static ssize_t smk_write_unconfined(struct file *file, const char __user *buf,
1833                                         size_t count, loff_t *ppos)
1834 {
1835         char *data;
1836         struct smack_known *skp;
1837         int rc = count;
1838
1839         if (!smack_privileged(CAP_MAC_ADMIN))
1840                 return -EPERM;
1841
1842         data = kzalloc(count + 1, GFP_KERNEL);
1843         if (data == NULL)
1844                 return -ENOMEM;
1845
1846         if (copy_from_user(data, buf, count) != 0) {
1847                 rc = -EFAULT;
1848                 goto freeout;
1849         }
1850
1851         /*
1852          * Clear the smack_unconfined on invalid label errors. This means
1853          * that we can pass a null string to unset the unconfined value.
1854          *
1855          * Importing will also reject a label beginning with '-',
1856          * so "-confine" will also work.
1857          *
1858          * But do so only on invalid label, not on system errors.
1859          */
1860         skp = smk_import_entry(data, count);
1861         if (PTR_ERR(skp) == -EINVAL)
1862                 skp = NULL;
1863         else if (IS_ERR(skp)) {
1864                 rc = PTR_ERR(skp);
1865                 goto freeout;
1866         }
1867
1868         smack_unconfined = skp;
1869
1870 freeout:
1871         kfree(data);
1872         return rc;
1873 }
1874
1875 static const struct file_operations smk_unconfined_ops = {
1876         .read           = smk_read_unconfined,
1877         .write          = smk_write_unconfined,
1878         .llseek         = default_llseek,
1879 };
1880 #endif /* CONFIG_SECURITY_SMACK_BRINGUP */
1881
1882 /**
1883  * smk_read_logging - read() for /smack/logging
1884  * @filp: file pointer, not actually used
1885  * @buf: where to put the result
1886  * @cn: maximum to send along
1887  * @ppos: where to start
1888  *
1889  * Returns number of bytes read or error code, as appropriate
1890  */
1891 static ssize_t smk_read_logging(struct file *filp, char __user *buf,
1892                                 size_t count, loff_t *ppos)
1893 {
1894         char temp[32];
1895         ssize_t rc;
1896
1897         if (*ppos != 0)
1898                 return 0;
1899
1900         sprintf(temp, "%d\n", log_policy);
1901         rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1902         return rc;
1903 }
1904
1905 /**
1906  * smk_write_logging - write() for /smack/logging
1907  * @file: file pointer, not actually used
1908  * @buf: where to get the data from
1909  * @count: bytes sent
1910  * @ppos: where to start
1911  *
1912  * Returns number of bytes written or error code, as appropriate
1913  */
1914 static ssize_t smk_write_logging(struct file *file, const char __user *buf,
1915                                 size_t count, loff_t *ppos)
1916 {
1917         char temp[32];
1918         int i;
1919
1920         if (!smack_privileged(CAP_MAC_ADMIN))
1921                 return -EPERM;
1922
1923         if (count >= sizeof(temp) || count == 0)
1924                 return -EINVAL;
1925
1926         if (copy_from_user(temp, buf, count) != 0)
1927                 return -EFAULT;
1928
1929         temp[count] = '\0';
1930
1931         if (sscanf(temp, "%d", &i) != 1)
1932                 return -EINVAL;
1933         if (i < 0 || i > 3)
1934                 return -EINVAL;
1935         log_policy = i;
1936         return count;
1937 }
1938
1939
1940
1941 static const struct file_operations smk_logging_ops = {
1942         .read           = smk_read_logging,
1943         .write          = smk_write_logging,
1944         .llseek         = default_llseek,
1945 };
1946
1947 /*
1948  * Seq_file read operations for /smack/load-self
1949  */
1950
1951 static void *load_self_seq_start(struct seq_file *s, loff_t *pos)
1952 {
1953         struct task_smack *tsp = current_security();
1954
1955         return smk_seq_start(s, pos, &tsp->smk_rules);
1956 }
1957
1958 static void *load_self_seq_next(struct seq_file *s, void *v, loff_t *pos)
1959 {
1960         struct task_smack *tsp = current_security();
1961
1962         return smk_seq_next(s, v, pos, &tsp->smk_rules);
1963 }
1964
1965 static int load_self_seq_show(struct seq_file *s, void *v)
1966 {
1967         struct list_head *list = v;
1968         struct smack_rule *srp =
1969                 list_entry_rcu(list, struct smack_rule, list);
1970
1971         smk_rule_show(s, srp, SMK_LABELLEN);
1972
1973         return 0;
1974 }
1975
1976 static const struct seq_operations load_self_seq_ops = {
1977         .start = load_self_seq_start,
1978         .next  = load_self_seq_next,
1979         .show  = load_self_seq_show,
1980         .stop  = smk_seq_stop,
1981 };
1982
1983
1984 /**
1985  * smk_open_load_self - open() for /smack/load-self2
1986  * @inode: inode structure representing file
1987  * @file: "load" file pointer
1988  *
1989  * For reading, use load_seq_* seq_file reading operations.
1990  */
1991 static int smk_open_load_self(struct inode *inode, struct file *file)
1992 {
1993         return seq_open(file, &load_self_seq_ops);
1994 }
1995
1996 /**
1997  * smk_write_load_self - write() for /smack/load-self
1998  * @file: file pointer, not actually used
1999  * @buf: where to get the data from
2000  * @count: bytes sent
2001  * @ppos: where to start - must be 0
2002  *
2003  */
2004 static ssize_t smk_write_load_self(struct file *file, const char __user *buf,
2005                               size_t count, loff_t *ppos)
2006 {
2007         struct task_smack *tsp = current_security();
2008
2009         return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules,
2010                                     &tsp->smk_rules_lock, SMK_FIXED24_FMT);
2011 }
2012
2013 static const struct file_operations smk_load_self_ops = {
2014         .open           = smk_open_load_self,
2015         .read           = seq_read,
2016         .llseek         = seq_lseek,
2017         .write          = smk_write_load_self,
2018         .release        = seq_release,
2019 };
2020
2021 /**
2022  * smk_user_access - handle access check transaction
2023  * @file: file pointer
2024  * @buf: data from user space
2025  * @count: bytes sent
2026  * @ppos: where to start - must be 0
2027  */
2028 static ssize_t smk_user_access(struct file *file, const char __user *buf,
2029                                 size_t count, loff_t *ppos, int format)
2030 {
2031         struct smack_parsed_rule rule;
2032         char *data;
2033         int res;
2034
2035         data = simple_transaction_get(file, buf, count);
2036         if (IS_ERR(data))
2037                 return PTR_ERR(data);
2038
2039         if (format == SMK_FIXED24_FMT) {
2040                 if (count < SMK_LOADLEN)
2041                         return -EINVAL;
2042                 res = smk_parse_rule(data, &rule, 0);
2043         } else {
2044                 /*
2045                  * simple_transaction_get() returns null-terminated data
2046                  */
2047                 res = smk_parse_long_rule(data, &rule, 0, 3);
2048         }
2049
2050         if (res >= 0)
2051                 res = smk_access(rule.smk_subject, rule.smk_object,
2052                                  rule.smk_access1, NULL);
2053         else if (res != -ENOENT)
2054                 return res;
2055
2056         /*
2057          * smk_access() can return a value > 0 in the "bringup" case.
2058          */
2059         data[0] = res >= 0 ? '1' : '0';
2060         data[1] = '\0';
2061
2062         simple_transaction_set(file, 2);
2063
2064         if (format == SMK_FIXED24_FMT)
2065                 return SMK_LOADLEN;
2066         return count;
2067 }
2068
2069 /**
2070  * smk_write_access - handle access check transaction
2071  * @file: file pointer
2072  * @buf: data from user space
2073  * @count: bytes sent
2074  * @ppos: where to start - must be 0
2075  */
2076 static ssize_t smk_write_access(struct file *file, const char __user *buf,
2077                                 size_t count, loff_t *ppos)
2078 {
2079         return smk_user_access(file, buf, count, ppos, SMK_FIXED24_FMT);
2080 }
2081
2082 static const struct file_operations smk_access_ops = {
2083         .write          = smk_write_access,
2084         .read           = simple_transaction_read,
2085         .release        = simple_transaction_release,
2086         .llseek         = generic_file_llseek,
2087 };
2088
2089
2090 /*
2091  * Seq_file read operations for /smack/load2
2092  */
2093
2094 static int load2_seq_show(struct seq_file *s, void *v)
2095 {
2096         struct list_head *list = v;
2097         struct smack_master_list *smlp =
2098                 list_entry_rcu(list, struct smack_master_list, list);
2099
2100         smk_rule_show(s, smlp->smk_rule, SMK_LONGLABEL);
2101
2102         return 0;
2103 }
2104
2105 static const struct seq_operations load2_seq_ops = {
2106         .start = load2_seq_start,
2107         .next  = load2_seq_next,
2108         .show  = load2_seq_show,
2109         .stop  = smk_seq_stop,
2110 };
2111
2112 /**
2113  * smk_open_load2 - open() for /smack/load2
2114  * @inode: inode structure representing file
2115  * @file: "load2" file pointer
2116  *
2117  * For reading, use load2_seq_* seq_file reading operations.
2118  */
2119 static int smk_open_load2(struct inode *inode, struct file *file)
2120 {
2121         return seq_open(file, &load2_seq_ops);
2122 }
2123
2124 /**
2125  * smk_write_load2 - write() for /smack/load2
2126  * @file: file pointer, not actually used
2127  * @buf: where to get the data from
2128  * @count: bytes sent
2129  * @ppos: where to start - must be 0
2130  *
2131  */
2132 static ssize_t smk_write_load2(struct file *file, const char __user *buf,
2133                                 size_t count, loff_t *ppos)
2134 {
2135         /*
2136          * Must have privilege.
2137          */
2138         if (!smack_privileged(CAP_MAC_ADMIN))
2139                 return -EPERM;
2140
2141         return smk_write_rules_list(file, buf, count, ppos, NULL, NULL,
2142                                     SMK_LONG_FMT);
2143 }
2144
2145 static const struct file_operations smk_load2_ops = {
2146         .open           = smk_open_load2,
2147         .read           = seq_read,
2148         .llseek         = seq_lseek,
2149         .write          = smk_write_load2,
2150         .release        = seq_release,
2151 };
2152
2153 /*
2154  * Seq_file read operations for /smack/load-self2
2155  */
2156
2157 static void *load_self2_seq_start(struct seq_file *s, loff_t *pos)
2158 {
2159         struct task_smack *tsp = current_security();
2160
2161         return smk_seq_start(s, pos, &tsp->smk_rules);
2162 }
2163
2164 static void *load_self2_seq_next(struct seq_file *s, void *v, loff_t *pos)
2165 {
2166         struct task_smack *tsp = current_security();
2167
2168         return smk_seq_next(s, v, pos, &tsp->smk_rules);
2169 }
2170
2171 static int load_self2_seq_show(struct seq_file *s, void *v)
2172 {
2173         struct list_head *list = v;
2174         struct smack_rule *srp =
2175                 list_entry_rcu(list, struct smack_rule, list);
2176
2177         smk_rule_show(s, srp, SMK_LONGLABEL);
2178
2179         return 0;
2180 }
2181
2182 static const struct seq_operations load_self2_seq_ops = {
2183         .start = load_self2_seq_start,
2184         .next  = load_self2_seq_next,
2185         .show  = load_self2_seq_show,
2186         .stop  = smk_seq_stop,
2187 };
2188
2189 /**
2190  * smk_open_load_self2 - open() for /smack/load-self2
2191  * @inode: inode structure representing file
2192  * @file: "load" file pointer
2193  *
2194  * For reading, use load_seq_* seq_file reading operations.
2195  */
2196 static int smk_open_load_self2(struct inode *inode, struct file *file)
2197 {
2198         return seq_open(file, &load_self2_seq_ops);
2199 }
2200
2201 /**
2202  * smk_write_load_self2 - write() for /smack/load-self2
2203  * @file: file pointer, not actually used
2204  * @buf: where to get the data from
2205  * @count: bytes sent
2206  * @ppos: where to start - must be 0
2207  *
2208  */
2209 static ssize_t smk_write_load_self2(struct file *file, const char __user *buf,
2210                               size_t count, loff_t *ppos)
2211 {
2212         struct task_smack *tsp = current_security();
2213
2214         return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules,
2215                                     &tsp->smk_rules_lock, SMK_LONG_FMT);
2216 }
2217
2218 static const struct file_operations smk_load_self2_ops = {
2219         .open           = smk_open_load_self2,
2220         .read           = seq_read,
2221         .llseek         = seq_lseek,
2222         .write          = smk_write_load_self2,
2223         .release        = seq_release,
2224 };
2225
2226 /**
2227  * smk_write_access2 - handle access check transaction
2228  * @file: file pointer
2229  * @buf: data from user space
2230  * @count: bytes sent
2231  * @ppos: where to start - must be 0
2232  */
2233 static ssize_t smk_write_access2(struct file *file, const char __user *buf,
2234                                         size_t count, loff_t *ppos)
2235 {
2236         return smk_user_access(file, buf, count, ppos, SMK_LONG_FMT);
2237 }
2238
2239 static const struct file_operations smk_access2_ops = {
2240         .write          = smk_write_access2,
2241         .read           = simple_transaction_read,
2242         .release        = simple_transaction_release,
2243         .llseek         = generic_file_llseek,
2244 };
2245
2246 /**
2247  * smk_write_revoke_subj - write() for /smack/revoke-subject
2248  * @file: file pointer
2249  * @buf: data from user space
2250  * @count: bytes sent
2251  * @ppos: where to start - must be 0
2252  */
2253 static ssize_t smk_write_revoke_subj(struct file *file, const char __user *buf,
2254                                 size_t count, loff_t *ppos)
2255 {
2256         char *data;
2257         const char *cp;
2258         struct smack_known *skp;
2259         struct smack_rule *sp;
2260         struct list_head *rule_list;
2261         struct mutex *rule_lock;
2262         int rc = count;
2263
2264         if (*ppos != 0)
2265                 return -EINVAL;
2266
2267         if (!smack_privileged(CAP_MAC_ADMIN))
2268                 return -EPERM;
2269
2270         if (count == 0 || count > SMK_LONGLABEL)
2271                 return -EINVAL;
2272
2273         data = kzalloc(count, GFP_KERNEL);
2274         if (data == NULL)
2275                 return -ENOMEM;
2276
2277         if (copy_from_user(data, buf, count) != 0) {
2278                 rc = -EFAULT;
2279                 goto out_data;
2280         }
2281
2282         cp = smk_parse_smack(data, count);
2283         if (IS_ERR(cp)) {
2284                 rc = PTR_ERR(cp);
2285                 goto out_data;
2286         }
2287
2288         skp = smk_find_entry(cp);
2289         if (skp == NULL)
2290                 goto out_cp;
2291
2292         rule_list = &skp->smk_rules;
2293         rule_lock = &skp->smk_rules_lock;
2294
2295         mutex_lock(rule_lock);
2296
2297         list_for_each_entry_rcu(sp, rule_list, list)
2298                 sp->smk_access = 0;
2299
2300         mutex_unlock(rule_lock);
2301
2302 out_cp:
2303         kfree(cp);
2304 out_data:
2305         kfree(data);
2306
2307         return rc;
2308 }
2309
2310 static const struct file_operations smk_revoke_subj_ops = {
2311         .write          = smk_write_revoke_subj,
2312         .read           = simple_transaction_read,
2313         .release        = simple_transaction_release,
2314         .llseek         = generic_file_llseek,
2315 };
2316
2317 /**
2318  * smk_init_sysfs - initialize /sys/fs/smackfs
2319  *
2320  */
2321 static int smk_init_sysfs(void)
2322 {
2323         int err;
2324         err = sysfs_create_mount_point(fs_kobj, "smackfs");
2325         if (err)
2326                 return err;
2327         return 0;
2328 }
2329
2330 /**
2331  * smk_write_change_rule - write() for /smack/change-rule
2332  * @file: file pointer
2333  * @buf: data from user space
2334  * @count: bytes sent
2335  * @ppos: where to start - must be 0
2336  */
2337 static ssize_t smk_write_change_rule(struct file *file, const char __user *buf,
2338                                 size_t count, loff_t *ppos)
2339 {
2340         /*
2341          * Must have privilege.
2342          */
2343         if (!smack_privileged(CAP_MAC_ADMIN))
2344                 return -EPERM;
2345
2346         return smk_write_rules_list(file, buf, count, ppos, NULL, NULL,
2347                                     SMK_CHANGE_FMT);
2348 }
2349
2350 static const struct file_operations smk_change_rule_ops = {
2351         .write          = smk_write_change_rule,
2352         .read           = simple_transaction_read,
2353         .release        = simple_transaction_release,
2354         .llseek         = generic_file_llseek,
2355 };
2356
2357 /**
2358  * smk_read_syslog - read() for smackfs/syslog
2359  * @filp: file pointer, not actually used
2360  * @buf: where to put the result
2361  * @cn: maximum to send along
2362  * @ppos: where to start
2363  *
2364  * Returns number of bytes read or error code, as appropriate
2365  */
2366 static ssize_t smk_read_syslog(struct file *filp, char __user *buf,
2367                                 size_t cn, loff_t *ppos)
2368 {
2369         struct smack_known *skp;
2370         ssize_t rc = -EINVAL;
2371         int asize;
2372
2373         if (*ppos != 0)
2374                 return 0;
2375
2376         if (smack_syslog_label == NULL)
2377                 skp = &smack_known_star;
2378         else
2379                 skp = smack_syslog_label;
2380
2381         asize = strlen(skp->smk_known) + 1;
2382
2383         if (cn >= asize)
2384                 rc = simple_read_from_buffer(buf, cn, ppos, skp->smk_known,
2385                                                 asize);
2386
2387         return rc;
2388 }
2389
2390 /**
2391  * smk_write_syslog - write() for smackfs/syslog
2392  * @file: file pointer, not actually used
2393  * @buf: where to get the data from
2394  * @count: bytes sent
2395  * @ppos: where to start
2396  *
2397  * Returns number of bytes written or error code, as appropriate
2398  */
2399 static ssize_t smk_write_syslog(struct file *file, const char __user *buf,
2400                                 size_t count, loff_t *ppos)
2401 {
2402         char *data;
2403         struct smack_known *skp;
2404         int rc = count;
2405
2406         if (!smack_privileged(CAP_MAC_ADMIN))
2407                 return -EPERM;
2408
2409         data = kzalloc(count + 1, GFP_KERNEL);
2410         if (data == NULL)
2411                 return -ENOMEM;
2412
2413         if (copy_from_user(data, buf, count) != 0)
2414                 rc = -EFAULT;
2415         else {
2416                 skp = smk_import_entry(data, count);
2417                 if (IS_ERR(skp))
2418                         rc = PTR_ERR(skp);
2419                 else
2420                         smack_syslog_label = skp;
2421         }
2422
2423         kfree(data);
2424         return rc;
2425 }
2426
2427 static const struct file_operations smk_syslog_ops = {
2428         .read           = smk_read_syslog,
2429         .write          = smk_write_syslog,
2430         .llseek         = default_llseek,
2431 };
2432
2433
2434 /**
2435  * smk_read_ptrace - read() for /smack/ptrace
2436  * @filp: file pointer, not actually used
2437  * @buf: where to put the result
2438  * @count: maximum to send along
2439  * @ppos: where to start
2440  *
2441  * Returns number of bytes read or error code, as appropriate
2442  */
2443 static ssize_t smk_read_ptrace(struct file *filp, char __user *buf,
2444                                size_t count, loff_t *ppos)
2445 {
2446         char temp[32];
2447         ssize_t rc;
2448
2449         if (*ppos != 0)
2450                 return 0;
2451
2452         sprintf(temp, "%d\n", smack_ptrace_rule);
2453         rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
2454         return rc;
2455 }
2456
2457 /**
2458  * smk_write_ptrace - write() for /smack/ptrace
2459  * @file: file pointer
2460  * @buf: data from user space
2461  * @count: bytes sent
2462  * @ppos: where to start - must be 0
2463  */
2464 static ssize_t smk_write_ptrace(struct file *file, const char __user *buf,
2465                                 size_t count, loff_t *ppos)
2466 {
2467         char temp[32];
2468         int i;
2469
2470         if (!smack_privileged(CAP_MAC_ADMIN))
2471                 return -EPERM;
2472
2473         if (*ppos != 0 || count >= sizeof(temp) || count == 0)
2474                 return -EINVAL;
2475
2476         if (copy_from_user(temp, buf, count) != 0)
2477                 return -EFAULT;
2478
2479         temp[count] = '\0';
2480
2481         if (sscanf(temp, "%d", &i) != 1)
2482                 return -EINVAL;
2483         if (i < SMACK_PTRACE_DEFAULT || i > SMACK_PTRACE_MAX)
2484                 return -EINVAL;
2485         smack_ptrace_rule = i;
2486
2487         return count;
2488 }
2489
2490 static const struct file_operations smk_ptrace_ops = {
2491         .write          = smk_write_ptrace,
2492         .read           = smk_read_ptrace,
2493         .llseek         = default_llseek,
2494 };
2495
2496 /**
2497  * smk_fill_super - fill the smackfs superblock
2498  * @sb: the empty superblock
2499  * @data: unused
2500  * @silent: unused
2501  *
2502  * Fill in the well known entries for the smack filesystem
2503  *
2504  * Returns 0 on success, an error code on failure
2505  */
2506 static int smk_fill_super(struct super_block *sb, void *data, int silent)
2507 {
2508         int rc;
2509         struct inode *root_inode;
2510
2511         static struct tree_descr smack_files[] = {
2512                 [SMK_LOAD] = {
2513                         "load", &smk_load_ops, S_IRUGO|S_IWUSR},
2514                 [SMK_CIPSO] = {
2515                         "cipso", &smk_cipso_ops, S_IRUGO|S_IWUSR},
2516                 [SMK_DOI] = {
2517                         "doi", &smk_doi_ops, S_IRUGO|S_IWUSR},
2518                 [SMK_DIRECT] = {
2519                         "direct", &smk_direct_ops, S_IRUGO|S_IWUSR},
2520                 [SMK_AMBIENT] = {
2521                         "ambient", &smk_ambient_ops, S_IRUGO|S_IWUSR},
2522                 [SMK_NETLBLADDR] = {
2523                         "netlabel", &smk_netlbladdr_ops, S_IRUGO|S_IWUSR},
2524                 [SMK_ONLYCAP] = {
2525                         "onlycap", &smk_onlycap_ops, S_IRUGO|S_IWUSR},
2526                 [SMK_LOGGING] = {
2527                         "logging", &smk_logging_ops, S_IRUGO|S_IWUSR},
2528                 [SMK_LOAD_SELF] = {
2529                         "load-self", &smk_load_self_ops, S_IRUGO|S_IWUGO},
2530                 [SMK_ACCESSES] = {
2531                         "access", &smk_access_ops, S_IRUGO|S_IWUGO},
2532                 [SMK_MAPPED] = {
2533                         "mapped", &smk_mapped_ops, S_IRUGO|S_IWUSR},
2534                 [SMK_LOAD2] = {
2535                         "load2", &smk_load2_ops, S_IRUGO|S_IWUSR},
2536                 [SMK_LOAD_SELF2] = {
2537                         "load-self2", &smk_load_self2_ops, S_IRUGO|S_IWUGO},
2538                 [SMK_ACCESS2] = {
2539                         "access2", &smk_access2_ops, S_IRUGO|S_IWUGO},
2540                 [SMK_CIPSO2] = {
2541                         "cipso2", &smk_cipso2_ops, S_IRUGO|S_IWUSR},
2542                 [SMK_REVOKE_SUBJ] = {
2543                         "revoke-subject", &smk_revoke_subj_ops,
2544                         S_IRUGO|S_IWUSR},
2545                 [SMK_CHANGE_RULE] = {
2546                         "change-rule", &smk_change_rule_ops, S_IRUGO|S_IWUSR},
2547                 [SMK_SYSLOG] = {
2548                         "syslog", &smk_syslog_ops, S_IRUGO|S_IWUSR},
2549                 [SMK_PTRACE] = {
2550                         "ptrace", &smk_ptrace_ops, S_IRUGO|S_IWUSR},
2551 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
2552                 [SMK_UNCONFINED] = {
2553                         "unconfined", &smk_unconfined_ops, S_IRUGO|S_IWUSR},
2554 #endif
2555                 /* last one */
2556                         {""}
2557         };
2558
2559         rc = simple_fill_super(sb, SMACK_MAGIC, smack_files);
2560         if (rc != 0) {
2561                 printk(KERN_ERR "%s failed %d while creating inodes\n",
2562                         __func__, rc);
2563                 return rc;
2564         }
2565
2566         root_inode = d_inode(sb->s_root);
2567
2568         return 0;
2569 }
2570
2571 /**
2572  * smk_mount - get the smackfs superblock
2573  * @fs_type: passed along without comment
2574  * @flags: passed along without comment
2575  * @dev_name: passed along without comment
2576  * @data: passed along without comment
2577  *
2578  * Just passes everything along.
2579  *
2580  * Returns what the lower level code does.
2581  */
2582 static struct dentry *smk_mount(struct file_system_type *fs_type,
2583                       int flags, const char *dev_name, void *data)
2584 {
2585         return mount_single(fs_type, flags, data, smk_fill_super);
2586 }
2587
2588 static struct file_system_type smk_fs_type = {
2589         .name           = "smackfs",
2590         .mount          = smk_mount,
2591         .kill_sb        = kill_litter_super,
2592 };
2593
2594 static struct vfsmount *smackfs_mount;
2595
2596 static int __init smk_preset_netlabel(struct smack_known *skp)
2597 {
2598         skp->smk_netlabel.domain = skp->smk_known;
2599         skp->smk_netlabel.flags =
2600                 NETLBL_SECATTR_DOMAIN | NETLBL_SECATTR_MLS_LVL;
2601         return smk_netlbl_mls(smack_cipso_direct, skp->smk_known,
2602                                 &skp->smk_netlabel, strlen(skp->smk_known));
2603 }
2604
2605 /**
2606  * init_smk_fs - get the smackfs superblock
2607  *
2608  * register the smackfs
2609  *
2610  * Do not register smackfs if Smack wasn't enabled
2611  * on boot. We can not put this method normally under the
2612  * smack_init() code path since the security subsystem get
2613  * initialized before the vfs caches.
2614  *
2615  * Returns true if we were not chosen on boot or if
2616  * we were chosen and filesystem registration succeeded.
2617  */
2618 static int __init init_smk_fs(void)
2619 {
2620         int err;
2621         int rc;
2622
2623         if (!security_module_enable("smack"))
2624                 return 0;
2625
2626         err = smk_init_sysfs();
2627         if (err)
2628                 printk(KERN_ERR "smackfs: sysfs mountpoint problem.\n");
2629
2630         err = register_filesystem(&smk_fs_type);
2631         if (!err) {
2632                 smackfs_mount = kern_mount(&smk_fs_type);
2633                 if (IS_ERR(smackfs_mount)) {
2634                         printk(KERN_ERR "smackfs:  could not mount!\n");
2635                         err = PTR_ERR(smackfs_mount);
2636                         smackfs_mount = NULL;
2637                 }
2638         }
2639
2640         smk_cipso_doi();
2641         smk_unlbl_ambient(NULL);
2642
2643         rc = smk_preset_netlabel(&smack_known_floor);
2644         if (err == 0 && rc < 0)
2645                 err = rc;
2646         rc = smk_preset_netlabel(&smack_known_hat);
2647         if (err == 0 && rc < 0)
2648                 err = rc;
2649         rc = smk_preset_netlabel(&smack_known_huh);
2650         if (err == 0 && rc < 0)
2651                 err = rc;
2652         rc = smk_preset_netlabel(&smack_known_invalid);
2653         if (err == 0 && rc < 0)
2654                 err = rc;
2655         rc = smk_preset_netlabel(&smack_known_star);
2656         if (err == 0 && rc < 0)
2657                 err = rc;
2658         rc = smk_preset_netlabel(&smack_known_web);
2659         if (err == 0 && rc < 0)
2660                 err = rc;
2661
2662         return err;
2663 }
2664
2665 __initcall(init_smk_fs);