Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (C) 2007 Casey Schaufler <casey@schaufler-ca.com>
0004  *
0005  * Authors:
0006  *  Casey Schaufler <casey@schaufler-ca.com>
0007  *  Ahmed S. Darwish <darwish.07@gmail.com>
0008  *
0009  * Special thanks to the authors of selinuxfs.
0010  *
0011  *  Karl MacMillan <kmacmillan@tresys.com>
0012  *  James Morris <jmorris@redhat.com>
0013  */
0014 
0015 #include <linux/kernel.h>
0016 #include <linux/vmalloc.h>
0017 #include <linux/security.h>
0018 #include <linux/mutex.h>
0019 #include <linux/slab.h>
0020 #include <net/net_namespace.h>
0021 #include <net/cipso_ipv4.h>
0022 #include <linux/seq_file.h>
0023 #include <linux/ctype.h>
0024 #include <linux/audit.h>
0025 #include <linux/magic.h>
0026 #include <linux/mount.h>
0027 #include <linux/fs_context.h>
0028 #include "smack.h"
0029 
0030 #define BEBITS  (sizeof(__be32) * 8)
0031 /*
0032  * smackfs pseudo filesystem.
0033  */
0034 
0035 enum smk_inos {
0036     SMK_ROOT_INO    = 2,
0037     SMK_LOAD    = 3,    /* load policy */
0038     SMK_CIPSO   = 4,    /* load label -> CIPSO mapping */
0039     SMK_DOI     = 5,    /* CIPSO DOI */
0040     SMK_DIRECT  = 6,    /* CIPSO level indicating direct label */
0041     SMK_AMBIENT = 7,    /* internet ambient label */
0042     SMK_NET4ADDR    = 8,    /* single label hosts */
0043     SMK_ONLYCAP = 9,    /* the only "capable" label */
0044     SMK_LOGGING = 10,   /* logging */
0045     SMK_LOAD_SELF   = 11,   /* task specific rules */
0046     SMK_ACCESSES    = 12,   /* access policy */
0047     SMK_MAPPED  = 13,   /* CIPSO level indicating mapped label */
0048     SMK_LOAD2   = 14,   /* load policy with long labels */
0049     SMK_LOAD_SELF2  = 15,   /* load task specific rules with long labels */
0050     SMK_ACCESS2 = 16,   /* make an access check with long labels */
0051     SMK_CIPSO2  = 17,   /* load long label -> CIPSO mapping */
0052     SMK_REVOKE_SUBJ = 18,   /* set rules with subject label to '-' */
0053     SMK_CHANGE_RULE = 19,   /* change or add rules (long labels) */
0054     SMK_SYSLOG  = 20,   /* change syslog label) */
0055     SMK_PTRACE  = 21,   /* set ptrace rule */
0056 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
0057     SMK_UNCONFINED  = 22,   /* define an unconfined label */
0058 #endif
0059 #if IS_ENABLED(CONFIG_IPV6)
0060     SMK_NET6ADDR    = 23,   /* single label IPv6 hosts */
0061 #endif /* CONFIG_IPV6 */
0062     SMK_RELABEL_SELF = 24, /* relabel possible without CAP_MAC_ADMIN */
0063 };
0064 
0065 /*
0066  * List locks
0067  */
0068 static DEFINE_MUTEX(smack_cipso_lock);
0069 static DEFINE_MUTEX(smack_ambient_lock);
0070 static DEFINE_MUTEX(smk_net4addr_lock);
0071 #if IS_ENABLED(CONFIG_IPV6)
0072 static DEFINE_MUTEX(smk_net6addr_lock);
0073 #endif /* CONFIG_IPV6 */
0074 
0075 /*
0076  * This is the "ambient" label for network traffic.
0077  * If it isn't somehow marked, use this.
0078  * It can be reset via smackfs/ambient
0079  */
0080 struct smack_known *smack_net_ambient;
0081 
0082 /*
0083  * This is the level in a CIPSO header that indicates a
0084  * smack label is contained directly in the category set.
0085  * It can be reset via smackfs/direct
0086  */
0087 int smack_cipso_direct = SMACK_CIPSO_DIRECT_DEFAULT;
0088 
0089 /*
0090  * This is the level in a CIPSO header that indicates a
0091  * secid is contained directly in the category set.
0092  * It can be reset via smackfs/mapped
0093  */
0094 int smack_cipso_mapped = SMACK_CIPSO_MAPPED_DEFAULT;
0095 
0096 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
0097 /*
0098  * Allow one label to be unconfined. This is for
0099  * debugging and application bring-up purposes only.
0100  * It is bad and wrong, but everyone seems to expect
0101  * to have it.
0102  */
0103 struct smack_known *smack_unconfined;
0104 #endif
0105 
0106 /*
0107  * If this value is set restrict syslog use to the label specified.
0108  * It can be reset via smackfs/syslog
0109  */
0110 struct smack_known *smack_syslog_label;
0111 
0112 /*
0113  * Ptrace current rule
0114  * SMACK_PTRACE_DEFAULT    regular smack ptrace rules (/proc based)
0115  * SMACK_PTRACE_EXACT      labels must match, but can be overriden with
0116  *             CAP_SYS_PTRACE
0117  * SMACK_PTRACE_DRACONIAN  lables must match, CAP_SYS_PTRACE has no effect
0118  */
0119 int smack_ptrace_rule = SMACK_PTRACE_DEFAULT;
0120 
0121 /*
0122  * Certain IP addresses may be designated as single label hosts.
0123  * Packets are sent there unlabeled, but only from tasks that
0124  * can write to the specified label.
0125  */
0126 
0127 LIST_HEAD(smk_net4addr_list);
0128 #if IS_ENABLED(CONFIG_IPV6)
0129 LIST_HEAD(smk_net6addr_list);
0130 #endif /* CONFIG_IPV6 */
0131 
0132 /*
0133  * Rule lists are maintained for each label.
0134  */
0135 struct smack_parsed_rule {
0136     struct smack_known  *smk_subject;
0137     struct smack_known  *smk_object;
0138     int         smk_access1;
0139     int         smk_access2;
0140 };
0141 
0142 static int smk_cipso_doi_value = SMACK_CIPSO_DOI_DEFAULT;
0143 
0144 /*
0145  * Values for parsing cipso rules
0146  * SMK_DIGITLEN: Length of a digit field in a rule.
0147  * SMK_CIPSOMIN: Minimum possible cipso rule length.
0148  * SMK_CIPSOMAX: Maximum possible cipso rule length.
0149  */
0150 #define SMK_DIGITLEN 4
0151 #define SMK_CIPSOMIN (SMK_LABELLEN + 2 * SMK_DIGITLEN)
0152 #define SMK_CIPSOMAX (SMK_CIPSOMIN + SMACK_CIPSO_MAXCATNUM * SMK_DIGITLEN)
0153 
0154 /*
0155  * Values for parsing MAC rules
0156  * SMK_ACCESS: Maximum possible combination of access permissions
0157  * SMK_ACCESSLEN: Maximum length for a rule access field
0158  * SMK_LOADLEN: Smack rule length
0159  */
0160 #define SMK_OACCESS "rwxa"
0161 #define SMK_ACCESS  "rwxatl"
0162 #define SMK_OACCESSLEN  (sizeof(SMK_OACCESS) - 1)
0163 #define SMK_ACCESSLEN   (sizeof(SMK_ACCESS) - 1)
0164 #define SMK_OLOADLEN    (SMK_LABELLEN + SMK_LABELLEN + SMK_OACCESSLEN)
0165 #define SMK_LOADLEN (SMK_LABELLEN + SMK_LABELLEN + SMK_ACCESSLEN)
0166 
0167 /*
0168  * Stricly for CIPSO level manipulation.
0169  * Set the category bit number in a smack label sized buffer.
0170  */
0171 static inline void smack_catset_bit(unsigned int cat, char *catsetp)
0172 {
0173     if (cat == 0 || cat > (SMK_CIPSOLEN * 8))
0174         return;
0175 
0176     catsetp[(cat - 1) / 8] |= 0x80 >> ((cat - 1) % 8);
0177 }
0178 
0179 /**
0180  * smk_netlabel_audit_set - fill a netlbl_audit struct
0181  * @nap: structure to fill
0182  */
0183 static void smk_netlabel_audit_set(struct netlbl_audit *nap)
0184 {
0185     struct smack_known *skp = smk_of_current();
0186 
0187     nap->loginuid = audit_get_loginuid(current);
0188     nap->sessionid = audit_get_sessionid(current);
0189     nap->secid = skp->smk_secid;
0190 }
0191 
0192 /*
0193  * Value for parsing single label host rules
0194  * "1.2.3.4 X"
0195  */
0196 #define SMK_NETLBLADDRMIN   9
0197 
0198 /**
0199  * smk_set_access - add a rule to the rule list or replace an old rule
0200  * @srp: the rule to add or replace
0201  * @rule_list: the list of rules
0202  * @rule_lock: the rule list lock
0203  *
0204  * Looks through the current subject/object/access list for
0205  * the subject/object pair and replaces the access that was
0206  * there. If the pair isn't found add it with the specified
0207  * access.
0208  *
0209  * Returns 0 if nothing goes wrong or -ENOMEM if it fails
0210  * during the allocation of the new pair to add.
0211  */
0212 static int smk_set_access(struct smack_parsed_rule *srp,
0213                 struct list_head *rule_list,
0214                 struct mutex *rule_lock)
0215 {
0216     struct smack_rule *sp;
0217     int found = 0;
0218     int rc = 0;
0219 
0220     mutex_lock(rule_lock);
0221 
0222     /*
0223      * Because the object label is less likely to match
0224      * than the subject label check it first
0225      */
0226     list_for_each_entry_rcu(sp, rule_list, list) {
0227         if (sp->smk_object == srp->smk_object &&
0228             sp->smk_subject == srp->smk_subject) {
0229             found = 1;
0230             sp->smk_access |= srp->smk_access1;
0231             sp->smk_access &= ~srp->smk_access2;
0232             break;
0233         }
0234     }
0235 
0236     if (found == 0) {
0237         sp = kmem_cache_zalloc(smack_rule_cache, GFP_KERNEL);
0238         if (sp == NULL) {
0239             rc = -ENOMEM;
0240             goto out;
0241         }
0242 
0243         sp->smk_subject = srp->smk_subject;
0244         sp->smk_object = srp->smk_object;
0245         sp->smk_access = srp->smk_access1 & ~srp->smk_access2;
0246 
0247         list_add_rcu(&sp->list, rule_list);
0248     }
0249 
0250 out:
0251     mutex_unlock(rule_lock);
0252     return rc;
0253 }
0254 
0255 /**
0256  * smk_perm_from_str - parse smack accesses from a text string
0257  * @string: a text string that contains a Smack accesses code
0258  *
0259  * Returns an integer with respective bits set for specified accesses.
0260  */
0261 static int smk_perm_from_str(const char *string)
0262 {
0263     int perm = 0;
0264     const char *cp;
0265 
0266     for (cp = string; ; cp++)
0267         switch (*cp) {
0268         case '-':
0269             break;
0270         case 'r':
0271         case 'R':
0272             perm |= MAY_READ;
0273             break;
0274         case 'w':
0275         case 'W':
0276             perm |= MAY_WRITE;
0277             break;
0278         case 'x':
0279         case 'X':
0280             perm |= MAY_EXEC;
0281             break;
0282         case 'a':
0283         case 'A':
0284             perm |= MAY_APPEND;
0285             break;
0286         case 't':
0287         case 'T':
0288             perm |= MAY_TRANSMUTE;
0289             break;
0290         case 'l':
0291         case 'L':
0292             perm |= MAY_LOCK;
0293             break;
0294         case 'b':
0295         case 'B':
0296             perm |= MAY_BRINGUP;
0297             break;
0298         default:
0299             return perm;
0300         }
0301 }
0302 
0303 /**
0304  * smk_fill_rule - Fill Smack rule from strings
0305  * @subject: subject label string
0306  * @object: object label string
0307  * @access1: access string
0308  * @access2: string with permissions to be removed
0309  * @rule: Smack rule
0310  * @import: if non-zero, import labels
0311  * @len: label length limit
0312  *
0313  * Returns 0 on success, appropriate error code on failure.
0314  */
0315 static int smk_fill_rule(const char *subject, const char *object,
0316                 const char *access1, const char *access2,
0317                 struct smack_parsed_rule *rule, int import,
0318                 int len)
0319 {
0320     const char *cp;
0321     struct smack_known *skp;
0322 
0323     if (import) {
0324         rule->smk_subject = smk_import_entry(subject, len);
0325         if (IS_ERR(rule->smk_subject))
0326             return PTR_ERR(rule->smk_subject);
0327 
0328         rule->smk_object = smk_import_entry(object, len);
0329         if (IS_ERR(rule->smk_object))
0330             return PTR_ERR(rule->smk_object);
0331     } else {
0332         cp = smk_parse_smack(subject, len);
0333         if (IS_ERR(cp))
0334             return PTR_ERR(cp);
0335         skp = smk_find_entry(cp);
0336         kfree(cp);
0337         if (skp == NULL)
0338             return -ENOENT;
0339         rule->smk_subject = skp;
0340 
0341         cp = smk_parse_smack(object, len);
0342         if (IS_ERR(cp))
0343             return PTR_ERR(cp);
0344         skp = smk_find_entry(cp);
0345         kfree(cp);
0346         if (skp == NULL)
0347             return -ENOENT;
0348         rule->smk_object = skp;
0349     }
0350 
0351     rule->smk_access1 = smk_perm_from_str(access1);
0352     if (access2)
0353         rule->smk_access2 = smk_perm_from_str(access2);
0354     else
0355         rule->smk_access2 = ~rule->smk_access1;
0356 
0357     return 0;
0358 }
0359 
0360 /**
0361  * smk_parse_rule - parse Smack rule from load string
0362  * @data: string to be parsed whose size is SMK_LOADLEN
0363  * @rule: Smack rule
0364  * @import: if non-zero, import labels
0365  *
0366  * Returns 0 on success, -1 on errors.
0367  */
0368 static int smk_parse_rule(const char *data, struct smack_parsed_rule *rule,
0369                 int import)
0370 {
0371     int rc;
0372 
0373     rc = smk_fill_rule(data, data + SMK_LABELLEN,
0374                data + SMK_LABELLEN + SMK_LABELLEN, NULL, rule,
0375                import, SMK_LABELLEN);
0376     return rc;
0377 }
0378 
0379 /**
0380  * smk_parse_long_rule - parse Smack rule from rule string
0381  * @data: string to be parsed, null terminated
0382  * @rule: Will be filled with Smack parsed rule
0383  * @import: if non-zero, import labels
0384  * @tokens: number of substrings expected in data
0385  *
0386  * Returns number of processed bytes on success, -ERRNO on failure.
0387  */
0388 static ssize_t smk_parse_long_rule(char *data, struct smack_parsed_rule *rule,
0389                 int import, int tokens)
0390 {
0391     ssize_t cnt = 0;
0392     char *tok[4];
0393     int rc;
0394     int i;
0395 
0396     /*
0397      * Parsing the rule in-place, filling all white-spaces with '\0'
0398      */
0399     for (i = 0; i < tokens; ++i) {
0400         while (isspace(data[cnt]))
0401             data[cnt++] = '\0';
0402 
0403         if (data[cnt] == '\0')
0404             /* Unexpected end of data */
0405             return -EINVAL;
0406 
0407         tok[i] = data + cnt;
0408 
0409         while (data[cnt] && !isspace(data[cnt]))
0410             ++cnt;
0411     }
0412     while (isspace(data[cnt]))
0413         data[cnt++] = '\0';
0414 
0415     while (i < 4)
0416         tok[i++] = NULL;
0417 
0418     rc = smk_fill_rule(tok[0], tok[1], tok[2], tok[3], rule, import, 0);
0419     return rc == 0 ? cnt : rc;
0420 }
0421 
0422 #define SMK_FIXED24_FMT 0   /* Fixed 24byte label format */
0423 #define SMK_LONG_FMT    1   /* Variable long label format */
0424 #define SMK_CHANGE_FMT  2   /* Rule modification format */
0425 /**
0426  * smk_write_rules_list - write() for any /smack rule file
0427  * @file: file pointer, not actually used
0428  * @buf: where to get the data from
0429  * @count: bytes sent
0430  * @ppos: where to start - must be 0
0431  * @rule_list: the list of rules to write to
0432  * @rule_lock: lock for the rule list
0433  * @format: /smack/load or /smack/load2 or /smack/change-rule format.
0434  *
0435  * Get one smack access rule from above.
0436  * The format for SMK_LONG_FMT is:
0437  *  "subject<whitespace>object<whitespace>access[<whitespace>...]"
0438  * The format for SMK_FIXED24_FMT is exactly:
0439  *  "subject                 object                  rwxat"
0440  * The format for SMK_CHANGE_FMT is:
0441  *  "subject<whitespace>object<whitespace>
0442  *   acc_enable<whitespace>acc_disable[<whitespace>...]"
0443  */
0444 static ssize_t smk_write_rules_list(struct file *file, const char __user *buf,
0445                     size_t count, loff_t *ppos,
0446                     struct list_head *rule_list,
0447                     struct mutex *rule_lock, int format)
0448 {
0449     struct smack_parsed_rule rule;
0450     char *data;
0451     int rc;
0452     int trunc = 0;
0453     int tokens;
0454     ssize_t cnt = 0;
0455 
0456     /*
0457      * No partial writes.
0458      * Enough data must be present.
0459      */
0460     if (*ppos != 0)
0461         return -EINVAL;
0462 
0463     if (format == SMK_FIXED24_FMT) {
0464         /*
0465          * Minor hack for backward compatibility
0466          */
0467         if (count < SMK_OLOADLEN || count > SMK_LOADLEN)
0468             return -EINVAL;
0469     } else {
0470         if (count >= PAGE_SIZE) {
0471             count = PAGE_SIZE - 1;
0472             trunc = 1;
0473         }
0474     }
0475 
0476     data = memdup_user_nul(buf, count);
0477     if (IS_ERR(data))
0478         return PTR_ERR(data);
0479 
0480     /*
0481      * In case of parsing only part of user buf,
0482      * avoid having partial rule at the data buffer
0483      */
0484     if (trunc) {
0485         while (count > 0 && (data[count - 1] != '\n'))
0486             --count;
0487         if (count == 0) {
0488             rc = -EINVAL;
0489             goto out;
0490         }
0491     }
0492 
0493     data[count] = '\0';
0494     tokens = (format == SMK_CHANGE_FMT ? 4 : 3);
0495     while (cnt < count) {
0496         if (format == SMK_FIXED24_FMT) {
0497             rc = smk_parse_rule(data, &rule, 1);
0498             if (rc < 0)
0499                 goto out;
0500             cnt = count;
0501         } else {
0502             rc = smk_parse_long_rule(data + cnt, &rule, 1, tokens);
0503             if (rc < 0)
0504                 goto out;
0505             if (rc == 0) {
0506                 rc = -EINVAL;
0507                 goto out;
0508             }
0509             cnt += rc;
0510         }
0511 
0512         if (rule_list == NULL)
0513             rc = smk_set_access(&rule, &rule.smk_subject->smk_rules,
0514                 &rule.smk_subject->smk_rules_lock);
0515         else
0516             rc = smk_set_access(&rule, rule_list, rule_lock);
0517 
0518         if (rc)
0519             goto out;
0520     }
0521 
0522     rc = cnt;
0523 out:
0524     kfree(data);
0525     return rc;
0526 }
0527 
0528 /*
0529  * Core logic for smackfs seq list operations.
0530  */
0531 
0532 static void *smk_seq_start(struct seq_file *s, loff_t *pos,
0533                 struct list_head *head)
0534 {
0535     struct list_head *list;
0536     int i = *pos;
0537 
0538     rcu_read_lock();
0539     for (list = rcu_dereference(list_next_rcu(head));
0540         list != head;
0541         list = rcu_dereference(list_next_rcu(list))) {
0542         if (i-- == 0)
0543             return list;
0544     }
0545 
0546     return NULL;
0547 }
0548 
0549 static void *smk_seq_next(struct seq_file *s, void *v, loff_t *pos,
0550                 struct list_head *head)
0551 {
0552     struct list_head *list = v;
0553 
0554     ++*pos;
0555     list = rcu_dereference(list_next_rcu(list));
0556 
0557     return (list == head) ? NULL : list;
0558 }
0559 
0560 static void smk_seq_stop(struct seq_file *s, void *v)
0561 {
0562     rcu_read_unlock();
0563 }
0564 
0565 static void smk_rule_show(struct seq_file *s, struct smack_rule *srp, int max)
0566 {
0567     /*
0568      * Don't show any rules with label names too long for
0569      * interface file (/smack/load or /smack/load2)
0570      * because you should expect to be able to write
0571      * anything you read back.
0572      */
0573     if (strlen(srp->smk_subject->smk_known) >= max ||
0574         strlen(srp->smk_object->smk_known) >= max)
0575         return;
0576 
0577     if (srp->smk_access == 0)
0578         return;
0579 
0580     seq_printf(s, "%s %s",
0581            srp->smk_subject->smk_known,
0582            srp->smk_object->smk_known);
0583 
0584     seq_putc(s, ' ');
0585 
0586     if (srp->smk_access & MAY_READ)
0587         seq_putc(s, 'r');
0588     if (srp->smk_access & MAY_WRITE)
0589         seq_putc(s, 'w');
0590     if (srp->smk_access & MAY_EXEC)
0591         seq_putc(s, 'x');
0592     if (srp->smk_access & MAY_APPEND)
0593         seq_putc(s, 'a');
0594     if (srp->smk_access & MAY_TRANSMUTE)
0595         seq_putc(s, 't');
0596     if (srp->smk_access & MAY_LOCK)
0597         seq_putc(s, 'l');
0598     if (srp->smk_access & MAY_BRINGUP)
0599         seq_putc(s, 'b');
0600 
0601     seq_putc(s, '\n');
0602 }
0603 
0604 /*
0605  * Seq_file read operations for /smack/load
0606  */
0607 
0608 static void *load2_seq_start(struct seq_file *s, loff_t *pos)
0609 {
0610     return smk_seq_start(s, pos, &smack_known_list);
0611 }
0612 
0613 static void *load2_seq_next(struct seq_file *s, void *v, loff_t *pos)
0614 {
0615     return smk_seq_next(s, v, pos, &smack_known_list);
0616 }
0617 
0618 static int load_seq_show(struct seq_file *s, void *v)
0619 {
0620     struct list_head *list = v;
0621     struct smack_rule *srp;
0622     struct smack_known *skp =
0623         list_entry_rcu(list, struct smack_known, list);
0624 
0625     list_for_each_entry_rcu(srp, &skp->smk_rules, list)
0626         smk_rule_show(s, srp, SMK_LABELLEN);
0627 
0628     return 0;
0629 }
0630 
0631 static const struct seq_operations load_seq_ops = {
0632     .start = load2_seq_start,
0633     .next  = load2_seq_next,
0634     .show  = load_seq_show,
0635     .stop  = smk_seq_stop,
0636 };
0637 
0638 /**
0639  * smk_open_load - open() for /smack/load
0640  * @inode: inode structure representing file
0641  * @file: "load" file pointer
0642  *
0643  * For reading, use load_seq_* seq_file reading operations.
0644  */
0645 static int smk_open_load(struct inode *inode, struct file *file)
0646 {
0647     return seq_open(file, &load_seq_ops);
0648 }
0649 
0650 /**
0651  * smk_write_load - write() for /smack/load
0652  * @file: file pointer, not actually used
0653  * @buf: where to get the data from
0654  * @count: bytes sent
0655  * @ppos: where to start - must be 0
0656  *
0657  */
0658 static ssize_t smk_write_load(struct file *file, const char __user *buf,
0659                   size_t count, loff_t *ppos)
0660 {
0661     /*
0662      * Must have privilege.
0663      * No partial writes.
0664      * Enough data must be present.
0665      */
0666     if (!smack_privileged(CAP_MAC_ADMIN))
0667         return -EPERM;
0668 
0669     return smk_write_rules_list(file, buf, count, ppos, NULL, NULL,
0670                     SMK_FIXED24_FMT);
0671 }
0672 
0673 static const struct file_operations smk_load_ops = {
0674     .open           = smk_open_load,
0675     .read       = seq_read,
0676     .llseek         = seq_lseek,
0677     .write      = smk_write_load,
0678     .release        = seq_release,
0679 };
0680 
0681 /**
0682  * smk_cipso_doi - initialize the CIPSO domain
0683  */
0684 static void smk_cipso_doi(void)
0685 {
0686     int rc;
0687     struct cipso_v4_doi *doip;
0688     struct netlbl_audit nai;
0689 
0690     smk_netlabel_audit_set(&nai);
0691 
0692     rc = netlbl_cfg_map_del(NULL, PF_INET, NULL, NULL, &nai);
0693     if (rc != 0)
0694         printk(KERN_WARNING "%s:%d remove rc = %d\n",
0695                __func__, __LINE__, rc);
0696 
0697     doip = kmalloc(sizeof(struct cipso_v4_doi), GFP_KERNEL | __GFP_NOFAIL);
0698     doip->map.std = NULL;
0699     doip->doi = smk_cipso_doi_value;
0700     doip->type = CIPSO_V4_MAP_PASS;
0701     doip->tags[0] = CIPSO_V4_TAG_RBITMAP;
0702     for (rc = 1; rc < CIPSO_V4_TAG_MAXCNT; rc++)
0703         doip->tags[rc] = CIPSO_V4_TAG_INVALID;
0704 
0705     rc = netlbl_cfg_cipsov4_add(doip, &nai);
0706     if (rc != 0) {
0707         printk(KERN_WARNING "%s:%d cipso add rc = %d\n",
0708                __func__, __LINE__, rc);
0709         kfree(doip);
0710         return;
0711     }
0712     rc = netlbl_cfg_cipsov4_map_add(doip->doi, NULL, NULL, NULL, &nai);
0713     if (rc != 0) {
0714         printk(KERN_WARNING "%s:%d map add rc = %d\n",
0715                __func__, __LINE__, rc);
0716         netlbl_cfg_cipsov4_del(doip->doi, &nai);
0717         return;
0718     }
0719 }
0720 
0721 /**
0722  * smk_unlbl_ambient - initialize the unlabeled domain
0723  * @oldambient: previous domain string
0724  */
0725 static void smk_unlbl_ambient(char *oldambient)
0726 {
0727     int rc;
0728     struct netlbl_audit nai;
0729 
0730     smk_netlabel_audit_set(&nai);
0731 
0732     if (oldambient != NULL) {
0733         rc = netlbl_cfg_map_del(oldambient, PF_INET, NULL, NULL, &nai);
0734         if (rc != 0)
0735             printk(KERN_WARNING "%s:%d remove rc = %d\n",
0736                    __func__, __LINE__, rc);
0737     }
0738     if (smack_net_ambient == NULL)
0739         smack_net_ambient = &smack_known_floor;
0740 
0741     rc = netlbl_cfg_unlbl_map_add(smack_net_ambient->smk_known, PF_INET,
0742                       NULL, NULL, &nai);
0743     if (rc != 0)
0744         printk(KERN_WARNING "%s:%d add rc = %d\n",
0745                __func__, __LINE__, rc);
0746 }
0747 
0748 /*
0749  * Seq_file read operations for /smack/cipso
0750  */
0751 
0752 static void *cipso_seq_start(struct seq_file *s, loff_t *pos)
0753 {
0754     return smk_seq_start(s, pos, &smack_known_list);
0755 }
0756 
0757 static void *cipso_seq_next(struct seq_file *s, void *v, loff_t *pos)
0758 {
0759     return smk_seq_next(s, v, pos, &smack_known_list);
0760 }
0761 
0762 /*
0763  * Print cipso labels in format:
0764  * label level[/cat[,cat]]
0765  */
0766 static int cipso_seq_show(struct seq_file *s, void *v)
0767 {
0768     struct list_head  *list = v;
0769     struct smack_known *skp =
0770         list_entry_rcu(list, struct smack_known, list);
0771     struct netlbl_lsm_catmap *cmp = skp->smk_netlabel.attr.mls.cat;
0772     char sep = '/';
0773     int i;
0774 
0775     /*
0776      * Don't show a label that could not have been set using
0777      * /smack/cipso. This is in support of the notion that
0778      * anything read from /smack/cipso ought to be writeable
0779      * to /smack/cipso.
0780      *
0781      * /smack/cipso2 should be used instead.
0782      */
0783     if (strlen(skp->smk_known) >= SMK_LABELLEN)
0784         return 0;
0785 
0786     seq_printf(s, "%s %3d", skp->smk_known, skp->smk_netlabel.attr.mls.lvl);
0787 
0788     for (i = netlbl_catmap_walk(cmp, 0); i >= 0;
0789          i = netlbl_catmap_walk(cmp, i + 1)) {
0790         seq_printf(s, "%c%d", sep, i);
0791         sep = ',';
0792     }
0793 
0794     seq_putc(s, '\n');
0795 
0796     return 0;
0797 }
0798 
0799 static const struct seq_operations cipso_seq_ops = {
0800     .start = cipso_seq_start,
0801     .next  = cipso_seq_next,
0802     .show  = cipso_seq_show,
0803     .stop  = smk_seq_stop,
0804 };
0805 
0806 /**
0807  * smk_open_cipso - open() for /smack/cipso
0808  * @inode: inode structure representing file
0809  * @file: "cipso" file pointer
0810  *
0811  * Connect our cipso_seq_* operations with /smack/cipso
0812  * file_operations
0813  */
0814 static int smk_open_cipso(struct inode *inode, struct file *file)
0815 {
0816     return seq_open(file, &cipso_seq_ops);
0817 }
0818 
0819 /**
0820  * smk_set_cipso - do the work for write() for cipso and cipso2
0821  * @file: file pointer, not actually used
0822  * @buf: where to get the data from
0823  * @count: bytes sent
0824  * @ppos: where to start
0825  * @format: /smack/cipso or /smack/cipso2
0826  *
0827  * Accepts only one cipso rule per write call.
0828  * Returns number of bytes written or error code, as appropriate
0829  */
0830 static ssize_t smk_set_cipso(struct file *file, const char __user *buf,
0831                 size_t count, loff_t *ppos, int format)
0832 {
0833     struct netlbl_lsm_catmap *old_cat;
0834     struct smack_known *skp;
0835     struct netlbl_lsm_secattr ncats;
0836     char mapcatset[SMK_CIPSOLEN];
0837     int maplevel;
0838     unsigned int cat;
0839     int catlen;
0840     ssize_t rc = -EINVAL;
0841     char *data = NULL;
0842     char *rule;
0843     int ret;
0844     int i;
0845 
0846     /*
0847      * Must have privilege.
0848      * No partial writes.
0849      * Enough data must be present.
0850      */
0851     if (!smack_privileged(CAP_MAC_ADMIN))
0852         return -EPERM;
0853     if (*ppos != 0)
0854         return -EINVAL;
0855     if (format == SMK_FIXED24_FMT &&
0856         (count < SMK_CIPSOMIN || count > SMK_CIPSOMAX))
0857         return -EINVAL;
0858     if (count > PAGE_SIZE)
0859         return -EINVAL;
0860 
0861     data = memdup_user_nul(buf, count);
0862     if (IS_ERR(data))
0863         return PTR_ERR(data);
0864 
0865     rule = data;
0866     /*
0867      * Only allow one writer at a time. Writes should be
0868      * quite rare and small in any case.
0869      */
0870     mutex_lock(&smack_cipso_lock);
0871 
0872     skp = smk_import_entry(rule, 0);
0873     if (IS_ERR(skp)) {
0874         rc = PTR_ERR(skp);
0875         goto out;
0876     }
0877 
0878     if (format == SMK_FIXED24_FMT)
0879         rule += SMK_LABELLEN;
0880     else
0881         rule += strlen(skp->smk_known) + 1;
0882 
0883     if (rule > data + count) {
0884         rc = -EOVERFLOW;
0885         goto out;
0886     }
0887 
0888     ret = sscanf(rule, "%d", &maplevel);
0889     if (ret != 1 || maplevel < 0 || maplevel > SMACK_CIPSO_MAXLEVEL)
0890         goto out;
0891 
0892     rule += SMK_DIGITLEN;
0893     if (rule > data + count) {
0894         rc = -EOVERFLOW;
0895         goto out;
0896     }
0897 
0898     ret = sscanf(rule, "%d", &catlen);
0899     if (ret != 1 || catlen > SMACK_CIPSO_MAXCATNUM)
0900         goto out;
0901 
0902     if (format == SMK_FIXED24_FMT &&
0903         count != (SMK_CIPSOMIN + catlen * SMK_DIGITLEN))
0904         goto out;
0905 
0906     memset(mapcatset, 0, sizeof(mapcatset));
0907 
0908     for (i = 0; i < catlen; i++) {
0909         rule += SMK_DIGITLEN;
0910         if (rule > data + count) {
0911             rc = -EOVERFLOW;
0912             goto out;
0913         }
0914         ret = sscanf(rule, "%u", &cat);
0915         if (ret != 1 || cat > SMACK_CIPSO_MAXCATNUM)
0916             goto out;
0917 
0918         smack_catset_bit(cat, mapcatset);
0919     }
0920 
0921     rc = smk_netlbl_mls(maplevel, mapcatset, &ncats, SMK_CIPSOLEN);
0922     if (rc >= 0) {
0923         old_cat = skp->smk_netlabel.attr.mls.cat;
0924         skp->smk_netlabel.attr.mls.cat = ncats.attr.mls.cat;
0925         skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl;
0926         synchronize_rcu();
0927         netlbl_catmap_free(old_cat);
0928         rc = count;
0929         /*
0930          * This mapping may have been cached, so clear the cache.
0931          */
0932         netlbl_cache_invalidate();
0933     }
0934 
0935 out:
0936     mutex_unlock(&smack_cipso_lock);
0937     kfree(data);
0938     return rc;
0939 }
0940 
0941 /**
0942  * smk_write_cipso - write() for /smack/cipso
0943  * @file: file pointer, not actually used
0944  * @buf: where to get the data from
0945  * @count: bytes sent
0946  * @ppos: where to start
0947  *
0948  * Accepts only one cipso rule per write call.
0949  * Returns number of bytes written or error code, as appropriate
0950  */
0951 static ssize_t smk_write_cipso(struct file *file, const char __user *buf,
0952                    size_t count, loff_t *ppos)
0953 {
0954     return smk_set_cipso(file, buf, count, ppos, SMK_FIXED24_FMT);
0955 }
0956 
0957 static const struct file_operations smk_cipso_ops = {
0958     .open           = smk_open_cipso,
0959     .read       = seq_read,
0960     .llseek         = seq_lseek,
0961     .write      = smk_write_cipso,
0962     .release        = seq_release,
0963 };
0964 
0965 /*
0966  * Seq_file read operations for /smack/cipso2
0967  */
0968 
0969 /*
0970  * Print cipso labels in format:
0971  * label level[/cat[,cat]]
0972  */
0973 static int cipso2_seq_show(struct seq_file *s, void *v)
0974 {
0975     struct list_head  *list = v;
0976     struct smack_known *skp =
0977         list_entry_rcu(list, struct smack_known, list);
0978     struct netlbl_lsm_catmap *cmp = skp->smk_netlabel.attr.mls.cat;
0979     char sep = '/';
0980     int i;
0981 
0982     seq_printf(s, "%s %3d", skp->smk_known, skp->smk_netlabel.attr.mls.lvl);
0983 
0984     for (i = netlbl_catmap_walk(cmp, 0); i >= 0;
0985          i = netlbl_catmap_walk(cmp, i + 1)) {
0986         seq_printf(s, "%c%d", sep, i);
0987         sep = ',';
0988     }
0989 
0990     seq_putc(s, '\n');
0991 
0992     return 0;
0993 }
0994 
0995 static const struct seq_operations cipso2_seq_ops = {
0996     .start = cipso_seq_start,
0997     .next  = cipso_seq_next,
0998     .show  = cipso2_seq_show,
0999     .stop  = smk_seq_stop,
1000 };
1001 
1002 /**
1003  * smk_open_cipso2 - open() for /smack/cipso2
1004  * @inode: inode structure representing file
1005  * @file: "cipso2" file pointer
1006  *
1007  * Connect our cipso_seq_* operations with /smack/cipso2
1008  * file_operations
1009  */
1010 static int smk_open_cipso2(struct inode *inode, struct file *file)
1011 {
1012     return seq_open(file, &cipso2_seq_ops);
1013 }
1014 
1015 /**
1016  * smk_write_cipso2 - write() for /smack/cipso2
1017  * @file: file pointer, not actually used
1018  * @buf: where to get the data from
1019  * @count: bytes sent
1020  * @ppos: where to start
1021  *
1022  * Accepts only one cipso rule per write call.
1023  * Returns number of bytes written or error code, as appropriate
1024  */
1025 static ssize_t smk_write_cipso2(struct file *file, const char __user *buf,
1026                   size_t count, loff_t *ppos)
1027 {
1028     return smk_set_cipso(file, buf, count, ppos, SMK_LONG_FMT);
1029 }
1030 
1031 static const struct file_operations smk_cipso2_ops = {
1032     .open           = smk_open_cipso2,
1033     .read       = seq_read,
1034     .llseek         = seq_lseek,
1035     .write      = smk_write_cipso2,
1036     .release        = seq_release,
1037 };
1038 
1039 /*
1040  * Seq_file read operations for /smack/netlabel
1041  */
1042 
1043 static void *net4addr_seq_start(struct seq_file *s, loff_t *pos)
1044 {
1045     return smk_seq_start(s, pos, &smk_net4addr_list);
1046 }
1047 
1048 static void *net4addr_seq_next(struct seq_file *s, void *v, loff_t *pos)
1049 {
1050     return smk_seq_next(s, v, pos, &smk_net4addr_list);
1051 }
1052 
1053 /*
1054  * Print host/label pairs
1055  */
1056 static int net4addr_seq_show(struct seq_file *s, void *v)
1057 {
1058     struct list_head *list = v;
1059     struct smk_net4addr *skp =
1060             list_entry_rcu(list, struct smk_net4addr, list);
1061     char *kp = SMACK_CIPSO_OPTION;
1062 
1063     if (skp->smk_label != NULL)
1064         kp = skp->smk_label->smk_known;
1065     seq_printf(s, "%pI4/%d %s\n", &skp->smk_host.s_addr,
1066             skp->smk_masks, kp);
1067 
1068     return 0;
1069 }
1070 
1071 static const struct seq_operations net4addr_seq_ops = {
1072     .start = net4addr_seq_start,
1073     .next  = net4addr_seq_next,
1074     .show  = net4addr_seq_show,
1075     .stop  = smk_seq_stop,
1076 };
1077 
1078 /**
1079  * smk_open_net4addr - open() for /smack/netlabel
1080  * @inode: inode structure representing file
1081  * @file: "netlabel" file pointer
1082  *
1083  * Connect our net4addr_seq_* operations with /smack/netlabel
1084  * file_operations
1085  */
1086 static int smk_open_net4addr(struct inode *inode, struct file *file)
1087 {
1088     return seq_open(file, &net4addr_seq_ops);
1089 }
1090 
1091 /**
1092  * smk_net4addr_insert
1093  * @new : netlabel to insert
1094  *
1095  * This helper insert netlabel in the smack_net4addrs list
1096  * sorted by netmask length (longest to smallest)
1097  * locked by &smk_net4addr_lock in smk_write_net4addr
1098  *
1099  */
1100 static void smk_net4addr_insert(struct smk_net4addr *new)
1101 {
1102     struct smk_net4addr *m;
1103     struct smk_net4addr *m_next;
1104 
1105     if (list_empty(&smk_net4addr_list)) {
1106         list_add_rcu(&new->list, &smk_net4addr_list);
1107         return;
1108     }
1109 
1110     m = list_entry_rcu(smk_net4addr_list.next,
1111                struct smk_net4addr, list);
1112 
1113     /* the comparison '>' is a bit hacky, but works */
1114     if (new->smk_masks > m->smk_masks) {
1115         list_add_rcu(&new->list, &smk_net4addr_list);
1116         return;
1117     }
1118 
1119     list_for_each_entry_rcu(m, &smk_net4addr_list, list) {
1120         if (list_is_last(&m->list, &smk_net4addr_list)) {
1121             list_add_rcu(&new->list, &m->list);
1122             return;
1123         }
1124         m_next = list_entry_rcu(m->list.next,
1125                     struct smk_net4addr, list);
1126         if (new->smk_masks > m_next->smk_masks) {
1127             list_add_rcu(&new->list, &m->list);
1128             return;
1129         }
1130     }
1131 }
1132 
1133 
1134 /**
1135  * smk_write_net4addr - write() for /smack/netlabel
1136  * @file: file pointer, not actually used
1137  * @buf: where to get the data from
1138  * @count: bytes sent
1139  * @ppos: where to start
1140  *
1141  * Accepts only one net4addr per write call.
1142  * Returns number of bytes written or error code, as appropriate
1143  */
1144 static ssize_t smk_write_net4addr(struct file *file, const char __user *buf,
1145                 size_t count, loff_t *ppos)
1146 {
1147     struct smk_net4addr *snp;
1148     struct sockaddr_in newname;
1149     char *smack;
1150     struct smack_known *skp = NULL;
1151     char *data;
1152     char *host = (char *)&newname.sin_addr.s_addr;
1153     int rc;
1154     struct netlbl_audit audit_info;
1155     struct in_addr mask;
1156     unsigned int m;
1157     unsigned int masks;
1158     int found;
1159     u32 mask_bits = (1<<31);
1160     __be32 nsa;
1161     u32 temp_mask;
1162 
1163     /*
1164      * Must have privilege.
1165      * No partial writes.
1166      * Enough data must be present.
1167      * "<addr/mask, as a.b.c.d/e><space><label>"
1168      * "<addr, as a.b.c.d><space><label>"
1169      */
1170     if (!smack_privileged(CAP_MAC_ADMIN))
1171         return -EPERM;
1172     if (*ppos != 0)
1173         return -EINVAL;
1174     if (count < SMK_NETLBLADDRMIN || count > PAGE_SIZE - 1)
1175         return -EINVAL;
1176 
1177     data = memdup_user_nul(buf, count);
1178     if (IS_ERR(data))
1179         return PTR_ERR(data);
1180 
1181     smack = kzalloc(count + 1, GFP_KERNEL);
1182     if (smack == NULL) {
1183         rc = -ENOMEM;
1184         goto free_data_out;
1185     }
1186 
1187     rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd/%u %s",
1188         &host[0], &host[1], &host[2], &host[3], &masks, smack);
1189     if (rc != 6) {
1190         rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd %s",
1191             &host[0], &host[1], &host[2], &host[3], smack);
1192         if (rc != 5) {
1193             rc = -EINVAL;
1194             goto free_out;
1195         }
1196         masks = 32;
1197     }
1198     if (masks > BEBITS) {
1199         rc = -EINVAL;
1200         goto free_out;
1201     }
1202 
1203     /*
1204      * If smack begins with '-', it is an option, don't import it
1205      */
1206     if (smack[0] != '-') {
1207         skp = smk_import_entry(smack, 0);
1208         if (IS_ERR(skp)) {
1209             rc = PTR_ERR(skp);
1210             goto free_out;
1211         }
1212     } else {
1213         /*
1214          * Only the -CIPSO option is supported for IPv4
1215          */
1216         if (strcmp(smack, SMACK_CIPSO_OPTION) != 0) {
1217             rc = -EINVAL;
1218             goto free_out;
1219         }
1220     }
1221 
1222     for (m = masks, temp_mask = 0; m > 0; m--) {
1223         temp_mask |= mask_bits;
1224         mask_bits >>= 1;
1225     }
1226     mask.s_addr = cpu_to_be32(temp_mask);
1227 
1228     newname.sin_addr.s_addr &= mask.s_addr;
1229     /*
1230      * Only allow one writer at a time. Writes should be
1231      * quite rare and small in any case.
1232      */
1233     mutex_lock(&smk_net4addr_lock);
1234 
1235     nsa = newname.sin_addr.s_addr;
1236     /* try to find if the prefix is already in the list */
1237     found = 0;
1238     list_for_each_entry_rcu(snp, &smk_net4addr_list, list) {
1239         if (snp->smk_host.s_addr == nsa && snp->smk_masks == masks) {
1240             found = 1;
1241             break;
1242         }
1243     }
1244     smk_netlabel_audit_set(&audit_info);
1245 
1246     if (found == 0) {
1247         snp = kzalloc(sizeof(*snp), GFP_KERNEL);
1248         if (snp == NULL)
1249             rc = -ENOMEM;
1250         else {
1251             rc = 0;
1252             snp->smk_host.s_addr = newname.sin_addr.s_addr;
1253             snp->smk_mask.s_addr = mask.s_addr;
1254             snp->smk_label = skp;
1255             snp->smk_masks = masks;
1256             smk_net4addr_insert(snp);
1257         }
1258     } else {
1259         /*
1260          * Delete the unlabeled entry, only if the previous label
1261          * wasn't the special CIPSO option
1262          */
1263         if (snp->smk_label != NULL)
1264             rc = netlbl_cfg_unlbl_static_del(&init_net, NULL,
1265                     &snp->smk_host, &snp->smk_mask,
1266                     PF_INET, &audit_info);
1267         else
1268             rc = 0;
1269         snp->smk_label = skp;
1270     }
1271 
1272     /*
1273      * Now tell netlabel about the single label nature of
1274      * this host so that incoming packets get labeled.
1275      * but only if we didn't get the special CIPSO option
1276      */
1277     if (rc == 0 && skp != NULL)
1278         rc = netlbl_cfg_unlbl_static_add(&init_net, NULL,
1279             &snp->smk_host, &snp->smk_mask, PF_INET,
1280             snp->smk_label->smk_secid, &audit_info);
1281 
1282     if (rc == 0)
1283         rc = count;
1284 
1285     mutex_unlock(&smk_net4addr_lock);
1286 
1287 free_out:
1288     kfree(smack);
1289 free_data_out:
1290     kfree(data);
1291 
1292     return rc;
1293 }
1294 
1295 static const struct file_operations smk_net4addr_ops = {
1296     .open           = smk_open_net4addr,
1297     .read       = seq_read,
1298     .llseek         = seq_lseek,
1299     .write      = smk_write_net4addr,
1300     .release        = seq_release,
1301 };
1302 
1303 #if IS_ENABLED(CONFIG_IPV6)
1304 /*
1305  * Seq_file read operations for /smack/netlabel6
1306  */
1307 
1308 static void *net6addr_seq_start(struct seq_file *s, loff_t *pos)
1309 {
1310     return smk_seq_start(s, pos, &smk_net6addr_list);
1311 }
1312 
1313 static void *net6addr_seq_next(struct seq_file *s, void *v, loff_t *pos)
1314 {
1315     return smk_seq_next(s, v, pos, &smk_net6addr_list);
1316 }
1317 
1318 /*
1319  * Print host/label pairs
1320  */
1321 static int net6addr_seq_show(struct seq_file *s, void *v)
1322 {
1323     struct list_head *list = v;
1324     struct smk_net6addr *skp =
1325              list_entry(list, struct smk_net6addr, list);
1326 
1327     if (skp->smk_label != NULL)
1328         seq_printf(s, "%pI6/%d %s\n", &skp->smk_host, skp->smk_masks,
1329                 skp->smk_label->smk_known);
1330 
1331     return 0;
1332 }
1333 
1334 static const struct seq_operations net6addr_seq_ops = {
1335     .start = net6addr_seq_start,
1336     .next  = net6addr_seq_next,
1337     .show  = net6addr_seq_show,
1338     .stop  = smk_seq_stop,
1339 };
1340 
1341 /**
1342  * smk_open_net6addr - open() for /smack/netlabel
1343  * @inode: inode structure representing file
1344  * @file: "netlabel" file pointer
1345  *
1346  * Connect our net6addr_seq_* operations with /smack/netlabel
1347  * file_operations
1348  */
1349 static int smk_open_net6addr(struct inode *inode, struct file *file)
1350 {
1351     return seq_open(file, &net6addr_seq_ops);
1352 }
1353 
1354 /**
1355  * smk_net6addr_insert
1356  * @new : entry to insert
1357  *
1358  * This inserts an entry in the smack_net6addrs list
1359  * sorted by netmask length (longest to smallest)
1360  * locked by &smk_net6addr_lock in smk_write_net6addr
1361  *
1362  */
1363 static void smk_net6addr_insert(struct smk_net6addr *new)
1364 {
1365     struct smk_net6addr *m_next;
1366     struct smk_net6addr *m;
1367 
1368     if (list_empty(&smk_net6addr_list)) {
1369         list_add_rcu(&new->list, &smk_net6addr_list);
1370         return;
1371     }
1372 
1373     m = list_entry_rcu(smk_net6addr_list.next,
1374                struct smk_net6addr, list);
1375 
1376     if (new->smk_masks > m->smk_masks) {
1377         list_add_rcu(&new->list, &smk_net6addr_list);
1378         return;
1379     }
1380 
1381     list_for_each_entry_rcu(m, &smk_net6addr_list, list) {
1382         if (list_is_last(&m->list, &smk_net6addr_list)) {
1383             list_add_rcu(&new->list, &m->list);
1384             return;
1385         }
1386         m_next = list_entry_rcu(m->list.next,
1387                     struct smk_net6addr, list);
1388         if (new->smk_masks > m_next->smk_masks) {
1389             list_add_rcu(&new->list, &m->list);
1390             return;
1391         }
1392     }
1393 }
1394 
1395 
1396 /**
1397  * smk_write_net6addr - write() for /smack/netlabel
1398  * @file: file pointer, not actually used
1399  * @buf: where to get the data from
1400  * @count: bytes sent
1401  * @ppos: where to start
1402  *
1403  * Accepts only one net6addr per write call.
1404  * Returns number of bytes written or error code, as appropriate
1405  */
1406 static ssize_t smk_write_net6addr(struct file *file, const char __user *buf,
1407                 size_t count, loff_t *ppos)
1408 {
1409     struct smk_net6addr *snp;
1410     struct in6_addr newname;
1411     struct in6_addr fullmask;
1412     struct smack_known *skp = NULL;
1413     char *smack;
1414     char *data;
1415     int rc = 0;
1416     int found = 0;
1417     int i;
1418     unsigned int scanned[8];
1419     unsigned int m;
1420     unsigned int mask = 128;
1421 
1422     /*
1423      * Must have privilege.
1424      * No partial writes.
1425      * Enough data must be present.
1426      * "<addr/mask, as a:b:c:d:e:f:g:h/e><space><label>"
1427      * "<addr, as a:b:c:d:e:f:g:h><space><label>"
1428      */
1429     if (!smack_privileged(CAP_MAC_ADMIN))
1430         return -EPERM;
1431     if (*ppos != 0)
1432         return -EINVAL;
1433     if (count < SMK_NETLBLADDRMIN || count > PAGE_SIZE - 1)
1434         return -EINVAL;
1435 
1436     data = memdup_user_nul(buf, count);
1437     if (IS_ERR(data))
1438         return PTR_ERR(data);
1439 
1440     smack = kzalloc(count + 1, GFP_KERNEL);
1441     if (smack == NULL) {
1442         rc = -ENOMEM;
1443         goto free_data_out;
1444     }
1445 
1446     i = sscanf(data, "%x:%x:%x:%x:%x:%x:%x:%x/%u %s",
1447             &scanned[0], &scanned[1], &scanned[2], &scanned[3],
1448             &scanned[4], &scanned[5], &scanned[6], &scanned[7],
1449             &mask, smack);
1450     if (i != 10) {
1451         i = sscanf(data, "%x:%x:%x:%x:%x:%x:%x:%x %s",
1452                 &scanned[0], &scanned[1], &scanned[2],
1453                 &scanned[3], &scanned[4], &scanned[5],
1454                 &scanned[6], &scanned[7], smack);
1455         if (i != 9) {
1456             rc = -EINVAL;
1457             goto free_out;
1458         }
1459     }
1460     if (mask > 128) {
1461         rc = -EINVAL;
1462         goto free_out;
1463     }
1464     for (i = 0; i < 8; i++) {
1465         if (scanned[i] > 0xffff) {
1466             rc = -EINVAL;
1467             goto free_out;
1468         }
1469         newname.s6_addr16[i] = htons(scanned[i]);
1470     }
1471 
1472     /*
1473      * If smack begins with '-', it is an option, don't import it
1474      */
1475     if (smack[0] != '-') {
1476         skp = smk_import_entry(smack, 0);
1477         if (IS_ERR(skp)) {
1478             rc = PTR_ERR(skp);
1479             goto free_out;
1480         }
1481     } else {
1482         /*
1483          * Only -DELETE is supported for IPv6
1484          */
1485         if (strcmp(smack, SMACK_DELETE_OPTION) != 0) {
1486             rc = -EINVAL;
1487             goto free_out;
1488         }
1489     }
1490 
1491     for (i = 0, m = mask; i < 8; i++) {
1492         if (m >= 16) {
1493             fullmask.s6_addr16[i] = 0xffff;
1494             m -= 16;
1495         } else if (m > 0) {
1496             fullmask.s6_addr16[i] = (1 << m) - 1;
1497             m = 0;
1498         } else
1499             fullmask.s6_addr16[i] = 0;
1500         newname.s6_addr16[i] &= fullmask.s6_addr16[i];
1501     }
1502 
1503     /*
1504      * Only allow one writer at a time. Writes should be
1505      * quite rare and small in any case.
1506      */
1507     mutex_lock(&smk_net6addr_lock);
1508     /*
1509      * Try to find the prefix in the list
1510      */
1511     list_for_each_entry_rcu(snp, &smk_net6addr_list, list) {
1512         if (mask != snp->smk_masks)
1513             continue;
1514         for (found = 1, i = 0; i < 8; i++) {
1515             if (newname.s6_addr16[i] !=
1516                 snp->smk_host.s6_addr16[i]) {
1517                 found = 0;
1518                 break;
1519             }
1520         }
1521         if (found == 1)
1522             break;
1523     }
1524     if (found == 0) {
1525         snp = kzalloc(sizeof(*snp), GFP_KERNEL);
1526         if (snp == NULL)
1527             rc = -ENOMEM;
1528         else {
1529             snp->smk_host = newname;
1530             snp->smk_mask = fullmask;
1531             snp->smk_masks = mask;
1532             snp->smk_label = skp;
1533             smk_net6addr_insert(snp);
1534         }
1535     } else {
1536         snp->smk_label = skp;
1537     }
1538 
1539     if (rc == 0)
1540         rc = count;
1541 
1542     mutex_unlock(&smk_net6addr_lock);
1543 
1544 free_out:
1545     kfree(smack);
1546 free_data_out:
1547     kfree(data);
1548 
1549     return rc;
1550 }
1551 
1552 static const struct file_operations smk_net6addr_ops = {
1553     .open           = smk_open_net6addr,
1554     .read       = seq_read,
1555     .llseek         = seq_lseek,
1556     .write      = smk_write_net6addr,
1557     .release        = seq_release,
1558 };
1559 #endif /* CONFIG_IPV6 */
1560 
1561 /**
1562  * smk_read_doi - read() for /smack/doi
1563  * @filp: file pointer, not actually used
1564  * @buf: where to put the result
1565  * @count: maximum to send along
1566  * @ppos: where to start
1567  *
1568  * Returns number of bytes read or error code, as appropriate
1569  */
1570 static ssize_t smk_read_doi(struct file *filp, char __user *buf,
1571                 size_t count, loff_t *ppos)
1572 {
1573     char temp[80];
1574     ssize_t rc;
1575 
1576     if (*ppos != 0)
1577         return 0;
1578 
1579     sprintf(temp, "%d", smk_cipso_doi_value);
1580     rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1581 
1582     return rc;
1583 }
1584 
1585 /**
1586  * smk_write_doi - write() for /smack/doi
1587  * @file: file pointer, not actually used
1588  * @buf: where to get the data from
1589  * @count: bytes sent
1590  * @ppos: where to start
1591  *
1592  * Returns number of bytes written or error code, as appropriate
1593  */
1594 static ssize_t smk_write_doi(struct file *file, const char __user *buf,
1595                  size_t count, loff_t *ppos)
1596 {
1597     char temp[80];
1598     int i;
1599 
1600     if (!smack_privileged(CAP_MAC_ADMIN))
1601         return -EPERM;
1602 
1603     if (count >= sizeof(temp) || count == 0)
1604         return -EINVAL;
1605 
1606     if (copy_from_user(temp, buf, count) != 0)
1607         return -EFAULT;
1608 
1609     temp[count] = '\0';
1610 
1611     if (sscanf(temp, "%d", &i) != 1)
1612         return -EINVAL;
1613 
1614     smk_cipso_doi_value = i;
1615 
1616     smk_cipso_doi();
1617 
1618     return count;
1619 }
1620 
1621 static const struct file_operations smk_doi_ops = {
1622     .read       = smk_read_doi,
1623     .write      = smk_write_doi,
1624     .llseek     = default_llseek,
1625 };
1626 
1627 /**
1628  * smk_read_direct - read() for /smack/direct
1629  * @filp: file pointer, not actually used
1630  * @buf: where to put the result
1631  * @count: maximum to send along
1632  * @ppos: where to start
1633  *
1634  * Returns number of bytes read or error code, as appropriate
1635  */
1636 static ssize_t smk_read_direct(struct file *filp, char __user *buf,
1637                    size_t count, loff_t *ppos)
1638 {
1639     char temp[80];
1640     ssize_t rc;
1641 
1642     if (*ppos != 0)
1643         return 0;
1644 
1645     sprintf(temp, "%d", smack_cipso_direct);
1646     rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1647 
1648     return rc;
1649 }
1650 
1651 /**
1652  * smk_write_direct - write() for /smack/direct
1653  * @file: file pointer, not actually used
1654  * @buf: where to get the data from
1655  * @count: bytes sent
1656  * @ppos: where to start
1657  *
1658  * Returns number of bytes written or error code, as appropriate
1659  */
1660 static ssize_t smk_write_direct(struct file *file, const char __user *buf,
1661                 size_t count, loff_t *ppos)
1662 {
1663     struct smack_known *skp;
1664     char temp[80];
1665     int i;
1666 
1667     if (!smack_privileged(CAP_MAC_ADMIN))
1668         return -EPERM;
1669 
1670     if (count >= sizeof(temp) || count == 0)
1671         return -EINVAL;
1672 
1673     if (copy_from_user(temp, buf, count) != 0)
1674         return -EFAULT;
1675 
1676     temp[count] = '\0';
1677 
1678     if (sscanf(temp, "%d", &i) != 1)
1679         return -EINVAL;
1680 
1681     /*
1682      * Don't do anything if the value hasn't actually changed.
1683      * If it is changing reset the level on entries that were
1684      * set up to be direct when they were created.
1685      */
1686     if (smack_cipso_direct != i) {
1687         mutex_lock(&smack_known_lock);
1688         list_for_each_entry_rcu(skp, &smack_known_list, list)
1689             if (skp->smk_netlabel.attr.mls.lvl ==
1690                 smack_cipso_direct)
1691                 skp->smk_netlabel.attr.mls.lvl = i;
1692         smack_cipso_direct = i;
1693         mutex_unlock(&smack_known_lock);
1694     }
1695 
1696     return count;
1697 }
1698 
1699 static const struct file_operations smk_direct_ops = {
1700     .read       = smk_read_direct,
1701     .write      = smk_write_direct,
1702     .llseek     = default_llseek,
1703 };
1704 
1705 /**
1706  * smk_read_mapped - read() for /smack/mapped
1707  * @filp: file pointer, not actually used
1708  * @buf: where to put the result
1709  * @count: maximum to send along
1710  * @ppos: where to start
1711  *
1712  * Returns number of bytes read or error code, as appropriate
1713  */
1714 static ssize_t smk_read_mapped(struct file *filp, char __user *buf,
1715                    size_t count, loff_t *ppos)
1716 {
1717     char temp[80];
1718     ssize_t rc;
1719 
1720     if (*ppos != 0)
1721         return 0;
1722 
1723     sprintf(temp, "%d", smack_cipso_mapped);
1724     rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
1725 
1726     return rc;
1727 }
1728 
1729 /**
1730  * smk_write_mapped - write() for /smack/mapped
1731  * @file: file pointer, not actually used
1732  * @buf: where to get the data from
1733  * @count: bytes sent
1734  * @ppos: where to start
1735  *
1736  * Returns number of bytes written or error code, as appropriate
1737  */
1738 static ssize_t smk_write_mapped(struct file *file, const char __user *buf,
1739                 size_t count, loff_t *ppos)
1740 {
1741     struct smack_known *skp;
1742     char temp[80];
1743     int i;
1744 
1745     if (!smack_privileged(CAP_MAC_ADMIN))
1746         return -EPERM;
1747 
1748     if (count >= sizeof(temp) || count == 0)
1749         return -EINVAL;
1750 
1751     if (copy_from_user(temp, buf, count) != 0)
1752         return -EFAULT;
1753 
1754     temp[count] = '\0';
1755 
1756     if (sscanf(temp, "%d", &i) != 1)
1757         return -EINVAL;
1758 
1759     /*
1760      * Don't do anything if the value hasn't actually changed.
1761      * If it is changing reset the level on entries that were
1762      * set up to be mapped when they were created.
1763      */
1764     if (smack_cipso_mapped != i) {
1765         mutex_lock(&smack_known_lock);
1766         list_for_each_entry_rcu(skp, &smack_known_list, list)
1767             if (skp->smk_netlabel.attr.mls.lvl ==
1768                 smack_cipso_mapped)
1769                 skp->smk_netlabel.attr.mls.lvl = i;
1770         smack_cipso_mapped = i;
1771         mutex_unlock(&smack_known_lock);
1772     }
1773 
1774     return count;
1775 }
1776 
1777 static const struct file_operations smk_mapped_ops = {
1778     .read       = smk_read_mapped,
1779     .write      = smk_write_mapped,
1780     .llseek     = default_llseek,
1781 };
1782 
1783 /**
1784  * smk_read_ambient - read() for /smack/ambient
1785  * @filp: file pointer, not actually used
1786  * @buf: where to put the result
1787  * @cn: maximum to send along
1788  * @ppos: where to start
1789  *
1790  * Returns number of bytes read or error code, as appropriate
1791  */
1792 static ssize_t smk_read_ambient(struct file *filp, char __user *buf,
1793                 size_t cn, loff_t *ppos)
1794 {
1795     ssize_t rc;
1796     int asize;
1797 
1798     if (*ppos != 0)
1799         return 0;
1800     /*
1801      * Being careful to avoid a problem in the case where
1802      * smack_net_ambient gets changed in midstream.
1803      */
1804     mutex_lock(&smack_ambient_lock);
1805 
1806     asize = strlen(smack_net_ambient->smk_known) + 1;
1807 
1808     if (cn >= asize)
1809         rc = simple_read_from_buffer(buf, cn, ppos,
1810                          smack_net_ambient->smk_known,
1811                          asize);
1812     else
1813         rc = -EINVAL;
1814 
1815     mutex_unlock(&smack_ambient_lock);
1816 
1817     return rc;
1818 }
1819 
1820 /**
1821  * smk_write_ambient - write() for /smack/ambient
1822  * @file: file pointer, not actually used
1823  * @buf: where to get the data from
1824  * @count: bytes sent
1825  * @ppos: where to start
1826  *
1827  * Returns number of bytes written or error code, as appropriate
1828  */
1829 static ssize_t smk_write_ambient(struct file *file, const char __user *buf,
1830                  size_t count, loff_t *ppos)
1831 {
1832     struct smack_known *skp;
1833     char *oldambient;
1834     char *data;
1835     int rc = count;
1836 
1837     if (!smack_privileged(CAP_MAC_ADMIN))
1838         return -EPERM;
1839 
1840     /* Enough data must be present */
1841     if (count == 0 || count > PAGE_SIZE)
1842         return -EINVAL;
1843 
1844     data = memdup_user_nul(buf, count);
1845     if (IS_ERR(data))
1846         return PTR_ERR(data);
1847 
1848     skp = smk_import_entry(data, count);
1849     if (IS_ERR(skp)) {
1850         rc = PTR_ERR(skp);
1851         goto out;
1852     }
1853 
1854     mutex_lock(&smack_ambient_lock);
1855 
1856     oldambient = smack_net_ambient->smk_known;
1857     smack_net_ambient = skp;
1858     smk_unlbl_ambient(oldambient);
1859 
1860     mutex_unlock(&smack_ambient_lock);
1861 
1862 out:
1863     kfree(data);
1864     return rc;
1865 }
1866 
1867 static const struct file_operations smk_ambient_ops = {
1868     .read       = smk_read_ambient,
1869     .write      = smk_write_ambient,
1870     .llseek     = default_llseek,
1871 };
1872 
1873 /*
1874  * Seq_file operations for /smack/onlycap
1875  */
1876 static void *onlycap_seq_start(struct seq_file *s, loff_t *pos)
1877 {
1878     return smk_seq_start(s, pos, &smack_onlycap_list);
1879 }
1880 
1881 static void *onlycap_seq_next(struct seq_file *s, void *v, loff_t *pos)
1882 {
1883     return smk_seq_next(s, v, pos, &smack_onlycap_list);
1884 }
1885 
1886 static int onlycap_seq_show(struct seq_file *s, void *v)
1887 {
1888     struct list_head *list = v;
1889     struct smack_known_list_elem *sklep =
1890         list_entry_rcu(list, struct smack_known_list_elem, list);
1891 
1892     seq_puts(s, sklep->smk_label->smk_known);
1893     seq_putc(s, ' ');
1894 
1895     return 0;
1896 }
1897 
1898 static const struct seq_operations onlycap_seq_ops = {
1899     .start = onlycap_seq_start,
1900     .next  = onlycap_seq_next,
1901     .show  = onlycap_seq_show,
1902     .stop  = smk_seq_stop,
1903 };
1904 
1905 static int smk_open_onlycap(struct inode *inode, struct file *file)
1906 {
1907     return seq_open(file, &onlycap_seq_ops);
1908 }
1909 
1910 /**
1911  * smk_list_swap_rcu - swap public list with a private one in RCU-safe way
1912  * The caller must hold appropriate mutex to prevent concurrent modifications
1913  * to the public list.
1914  * Private list is assumed to be not accessible to other threads yet.
1915  *
1916  * @public: public list
1917  * @private: private list
1918  */
1919 static void smk_list_swap_rcu(struct list_head *public,
1920                   struct list_head *private)
1921 {
1922     struct list_head *first, *last;
1923 
1924     if (list_empty(public)) {
1925         list_splice_init_rcu(private, public, synchronize_rcu);
1926     } else {
1927         /* Remember public list before replacing it */
1928         first = public->next;
1929         last = public->prev;
1930 
1931         /* Publish private list in place of public in RCU-safe way */
1932         private->prev->next = public;
1933         private->next->prev = public;
1934         rcu_assign_pointer(public->next, private->next);
1935         public->prev = private->prev;
1936 
1937         synchronize_rcu();
1938 
1939         /* When all readers are done with the old public list,
1940          * attach it in place of private */
1941         private->next = first;
1942         private->prev = last;
1943         first->prev = private;
1944         last->next = private;
1945     }
1946 }
1947 
1948 /**
1949  * smk_parse_label_list - parse list of Smack labels, separated by spaces
1950  *
1951  * @data: the string to parse
1952  * @list: destination list
1953  *
1954  * Returns zero on success or error code, as appropriate
1955  */
1956 static int smk_parse_label_list(char *data, struct list_head *list)
1957 {
1958     char *tok;
1959     struct smack_known *skp;
1960     struct smack_known_list_elem *sklep;
1961 
1962     while ((tok = strsep(&data, " ")) != NULL) {
1963         if (!*tok)
1964             continue;
1965 
1966         skp = smk_import_entry(tok, 0);
1967         if (IS_ERR(skp))
1968             return PTR_ERR(skp);
1969 
1970         sklep = kzalloc(sizeof(*sklep), GFP_KERNEL);
1971         if (sklep == NULL)
1972             return -ENOMEM;
1973 
1974         sklep->smk_label = skp;
1975         list_add(&sklep->list, list);
1976     }
1977 
1978     return 0;
1979 }
1980 
1981 /**
1982  * smk_destroy_label_list - destroy a list of smack_known_list_elem
1983  * @list: header pointer of the list to destroy
1984  */
1985 void smk_destroy_label_list(struct list_head *list)
1986 {
1987     struct smack_known_list_elem *sklep;
1988     struct smack_known_list_elem *sklep2;
1989 
1990     list_for_each_entry_safe(sklep, sklep2, list, list)
1991         kfree(sklep);
1992 
1993     INIT_LIST_HEAD(list);
1994 }
1995 
1996 /**
1997  * smk_write_onlycap - write() for smackfs/onlycap
1998  * @file: file pointer, not actually used
1999  * @buf: where to get the data from
2000  * @count: bytes sent
2001  * @ppos: where to start
2002  *
2003  * Returns number of bytes written or error code, as appropriate
2004  */
2005 static ssize_t smk_write_onlycap(struct file *file, const char __user *buf,
2006                  size_t count, loff_t *ppos)
2007 {
2008     char *data;
2009     LIST_HEAD(list_tmp);
2010     int rc;
2011 
2012     if (!smack_privileged(CAP_MAC_ADMIN))
2013         return -EPERM;
2014 
2015     if (count > PAGE_SIZE)
2016         return -EINVAL;
2017 
2018     data = memdup_user_nul(buf, count);
2019     if (IS_ERR(data))
2020         return PTR_ERR(data);
2021 
2022     rc = smk_parse_label_list(data, &list_tmp);
2023     kfree(data);
2024 
2025     /*
2026      * Clear the smack_onlycap on invalid label errors. This means
2027      * that we can pass a null string to unset the onlycap value.
2028      *
2029      * Importing will also reject a label beginning with '-',
2030      * so "-usecapabilities" will also work.
2031      *
2032      * But do so only on invalid label, not on system errors.
2033      * The invalid label must be first to count as clearing attempt.
2034      */
2035     if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) {
2036         mutex_lock(&smack_onlycap_lock);
2037         smk_list_swap_rcu(&smack_onlycap_list, &list_tmp);
2038         mutex_unlock(&smack_onlycap_lock);
2039         rc = count;
2040     }
2041 
2042     smk_destroy_label_list(&list_tmp);
2043 
2044     return rc;
2045 }
2046 
2047 static const struct file_operations smk_onlycap_ops = {
2048     .open       = smk_open_onlycap,
2049     .read       = seq_read,
2050     .write      = smk_write_onlycap,
2051     .llseek     = seq_lseek,
2052     .release    = seq_release,
2053 };
2054 
2055 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
2056 /**
2057  * smk_read_unconfined - read() for smackfs/unconfined
2058  * @filp: file pointer, not actually used
2059  * @buf: where to put the result
2060  * @cn: maximum to send along
2061  * @ppos: where to start
2062  *
2063  * Returns number of bytes read or error code, as appropriate
2064  */
2065 static ssize_t smk_read_unconfined(struct file *filp, char __user *buf,
2066                     size_t cn, loff_t *ppos)
2067 {
2068     char *smack = "";
2069     ssize_t rc = -EINVAL;
2070     int asize;
2071 
2072     if (*ppos != 0)
2073         return 0;
2074 
2075     if (smack_unconfined != NULL)
2076         smack = smack_unconfined->smk_known;
2077 
2078     asize = strlen(smack) + 1;
2079 
2080     if (cn >= asize)
2081         rc = simple_read_from_buffer(buf, cn, ppos, smack, asize);
2082 
2083     return rc;
2084 }
2085 
2086 /**
2087  * smk_write_unconfined - write() for smackfs/unconfined
2088  * @file: file pointer, not actually used
2089  * @buf: where to get the data from
2090  * @count: bytes sent
2091  * @ppos: where to start
2092  *
2093  * Returns number of bytes written or error code, as appropriate
2094  */
2095 static ssize_t smk_write_unconfined(struct file *file, const char __user *buf,
2096                     size_t count, loff_t *ppos)
2097 {
2098     char *data;
2099     struct smack_known *skp;
2100     int rc = count;
2101 
2102     if (!smack_privileged(CAP_MAC_ADMIN))
2103         return -EPERM;
2104 
2105     if (count > PAGE_SIZE)
2106         return -EINVAL;
2107 
2108     data = memdup_user_nul(buf, count);
2109     if (IS_ERR(data))
2110         return PTR_ERR(data);
2111 
2112     /*
2113      * Clear the smack_unconfined on invalid label errors. This means
2114      * that we can pass a null string to unset the unconfined value.
2115      *
2116      * Importing will also reject a label beginning with '-',
2117      * so "-confine" will also work.
2118      *
2119      * But do so only on invalid label, not on system errors.
2120      */
2121     skp = smk_import_entry(data, count);
2122     if (PTR_ERR(skp) == -EINVAL)
2123         skp = NULL;
2124     else if (IS_ERR(skp)) {
2125         rc = PTR_ERR(skp);
2126         goto freeout;
2127     }
2128 
2129     smack_unconfined = skp;
2130 
2131 freeout:
2132     kfree(data);
2133     return rc;
2134 }
2135 
2136 static const struct file_operations smk_unconfined_ops = {
2137     .read       = smk_read_unconfined,
2138     .write      = smk_write_unconfined,
2139     .llseek     = default_llseek,
2140 };
2141 #endif /* CONFIG_SECURITY_SMACK_BRINGUP */
2142 
2143 /**
2144  * smk_read_logging - read() for /smack/logging
2145  * @filp: file pointer, not actually used
2146  * @buf: where to put the result
2147  * @count: maximum to send along
2148  * @ppos: where to start
2149  *
2150  * Returns number of bytes read or error code, as appropriate
2151  */
2152 static ssize_t smk_read_logging(struct file *filp, char __user *buf,
2153                 size_t count, loff_t *ppos)
2154 {
2155     char temp[32];
2156     ssize_t rc;
2157 
2158     if (*ppos != 0)
2159         return 0;
2160 
2161     sprintf(temp, "%d\n", log_policy);
2162     rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
2163     return rc;
2164 }
2165 
2166 /**
2167  * smk_write_logging - write() for /smack/logging
2168  * @file: file pointer, not actually used
2169  * @buf: where to get the data from
2170  * @count: bytes sent
2171  * @ppos: where to start
2172  *
2173  * Returns number of bytes written or error code, as appropriate
2174  */
2175 static ssize_t smk_write_logging(struct file *file, const char __user *buf,
2176                 size_t count, loff_t *ppos)
2177 {
2178     char temp[32];
2179     int i;
2180 
2181     if (!smack_privileged(CAP_MAC_ADMIN))
2182         return -EPERM;
2183 
2184     if (count >= sizeof(temp) || count == 0)
2185         return -EINVAL;
2186 
2187     if (copy_from_user(temp, buf, count) != 0)
2188         return -EFAULT;
2189 
2190     temp[count] = '\0';
2191 
2192     if (sscanf(temp, "%d", &i) != 1)
2193         return -EINVAL;
2194     if (i < 0 || i > 3)
2195         return -EINVAL;
2196     log_policy = i;
2197     return count;
2198 }
2199 
2200 
2201 
2202 static const struct file_operations smk_logging_ops = {
2203     .read       = smk_read_logging,
2204     .write      = smk_write_logging,
2205     .llseek     = default_llseek,
2206 };
2207 
2208 /*
2209  * Seq_file read operations for /smack/load-self
2210  */
2211 
2212 static void *load_self_seq_start(struct seq_file *s, loff_t *pos)
2213 {
2214     struct task_smack *tsp = smack_cred(current_cred());
2215 
2216     return smk_seq_start(s, pos, &tsp->smk_rules);
2217 }
2218 
2219 static void *load_self_seq_next(struct seq_file *s, void *v, loff_t *pos)
2220 {
2221     struct task_smack *tsp = smack_cred(current_cred());
2222 
2223     return smk_seq_next(s, v, pos, &tsp->smk_rules);
2224 }
2225 
2226 static int load_self_seq_show(struct seq_file *s, void *v)
2227 {
2228     struct list_head *list = v;
2229     struct smack_rule *srp =
2230         list_entry_rcu(list, struct smack_rule, list);
2231 
2232     smk_rule_show(s, srp, SMK_LABELLEN);
2233 
2234     return 0;
2235 }
2236 
2237 static const struct seq_operations load_self_seq_ops = {
2238     .start = load_self_seq_start,
2239     .next  = load_self_seq_next,
2240     .show  = load_self_seq_show,
2241     .stop  = smk_seq_stop,
2242 };
2243 
2244 
2245 /**
2246  * smk_open_load_self - open() for /smack/load-self2
2247  * @inode: inode structure representing file
2248  * @file: "load" file pointer
2249  *
2250  * For reading, use load_seq_* seq_file reading operations.
2251  */
2252 static int smk_open_load_self(struct inode *inode, struct file *file)
2253 {
2254     return seq_open(file, &load_self_seq_ops);
2255 }
2256 
2257 /**
2258  * smk_write_load_self - write() for /smack/load-self
2259  * @file: file pointer, not actually used
2260  * @buf: where to get the data from
2261  * @count: bytes sent
2262  * @ppos: where to start - must be 0
2263  *
2264  */
2265 static ssize_t smk_write_load_self(struct file *file, const char __user *buf,
2266                   size_t count, loff_t *ppos)
2267 {
2268     struct task_smack *tsp = smack_cred(current_cred());
2269 
2270     return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules,
2271                     &tsp->smk_rules_lock, SMK_FIXED24_FMT);
2272 }
2273 
2274 static const struct file_operations smk_load_self_ops = {
2275     .open           = smk_open_load_self,
2276     .read       = seq_read,
2277     .llseek         = seq_lseek,
2278     .write      = smk_write_load_self,
2279     .release        = seq_release,
2280 };
2281 
2282 /**
2283  * smk_user_access - handle access check transaction
2284  * @file: file pointer
2285  * @buf: data from user space
2286  * @count: bytes sent
2287  * @ppos: where to start - must be 0
2288  * @format: /smack/load or /smack/load2 or /smack/change-rule format.
2289  */
2290 static ssize_t smk_user_access(struct file *file, const char __user *buf,
2291                 size_t count, loff_t *ppos, int format)
2292 {
2293     struct smack_parsed_rule rule;
2294     char *data;
2295     int res;
2296 
2297     data = simple_transaction_get(file, buf, count);
2298     if (IS_ERR(data))
2299         return PTR_ERR(data);
2300 
2301     if (format == SMK_FIXED24_FMT) {
2302         if (count < SMK_LOADLEN)
2303             return -EINVAL;
2304         res = smk_parse_rule(data, &rule, 0);
2305     } else {
2306         /*
2307          * simple_transaction_get() returns null-terminated data
2308          */
2309         res = smk_parse_long_rule(data, &rule, 0, 3);
2310     }
2311 
2312     if (res >= 0)
2313         res = smk_access(rule.smk_subject, rule.smk_object,
2314                  rule.smk_access1, NULL);
2315     else if (res != -ENOENT)
2316         return res;
2317 
2318     /*
2319      * smk_access() can return a value > 0 in the "bringup" case.
2320      */
2321     data[0] = res >= 0 ? '1' : '0';
2322     data[1] = '\0';
2323 
2324     simple_transaction_set(file, 2);
2325 
2326     if (format == SMK_FIXED24_FMT)
2327         return SMK_LOADLEN;
2328     return count;
2329 }
2330 
2331 /**
2332  * smk_write_access - handle access check transaction
2333  * @file: file pointer
2334  * @buf: data from user space
2335  * @count: bytes sent
2336  * @ppos: where to start - must be 0
2337  */
2338 static ssize_t smk_write_access(struct file *file, const char __user *buf,
2339                 size_t count, loff_t *ppos)
2340 {
2341     return smk_user_access(file, buf, count, ppos, SMK_FIXED24_FMT);
2342 }
2343 
2344 static const struct file_operations smk_access_ops = {
2345     .write      = smk_write_access,
2346     .read       = simple_transaction_read,
2347     .release    = simple_transaction_release,
2348     .llseek     = generic_file_llseek,
2349 };
2350 
2351 
2352 /*
2353  * Seq_file read operations for /smack/load2
2354  */
2355 
2356 static int load2_seq_show(struct seq_file *s, void *v)
2357 {
2358     struct list_head *list = v;
2359     struct smack_rule *srp;
2360     struct smack_known *skp =
2361         list_entry_rcu(list, struct smack_known, list);
2362 
2363     list_for_each_entry_rcu(srp, &skp->smk_rules, list)
2364         smk_rule_show(s, srp, SMK_LONGLABEL);
2365 
2366     return 0;
2367 }
2368 
2369 static const struct seq_operations load2_seq_ops = {
2370     .start = load2_seq_start,
2371     .next  = load2_seq_next,
2372     .show  = load2_seq_show,
2373     .stop  = smk_seq_stop,
2374 };
2375 
2376 /**
2377  * smk_open_load2 - open() for /smack/load2
2378  * @inode: inode structure representing file
2379  * @file: "load2" file pointer
2380  *
2381  * For reading, use load2_seq_* seq_file reading operations.
2382  */
2383 static int smk_open_load2(struct inode *inode, struct file *file)
2384 {
2385     return seq_open(file, &load2_seq_ops);
2386 }
2387 
2388 /**
2389  * smk_write_load2 - write() for /smack/load2
2390  * @file: file pointer, not actually used
2391  * @buf: where to get the data from
2392  * @count: bytes sent
2393  * @ppos: where to start - must be 0
2394  *
2395  */
2396 static ssize_t smk_write_load2(struct file *file, const char __user *buf,
2397                 size_t count, loff_t *ppos)
2398 {
2399     /*
2400      * Must have privilege.
2401      */
2402     if (!smack_privileged(CAP_MAC_ADMIN))
2403         return -EPERM;
2404 
2405     return smk_write_rules_list(file, buf, count, ppos, NULL, NULL,
2406                     SMK_LONG_FMT);
2407 }
2408 
2409 static const struct file_operations smk_load2_ops = {
2410     .open           = smk_open_load2,
2411     .read       = seq_read,
2412     .llseek         = seq_lseek,
2413     .write      = smk_write_load2,
2414     .release        = seq_release,
2415 };
2416 
2417 /*
2418  * Seq_file read operations for /smack/load-self2
2419  */
2420 
2421 static void *load_self2_seq_start(struct seq_file *s, loff_t *pos)
2422 {
2423     struct task_smack *tsp = smack_cred(current_cred());
2424 
2425     return smk_seq_start(s, pos, &tsp->smk_rules);
2426 }
2427 
2428 static void *load_self2_seq_next(struct seq_file *s, void *v, loff_t *pos)
2429 {
2430     struct task_smack *tsp = smack_cred(current_cred());
2431 
2432     return smk_seq_next(s, v, pos, &tsp->smk_rules);
2433 }
2434 
2435 static int load_self2_seq_show(struct seq_file *s, void *v)
2436 {
2437     struct list_head *list = v;
2438     struct smack_rule *srp =
2439         list_entry_rcu(list, struct smack_rule, list);
2440 
2441     smk_rule_show(s, srp, SMK_LONGLABEL);
2442 
2443     return 0;
2444 }
2445 
2446 static const struct seq_operations load_self2_seq_ops = {
2447     .start = load_self2_seq_start,
2448     .next  = load_self2_seq_next,
2449     .show  = load_self2_seq_show,
2450     .stop  = smk_seq_stop,
2451 };
2452 
2453 /**
2454  * smk_open_load_self2 - open() for /smack/load-self2
2455  * @inode: inode structure representing file
2456  * @file: "load" file pointer
2457  *
2458  * For reading, use load_seq_* seq_file reading operations.
2459  */
2460 static int smk_open_load_self2(struct inode *inode, struct file *file)
2461 {
2462     return seq_open(file, &load_self2_seq_ops);
2463 }
2464 
2465 /**
2466  * smk_write_load_self2 - write() for /smack/load-self2
2467  * @file: file pointer, not actually used
2468  * @buf: where to get the data from
2469  * @count: bytes sent
2470  * @ppos: where to start - must be 0
2471  *
2472  */
2473 static ssize_t smk_write_load_self2(struct file *file, const char __user *buf,
2474                   size_t count, loff_t *ppos)
2475 {
2476     struct task_smack *tsp = smack_cred(current_cred());
2477 
2478     return smk_write_rules_list(file, buf, count, ppos, &tsp->smk_rules,
2479                     &tsp->smk_rules_lock, SMK_LONG_FMT);
2480 }
2481 
2482 static const struct file_operations smk_load_self2_ops = {
2483     .open           = smk_open_load_self2,
2484     .read       = seq_read,
2485     .llseek         = seq_lseek,
2486     .write      = smk_write_load_self2,
2487     .release        = seq_release,
2488 };
2489 
2490 /**
2491  * smk_write_access2 - handle access check transaction
2492  * @file: file pointer
2493  * @buf: data from user space
2494  * @count: bytes sent
2495  * @ppos: where to start - must be 0
2496  */
2497 static ssize_t smk_write_access2(struct file *file, const char __user *buf,
2498                     size_t count, loff_t *ppos)
2499 {
2500     return smk_user_access(file, buf, count, ppos, SMK_LONG_FMT);
2501 }
2502 
2503 static const struct file_operations smk_access2_ops = {
2504     .write      = smk_write_access2,
2505     .read       = simple_transaction_read,
2506     .release    = simple_transaction_release,
2507     .llseek     = generic_file_llseek,
2508 };
2509 
2510 /**
2511  * smk_write_revoke_subj - write() for /smack/revoke-subject
2512  * @file: file pointer
2513  * @buf: data from user space
2514  * @count: bytes sent
2515  * @ppos: where to start - must be 0
2516  */
2517 static ssize_t smk_write_revoke_subj(struct file *file, const char __user *buf,
2518                 size_t count, loff_t *ppos)
2519 {
2520     char *data;
2521     const char *cp;
2522     struct smack_known *skp;
2523     struct smack_rule *sp;
2524     struct list_head *rule_list;
2525     struct mutex *rule_lock;
2526     int rc = count;
2527 
2528     if (*ppos != 0)
2529         return -EINVAL;
2530 
2531     if (!smack_privileged(CAP_MAC_ADMIN))
2532         return -EPERM;
2533 
2534     if (count == 0 || count > SMK_LONGLABEL)
2535         return -EINVAL;
2536 
2537     data = memdup_user(buf, count);
2538     if (IS_ERR(data))
2539         return PTR_ERR(data);
2540 
2541     cp = smk_parse_smack(data, count);
2542     if (IS_ERR(cp)) {
2543         rc = PTR_ERR(cp);
2544         goto out_data;
2545     }
2546 
2547     skp = smk_find_entry(cp);
2548     if (skp == NULL)
2549         goto out_cp;
2550 
2551     rule_list = &skp->smk_rules;
2552     rule_lock = &skp->smk_rules_lock;
2553 
2554     mutex_lock(rule_lock);
2555 
2556     list_for_each_entry_rcu(sp, rule_list, list)
2557         sp->smk_access = 0;
2558 
2559     mutex_unlock(rule_lock);
2560 
2561 out_cp:
2562     kfree(cp);
2563 out_data:
2564     kfree(data);
2565 
2566     return rc;
2567 }
2568 
2569 static const struct file_operations smk_revoke_subj_ops = {
2570     .write      = smk_write_revoke_subj,
2571     .read       = simple_transaction_read,
2572     .release    = simple_transaction_release,
2573     .llseek     = generic_file_llseek,
2574 };
2575 
2576 /**
2577  * smk_init_sysfs - initialize /sys/fs/smackfs
2578  *
2579  */
2580 static int smk_init_sysfs(void)
2581 {
2582     return sysfs_create_mount_point(fs_kobj, "smackfs");
2583 }
2584 
2585 /**
2586  * smk_write_change_rule - write() for /smack/change-rule
2587  * @file: file pointer
2588  * @buf: data from user space
2589  * @count: bytes sent
2590  * @ppos: where to start - must be 0
2591  */
2592 static ssize_t smk_write_change_rule(struct file *file, const char __user *buf,
2593                 size_t count, loff_t *ppos)
2594 {
2595     /*
2596      * Must have privilege.
2597      */
2598     if (!smack_privileged(CAP_MAC_ADMIN))
2599         return -EPERM;
2600 
2601     return smk_write_rules_list(file, buf, count, ppos, NULL, NULL,
2602                     SMK_CHANGE_FMT);
2603 }
2604 
2605 static const struct file_operations smk_change_rule_ops = {
2606     .write      = smk_write_change_rule,
2607     .read       = simple_transaction_read,
2608     .release    = simple_transaction_release,
2609     .llseek     = generic_file_llseek,
2610 };
2611 
2612 /**
2613  * smk_read_syslog - read() for smackfs/syslog
2614  * @filp: file pointer, not actually used
2615  * @buf: where to put the result
2616  * @cn: maximum to send along
2617  * @ppos: where to start
2618  *
2619  * Returns number of bytes read or error code, as appropriate
2620  */
2621 static ssize_t smk_read_syslog(struct file *filp, char __user *buf,
2622                 size_t cn, loff_t *ppos)
2623 {
2624     struct smack_known *skp;
2625     ssize_t rc = -EINVAL;
2626     int asize;
2627 
2628     if (*ppos != 0)
2629         return 0;
2630 
2631     if (smack_syslog_label == NULL)
2632         skp = &smack_known_star;
2633     else
2634         skp = smack_syslog_label;
2635 
2636     asize = strlen(skp->smk_known) + 1;
2637 
2638     if (cn >= asize)
2639         rc = simple_read_from_buffer(buf, cn, ppos, skp->smk_known,
2640                         asize);
2641 
2642     return rc;
2643 }
2644 
2645 /**
2646  * smk_write_syslog - write() for smackfs/syslog
2647  * @file: file pointer, not actually used
2648  * @buf: where to get the data from
2649  * @count: bytes sent
2650  * @ppos: where to start
2651  *
2652  * Returns number of bytes written or error code, as appropriate
2653  */
2654 static ssize_t smk_write_syslog(struct file *file, const char __user *buf,
2655                 size_t count, loff_t *ppos)
2656 {
2657     char *data;
2658     struct smack_known *skp;
2659     int rc = count;
2660 
2661     if (!smack_privileged(CAP_MAC_ADMIN))
2662         return -EPERM;
2663 
2664     /* Enough data must be present */
2665     if (count == 0 || count > PAGE_SIZE)
2666         return -EINVAL;
2667 
2668     data = memdup_user_nul(buf, count);
2669     if (IS_ERR(data))
2670         return PTR_ERR(data);
2671 
2672     skp = smk_import_entry(data, count);
2673     if (IS_ERR(skp))
2674         rc = PTR_ERR(skp);
2675     else
2676         smack_syslog_label = skp;
2677 
2678     kfree(data);
2679     return rc;
2680 }
2681 
2682 static const struct file_operations smk_syslog_ops = {
2683     .read       = smk_read_syslog,
2684     .write      = smk_write_syslog,
2685     .llseek     = default_llseek,
2686 };
2687 
2688 /*
2689  * Seq_file read operations for /smack/relabel-self
2690  */
2691 
2692 static void *relabel_self_seq_start(struct seq_file *s, loff_t *pos)
2693 {
2694     struct task_smack *tsp = smack_cred(current_cred());
2695 
2696     return smk_seq_start(s, pos, &tsp->smk_relabel);
2697 }
2698 
2699 static void *relabel_self_seq_next(struct seq_file *s, void *v, loff_t *pos)
2700 {
2701     struct task_smack *tsp = smack_cred(current_cred());
2702 
2703     return smk_seq_next(s, v, pos, &tsp->smk_relabel);
2704 }
2705 
2706 static int relabel_self_seq_show(struct seq_file *s, void *v)
2707 {
2708     struct list_head *list = v;
2709     struct smack_known_list_elem *sklep =
2710         list_entry(list, struct smack_known_list_elem, list);
2711 
2712     seq_puts(s, sklep->smk_label->smk_known);
2713     seq_putc(s, ' ');
2714 
2715     return 0;
2716 }
2717 
2718 static const struct seq_operations relabel_self_seq_ops = {
2719     .start = relabel_self_seq_start,
2720     .next  = relabel_self_seq_next,
2721     .show  = relabel_self_seq_show,
2722     .stop  = smk_seq_stop,
2723 };
2724 
2725 /**
2726  * smk_open_relabel_self - open() for /smack/relabel-self
2727  * @inode: inode structure representing file
2728  * @file: "relabel-self" file pointer
2729  *
2730  * Connect our relabel_self_seq_* operations with /smack/relabel-self
2731  * file_operations
2732  */
2733 static int smk_open_relabel_self(struct inode *inode, struct file *file)
2734 {
2735     return seq_open(file, &relabel_self_seq_ops);
2736 }
2737 
2738 /**
2739  * smk_write_relabel_self - write() for /smack/relabel-self
2740  * @file: file pointer, not actually used
2741  * @buf: where to get the data from
2742  * @count: bytes sent
2743  * @ppos: where to start - must be 0
2744  *
2745  */
2746 static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,
2747                 size_t count, loff_t *ppos)
2748 {
2749     char *data;
2750     int rc;
2751     LIST_HEAD(list_tmp);
2752 
2753     /*
2754      * Must have privilege.
2755      */
2756     if (!smack_privileged(CAP_MAC_ADMIN))
2757         return -EPERM;
2758 
2759     /*
2760      * No partial write.
2761      * Enough data must be present.
2762      */
2763     if (*ppos != 0)
2764         return -EINVAL;
2765     if (count == 0 || count > PAGE_SIZE)
2766         return -EINVAL;
2767 
2768     data = memdup_user_nul(buf, count);
2769     if (IS_ERR(data))
2770         return PTR_ERR(data);
2771 
2772     rc = smk_parse_label_list(data, &list_tmp);
2773     kfree(data);
2774 
2775     if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) {
2776         struct cred *new;
2777         struct task_smack *tsp;
2778 
2779         new = prepare_creds();
2780         if (!new) {
2781             rc = -ENOMEM;
2782             goto out;
2783         }
2784         tsp = smack_cred(new);
2785         smk_destroy_label_list(&tsp->smk_relabel);
2786         list_splice(&list_tmp, &tsp->smk_relabel);
2787         commit_creds(new);
2788         return count;
2789     }
2790 out:
2791     smk_destroy_label_list(&list_tmp);
2792     return rc;
2793 }
2794 
2795 static const struct file_operations smk_relabel_self_ops = {
2796     .open       = smk_open_relabel_self,
2797     .read       = seq_read,
2798     .llseek     = seq_lseek,
2799     .write      = smk_write_relabel_self,
2800     .release    = seq_release,
2801 };
2802 
2803 /**
2804  * smk_read_ptrace - read() for /smack/ptrace
2805  * @filp: file pointer, not actually used
2806  * @buf: where to put the result
2807  * @count: maximum to send along
2808  * @ppos: where to start
2809  *
2810  * Returns number of bytes read or error code, as appropriate
2811  */
2812 static ssize_t smk_read_ptrace(struct file *filp, char __user *buf,
2813                    size_t count, loff_t *ppos)
2814 {
2815     char temp[32];
2816     ssize_t rc;
2817 
2818     if (*ppos != 0)
2819         return 0;
2820 
2821     sprintf(temp, "%d\n", smack_ptrace_rule);
2822     rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp));
2823     return rc;
2824 }
2825 
2826 /**
2827  * smk_write_ptrace - write() for /smack/ptrace
2828  * @file: file pointer
2829  * @buf: data from user space
2830  * @count: bytes sent
2831  * @ppos: where to start - must be 0
2832  */
2833 static ssize_t smk_write_ptrace(struct file *file, const char __user *buf,
2834                 size_t count, loff_t *ppos)
2835 {
2836     char temp[32];
2837     int i;
2838 
2839     if (!smack_privileged(CAP_MAC_ADMIN))
2840         return -EPERM;
2841 
2842     if (*ppos != 0 || count >= sizeof(temp) || count == 0)
2843         return -EINVAL;
2844 
2845     if (copy_from_user(temp, buf, count) != 0)
2846         return -EFAULT;
2847 
2848     temp[count] = '\0';
2849 
2850     if (sscanf(temp, "%d", &i) != 1)
2851         return -EINVAL;
2852     if (i < SMACK_PTRACE_DEFAULT || i > SMACK_PTRACE_MAX)
2853         return -EINVAL;
2854     smack_ptrace_rule = i;
2855 
2856     return count;
2857 }
2858 
2859 static const struct file_operations smk_ptrace_ops = {
2860     .write      = smk_write_ptrace,
2861     .read       = smk_read_ptrace,
2862     .llseek     = default_llseek,
2863 };
2864 
2865 /**
2866  * smk_fill_super - fill the smackfs superblock
2867  * @sb: the empty superblock
2868  * @fc: unused
2869  *
2870  * Fill in the well known entries for the smack filesystem
2871  *
2872  * Returns 0 on success, an error code on failure
2873  */
2874 static int smk_fill_super(struct super_block *sb, struct fs_context *fc)
2875 {
2876     int rc;
2877 
2878     static const struct tree_descr smack_files[] = {
2879         [SMK_LOAD] = {
2880             "load", &smk_load_ops, S_IRUGO|S_IWUSR},
2881         [SMK_CIPSO] = {
2882             "cipso", &smk_cipso_ops, S_IRUGO|S_IWUSR},
2883         [SMK_DOI] = {
2884             "doi", &smk_doi_ops, S_IRUGO|S_IWUSR},
2885         [SMK_DIRECT] = {
2886             "direct", &smk_direct_ops, S_IRUGO|S_IWUSR},
2887         [SMK_AMBIENT] = {
2888             "ambient", &smk_ambient_ops, S_IRUGO|S_IWUSR},
2889         [SMK_NET4ADDR] = {
2890             "netlabel", &smk_net4addr_ops, S_IRUGO|S_IWUSR},
2891         [SMK_ONLYCAP] = {
2892             "onlycap", &smk_onlycap_ops, S_IRUGO|S_IWUSR},
2893         [SMK_LOGGING] = {
2894             "logging", &smk_logging_ops, S_IRUGO|S_IWUSR},
2895         [SMK_LOAD_SELF] = {
2896             "load-self", &smk_load_self_ops, S_IRUGO|S_IWUGO},
2897         [SMK_ACCESSES] = {
2898             "access", &smk_access_ops, S_IRUGO|S_IWUGO},
2899         [SMK_MAPPED] = {
2900             "mapped", &smk_mapped_ops, S_IRUGO|S_IWUSR},
2901         [SMK_LOAD2] = {
2902             "load2", &smk_load2_ops, S_IRUGO|S_IWUSR},
2903         [SMK_LOAD_SELF2] = {
2904             "load-self2", &smk_load_self2_ops, S_IRUGO|S_IWUGO},
2905         [SMK_ACCESS2] = {
2906             "access2", &smk_access2_ops, S_IRUGO|S_IWUGO},
2907         [SMK_CIPSO2] = {
2908             "cipso2", &smk_cipso2_ops, S_IRUGO|S_IWUSR},
2909         [SMK_REVOKE_SUBJ] = {
2910             "revoke-subject", &smk_revoke_subj_ops,
2911             S_IRUGO|S_IWUSR},
2912         [SMK_CHANGE_RULE] = {
2913             "change-rule", &smk_change_rule_ops, S_IRUGO|S_IWUSR},
2914         [SMK_SYSLOG] = {
2915             "syslog", &smk_syslog_ops, S_IRUGO|S_IWUSR},
2916         [SMK_PTRACE] = {
2917             "ptrace", &smk_ptrace_ops, S_IRUGO|S_IWUSR},
2918 #ifdef CONFIG_SECURITY_SMACK_BRINGUP
2919         [SMK_UNCONFINED] = {
2920             "unconfined", &smk_unconfined_ops, S_IRUGO|S_IWUSR},
2921 #endif
2922 #if IS_ENABLED(CONFIG_IPV6)
2923         [SMK_NET6ADDR] = {
2924             "ipv6host", &smk_net6addr_ops, S_IRUGO|S_IWUSR},
2925 #endif /* CONFIG_IPV6 */
2926         [SMK_RELABEL_SELF] = {
2927             "relabel-self", &smk_relabel_self_ops,
2928                 S_IRUGO|S_IWUGO},
2929         /* last one */
2930             {""}
2931     };
2932 
2933     rc = simple_fill_super(sb, SMACK_MAGIC, smack_files);
2934     if (rc != 0) {
2935         printk(KERN_ERR "%s failed %d while creating inodes\n",
2936             __func__, rc);
2937         return rc;
2938     }
2939 
2940     return 0;
2941 }
2942 
2943 /**
2944  * smk_get_tree - get the smackfs superblock
2945  * @fc: The mount context, including any options
2946  *
2947  * Just passes everything along.
2948  *
2949  * Returns what the lower level code does.
2950  */
2951 static int smk_get_tree(struct fs_context *fc)
2952 {
2953     return get_tree_single(fc, smk_fill_super);
2954 }
2955 
2956 static const struct fs_context_operations smk_context_ops = {
2957     .get_tree   = smk_get_tree,
2958 };
2959 
2960 /**
2961  * smk_init_fs_context - Initialise a filesystem context for smackfs
2962  * @fc: The blank mount context
2963  */
2964 static int smk_init_fs_context(struct fs_context *fc)
2965 {
2966     fc->ops = &smk_context_ops;
2967     return 0;
2968 }
2969 
2970 static struct file_system_type smk_fs_type = {
2971     .name       = "smackfs",
2972     .init_fs_context = smk_init_fs_context,
2973     .kill_sb    = kill_litter_super,
2974 };
2975 
2976 static struct vfsmount *smackfs_mount;
2977 
2978 /**
2979  * init_smk_fs - get the smackfs superblock
2980  *
2981  * register the smackfs
2982  *
2983  * Do not register smackfs if Smack wasn't enabled
2984  * on boot. We can not put this method normally under the
2985  * smack_init() code path since the security subsystem get
2986  * initialized before the vfs caches.
2987  *
2988  * Returns true if we were not chosen on boot or if
2989  * we were chosen and filesystem registration succeeded.
2990  */
2991 static int __init init_smk_fs(void)
2992 {
2993     int err;
2994     int rc;
2995 
2996     if (smack_enabled == 0)
2997         return 0;
2998 
2999     err = smk_init_sysfs();
3000     if (err)
3001         printk(KERN_ERR "smackfs: sysfs mountpoint problem.\n");
3002 
3003     err = register_filesystem(&smk_fs_type);
3004     if (!err) {
3005         smackfs_mount = kern_mount(&smk_fs_type);
3006         if (IS_ERR(smackfs_mount)) {
3007             printk(KERN_ERR "smackfs:  could not mount!\n");
3008             err = PTR_ERR(smackfs_mount);
3009             smackfs_mount = NULL;
3010         }
3011     }
3012 
3013     smk_cipso_doi();
3014     smk_unlbl_ambient(NULL);
3015 
3016     rc = smack_populate_secattr(&smack_known_floor);
3017     if (err == 0 && rc < 0)
3018         err = rc;
3019     rc = smack_populate_secattr(&smack_known_hat);
3020     if (err == 0 && rc < 0)
3021         err = rc;
3022     rc = smack_populate_secattr(&smack_known_huh);
3023     if (err == 0 && rc < 0)
3024         err = rc;
3025     rc = smack_populate_secattr(&smack_known_star);
3026     if (err == 0 && rc < 0)
3027         err = rc;
3028     rc = smack_populate_secattr(&smack_known_web);
3029     if (err == 0 && rc < 0)
3030         err = rc;
3031 
3032     return err;
3033 }
3034 
3035 __initcall(init_smk_fs);