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