vserver 1.9.5.x5
[linux-2.6.git] / security / selinux / hooks.c
1 /*
2  *  NSA Security-Enhanced Linux (SELinux) security module
3  *
4  *  This file contains the SELinux hook function implementations.
5  *
6  *  Authors:  Stephen Smalley, <sds@epoch.ncsc.mil>
7  *            Chris Vance, <cvance@nai.com>
8  *            Wayne Salamon, <wsalamon@nai.com>
9  *            James Morris <jmorris@redhat.com>
10  *
11  *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
12  *  Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
13  *
14  *      This program is free software; you can redistribute it and/or modify
15  *      it under the terms of the GNU General Public License version 2,
16  *      as published by the Free Software Foundation.
17  */
18
19 #include <linux/config.h>
20 #include <linux/module.h>
21 #include <linux/init.h>
22 #include <linux/kernel.h>
23 #include <linux/ptrace.h>
24 #include <linux/errno.h>
25 #include <linux/sched.h>
26 #include <linux/security.h>
27 #include <linux/xattr.h>
28 #include <linux/capability.h>
29 #include <linux/unistd.h>
30 #include <linux/mm.h>
31 #include <linux/mman.h>
32 #include <linux/slab.h>
33 #include <linux/pagemap.h>
34 #include <linux/swap.h>
35 #include <linux/smp_lock.h>
36 #include <linux/spinlock.h>
37 #include <linux/syscalls.h>
38 #include <linux/file.h>
39 #include <linux/namei.h>
40 #include <linux/mount.h>
41 #include <linux/ext2_fs.h>
42 #include <linux/proc_fs.h>
43 #include <linux/kd.h>
44 #include <linux/netfilter_ipv4.h>
45 #include <linux/netfilter_ipv6.h>
46 #include <linux/tty.h>
47 #include <net/icmp.h>
48 #include <net/ip.h>             /* for sysctl_local_port_range[] */
49 #include <net/tcp.h>            /* struct or_callable used in sock_rcv_skb */
50 #include <asm/uaccess.h>
51 #include <asm/semaphore.h>
52 #include <asm/ioctls.h>
53 #include <linux/bitops.h>
54 #include <linux/interrupt.h>
55 #include <linux/netdevice.h>    /* for network interface checks */
56 #include <linux/netlink.h>
57 #include <linux/tcp.h>
58 #include <linux/udp.h>
59 #include <linux/quota.h>
60 #include <linux/un.h>           /* for Unix socket types */
61 #include <net/af_unix.h>        /* for Unix socket types */
62 #include <linux/parser.h>
63 #include <linux/nfs_mount.h>
64 #include <net/ipv6.h>
65 #include <linux/hugetlb.h>
66 #include <linux/personality.h>
67 #include <linux/sysctl.h>
68
69 #include "avc.h"
70 #include "objsec.h"
71 #include "netif.h"
72
73 #define XATTR_SELINUX_SUFFIX "selinux"
74 #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
75
76 extern unsigned int policydb_loaded_version;
77 extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm);
78
79 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
80 int selinux_enforcing = 0;
81
82 static int __init enforcing_setup(char *str)
83 {
84         selinux_enforcing = simple_strtol(str,NULL,0);
85         return 1;
86 }
87 __setup("enforcing=", enforcing_setup);
88 #endif
89
90 #ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
91 int selinux_enabled = CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE;
92
93 static int __init selinux_enabled_setup(char *str)
94 {
95         selinux_enabled = simple_strtol(str, NULL, 0);
96         return 1;
97 }
98 __setup("selinux=", selinux_enabled_setup);
99 #endif
100
101 /* Original (dummy) security module. */
102 static struct security_operations *original_ops = NULL;
103
104 /* Minimal support for a secondary security module,
105    just to allow the use of the dummy or capability modules.
106    The owlsm module can alternatively be used as a secondary
107    module as long as CONFIG_OWLSM_FD is not enabled. */
108 static struct security_operations *secondary_ops = NULL;
109
110 /* Lists of inode and superblock security structures initialized
111    before the policy was loaded. */
112 static LIST_HEAD(superblock_security_head);
113 static DEFINE_SPINLOCK(sb_security_lock);
114
115 /* Allocate and free functions for each kind of security blob. */
116
117 static int task_alloc_security(struct task_struct *task)
118 {
119         struct task_security_struct *tsec;
120
121         tsec = kmalloc(sizeof(struct task_security_struct), GFP_KERNEL);
122         if (!tsec)
123                 return -ENOMEM;
124
125         memset(tsec, 0, sizeof(struct task_security_struct));
126         tsec->magic = SELINUX_MAGIC;
127         tsec->task = task;
128         tsec->osid = tsec->sid = tsec->ptrace_sid = SECINITSID_UNLABELED;
129         task->security = tsec;
130
131         return 0;
132 }
133
134 static void task_free_security(struct task_struct *task)
135 {
136         struct task_security_struct *tsec = task->security;
137
138         if (!tsec || tsec->magic != SELINUX_MAGIC)
139                 return;
140
141         task->security = NULL;
142         kfree(tsec);
143 }
144
145 static int inode_alloc_security(struct inode *inode)
146 {
147         struct task_security_struct *tsec = current->security;
148         struct inode_security_struct *isec;
149
150         isec = kmalloc(sizeof(struct inode_security_struct), GFP_KERNEL);
151         if (!isec)
152                 return -ENOMEM;
153
154         memset(isec, 0, sizeof(struct inode_security_struct));
155         init_MUTEX(&isec->sem);
156         INIT_LIST_HEAD(&isec->list);
157         isec->magic = SELINUX_MAGIC;
158         isec->inode = inode;
159         isec->sid = SECINITSID_UNLABELED;
160         isec->sclass = SECCLASS_FILE;
161         if (tsec && tsec->magic == SELINUX_MAGIC)
162                 isec->task_sid = tsec->sid;
163         else
164                 isec->task_sid = SECINITSID_UNLABELED;
165         inode->i_security = isec;
166
167         return 0;
168 }
169
170 static void inode_free_security(struct inode *inode)
171 {
172         struct inode_security_struct *isec = inode->i_security;
173         struct superblock_security_struct *sbsec = inode->i_sb->s_security;
174
175         if (!isec || isec->magic != SELINUX_MAGIC)
176                 return;
177
178         spin_lock(&sbsec->isec_lock);
179         if (!list_empty(&isec->list))
180                 list_del_init(&isec->list);
181         spin_unlock(&sbsec->isec_lock);
182
183         inode->i_security = NULL;
184         kfree(isec);
185 }
186
187 static int file_alloc_security(struct file *file)
188 {
189         struct task_security_struct *tsec = current->security;
190         struct file_security_struct *fsec;
191
192         fsec = kmalloc(sizeof(struct file_security_struct), GFP_ATOMIC);
193         if (!fsec)
194                 return -ENOMEM;
195
196         memset(fsec, 0, sizeof(struct file_security_struct));
197         fsec->magic = SELINUX_MAGIC;
198         fsec->file = file;
199         if (tsec && tsec->magic == SELINUX_MAGIC) {
200                 fsec->sid = tsec->sid;
201                 fsec->fown_sid = tsec->sid;
202         } else {
203                 fsec->sid = SECINITSID_UNLABELED;
204                 fsec->fown_sid = SECINITSID_UNLABELED;
205         }
206         file->f_security = fsec;
207
208         return 0;
209 }
210
211 static void file_free_security(struct file *file)
212 {
213         struct file_security_struct *fsec = file->f_security;
214
215         if (!fsec || fsec->magic != SELINUX_MAGIC)
216                 return;
217
218         file->f_security = NULL;
219         kfree(fsec);
220 }
221
222 static int superblock_alloc_security(struct super_block *sb)
223 {
224         struct superblock_security_struct *sbsec;
225
226         sbsec = kmalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
227         if (!sbsec)
228                 return -ENOMEM;
229
230         memset(sbsec, 0, sizeof(struct superblock_security_struct));
231         init_MUTEX(&sbsec->sem);
232         INIT_LIST_HEAD(&sbsec->list);
233         INIT_LIST_HEAD(&sbsec->isec_head);
234         spin_lock_init(&sbsec->isec_lock);
235         sbsec->magic = SELINUX_MAGIC;
236         sbsec->sb = sb;
237         sbsec->sid = SECINITSID_UNLABELED;
238         sbsec->def_sid = SECINITSID_FILE;
239         sb->s_security = sbsec;
240
241         return 0;
242 }
243
244 static void superblock_free_security(struct super_block *sb)
245 {
246         struct superblock_security_struct *sbsec = sb->s_security;
247
248         if (!sbsec || sbsec->magic != SELINUX_MAGIC)
249                 return;
250
251         spin_lock(&sb_security_lock);
252         if (!list_empty(&sbsec->list))
253                 list_del_init(&sbsec->list);
254         spin_unlock(&sb_security_lock);
255
256         sb->s_security = NULL;
257         kfree(sbsec);
258 }
259
260 #ifdef CONFIG_SECURITY_NETWORK
261 static int sk_alloc_security(struct sock *sk, int family, int priority)
262 {
263         struct sk_security_struct *ssec;
264
265         if (family != PF_UNIX)
266                 return 0;
267
268         ssec = kmalloc(sizeof(*ssec), priority);
269         if (!ssec)
270                 return -ENOMEM;
271
272         memset(ssec, 0, sizeof(*ssec));
273         ssec->magic = SELINUX_MAGIC;
274         ssec->sk = sk;
275         ssec->peer_sid = SECINITSID_UNLABELED;
276         sk->sk_security = ssec;
277
278         return 0;
279 }
280
281 static void sk_free_security(struct sock *sk)
282 {
283         struct sk_security_struct *ssec = sk->sk_security;
284
285         if (sk->sk_family != PF_UNIX || ssec->magic != SELINUX_MAGIC)
286                 return;
287
288         sk->sk_security = NULL;
289         kfree(ssec);
290 }
291 #endif  /* CONFIG_SECURITY_NETWORK */
292
293 /* The security server must be initialized before
294    any labeling or access decisions can be provided. */
295 extern int ss_initialized;
296
297 /* The file system's label must be initialized prior to use. */
298
299 static char *labeling_behaviors[6] = {
300         "uses xattr",
301         "uses transition SIDs",
302         "uses task SIDs",
303         "uses genfs_contexts",
304         "not configured for labeling",
305         "uses mountpoint labeling",
306 };
307
308 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
309
310 static inline int inode_doinit(struct inode *inode)
311 {
312         return inode_doinit_with_dentry(inode, NULL);
313 }
314
315 enum {
316         Opt_context = 1,
317         Opt_fscontext = 2,
318         Opt_defcontext = 4,
319 };
320
321 static match_table_t tokens = {
322         {Opt_context, "context=%s"},
323         {Opt_fscontext, "fscontext=%s"},
324         {Opt_defcontext, "defcontext=%s"},
325 };
326
327 #define SEL_MOUNT_FAIL_MSG "SELinux:  duplicate or incompatible mount options\n"
328
329 static int try_context_mount(struct super_block *sb, void *data)
330 {
331         char *context = NULL, *defcontext = NULL;
332         const char *name;
333         u32 sid;
334         int alloc = 0, rc = 0, seen = 0;
335         struct task_security_struct *tsec = current->security;
336         struct superblock_security_struct *sbsec = sb->s_security;
337
338         if (!data)
339                 goto out;
340
341         name = sb->s_type->name;
342
343         if (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA) {
344
345                 /* NFS we understand. */
346                 if (!strcmp(name, "nfs")) {
347                         struct nfs_mount_data *d = data;
348
349                         if (d->version <  NFS_MOUNT_VERSION)
350                                 goto out;
351
352                         if (d->context[0]) {
353                                 context = d->context;
354                                 seen |= Opt_context;
355                         }
356                 } else
357                         goto out;
358
359         } else {
360                 /* Standard string-based options. */
361                 char *p, *options = data;
362
363                 while ((p = strsep(&options, ",")) != NULL) {
364                         int token;
365                         substring_t args[MAX_OPT_ARGS];
366
367                         if (!*p)
368                                 continue;
369
370                         token = match_token(p, tokens, args);
371
372                         switch (token) {
373                         case Opt_context:
374                                 if (seen) {
375                                         rc = -EINVAL;
376                                         printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
377                                         goto out_free;
378                                 }
379                                 context = match_strdup(&args[0]);
380                                 if (!context) {
381                                         rc = -ENOMEM;
382                                         goto out_free;
383                                 }
384                                 if (!alloc)
385                                         alloc = 1;
386                                 seen |= Opt_context;
387                                 break;
388
389                         case Opt_fscontext:
390                                 if (seen & (Opt_context|Opt_fscontext)) {
391                                         rc = -EINVAL;
392                                         printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
393                                         goto out_free;
394                                 }
395                                 context = match_strdup(&args[0]);
396                                 if (!context) {
397                                         rc = -ENOMEM;
398                                         goto out_free;
399                                 }
400                                 if (!alloc)
401                                         alloc = 1;
402                                 seen |= Opt_fscontext;
403                                 break;
404
405                         case Opt_defcontext:
406                                 if (sbsec->behavior != SECURITY_FS_USE_XATTR) {
407                                         rc = -EINVAL;
408                                         printk(KERN_WARNING "SELinux:  "
409                                                "defcontext option is invalid "
410                                                "for this filesystem type\n");
411                                         goto out_free;
412                                 }
413                                 if (seen & (Opt_context|Opt_defcontext)) {
414                                         rc = -EINVAL;
415                                         printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
416                                         goto out_free;
417                                 }
418                                 defcontext = match_strdup(&args[0]);
419                                 if (!defcontext) {
420                                         rc = -ENOMEM;
421                                         goto out_free;
422                                 }
423                                 if (!alloc)
424                                         alloc = 1;
425                                 seen |= Opt_defcontext;
426                                 break;
427
428                         default:
429                                 rc = -EINVAL;
430                                 printk(KERN_WARNING "SELinux:  unknown mount "
431                                        "option\n");
432                                 goto out_free;
433
434                         }
435                 }
436         }
437
438         if (!seen)
439                 goto out;
440
441         if (context) {
442                 rc = security_context_to_sid(context, strlen(context), &sid);
443                 if (rc) {
444                         printk(KERN_WARNING "SELinux: security_context_to_sid"
445                                "(%s) failed for (dev %s, type %s) errno=%d\n",
446                                context, sb->s_id, name, rc);
447                         goto out_free;
448                 }
449
450                 rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
451                                   FILESYSTEM__RELABELFROM, NULL);
452                 if (rc)
453                         goto out_free;
454
455                 rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
456                                   FILESYSTEM__RELABELTO, NULL);
457                 if (rc)
458                         goto out_free;
459
460                 sbsec->sid = sid;
461
462                 if (seen & Opt_context)
463                         sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
464         }
465
466         if (defcontext) {
467                 rc = security_context_to_sid(defcontext, strlen(defcontext), &sid);
468                 if (rc) {
469                         printk(KERN_WARNING "SELinux: security_context_to_sid"
470                                "(%s) failed for (dev %s, type %s) errno=%d\n",
471                                defcontext, sb->s_id, name, rc);
472                         goto out_free;
473                 }
474
475                 if (sid == sbsec->def_sid)
476                         goto out_free;
477
478                 rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
479                                   FILESYSTEM__RELABELFROM, NULL);
480                 if (rc)
481                         goto out_free;
482
483                 rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM,
484                                   FILESYSTEM__ASSOCIATE, NULL);
485                 if (rc)
486                         goto out_free;
487
488                 sbsec->def_sid = sid;
489         }
490
491 out_free:
492         if (alloc) {
493                 kfree(context);
494                 kfree(defcontext);
495         }
496 out:
497         return rc;
498 }
499
500 static int superblock_doinit(struct super_block *sb, void *data)
501 {
502         struct superblock_security_struct *sbsec = sb->s_security;
503         struct dentry *root = sb->s_root;
504         struct inode *inode = root->d_inode;
505         int rc = 0;
506
507         down(&sbsec->sem);
508         if (sbsec->initialized)
509                 goto out;
510
511         if (!ss_initialized) {
512                 /* Defer initialization until selinux_complete_init,
513                    after the initial policy is loaded and the security
514                    server is ready to handle calls. */
515                 spin_lock(&sb_security_lock);
516                 if (list_empty(&sbsec->list))
517                         list_add(&sbsec->list, &superblock_security_head);
518                 spin_unlock(&sb_security_lock);
519                 goto out;
520         }
521
522         /* Determine the labeling behavior to use for this filesystem type. */
523         rc = security_fs_use(sb->s_type->name, &sbsec->behavior, &sbsec->sid);
524         if (rc) {
525                 printk(KERN_WARNING "%s:  security_fs_use(%s) returned %d\n",
526                        __FUNCTION__, sb->s_type->name, rc);
527                 goto out;
528         }
529
530         rc = try_context_mount(sb, data);
531         if (rc)
532                 goto out;
533
534         if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
535                 /* Make sure that the xattr handler exists and that no
536                    error other than -ENODATA is returned by getxattr on
537                    the root directory.  -ENODATA is ok, as this may be
538                    the first boot of the SELinux kernel before we have
539                    assigned xattr values to the filesystem. */
540                 if (!inode->i_op->getxattr) {
541                         printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
542                                "xattr support\n", sb->s_id, sb->s_type->name);
543                         rc = -EOPNOTSUPP;
544                         goto out;
545                 }
546                 rc = inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0);
547                 if (rc < 0 && rc != -ENODATA) {
548                         if (rc == -EOPNOTSUPP)
549                                 printk(KERN_WARNING "SELinux: (dev %s, type "
550                                        "%s) has no security xattr handler\n",
551                                        sb->s_id, sb->s_type->name);
552                         else
553                                 printk(KERN_WARNING "SELinux: (dev %s, type "
554                                        "%s) getxattr errno %d\n", sb->s_id,
555                                        sb->s_type->name, -rc);
556                         goto out;
557                 }
558         }
559
560         if (strcmp(sb->s_type->name, "proc") == 0)
561                 sbsec->proc = 1;
562
563         sbsec->initialized = 1;
564
565         if (sbsec->behavior > ARRAY_SIZE(labeling_behaviors)) {
566                 printk(KERN_INFO "SELinux: initialized (dev %s, type %s), unknown behavior\n",
567                        sb->s_id, sb->s_type->name);
568         }
569         else {
570                 printk(KERN_INFO "SELinux: initialized (dev %s, type %s), %s\n",
571                        sb->s_id, sb->s_type->name,
572                        labeling_behaviors[sbsec->behavior-1]);
573         }
574
575         /* Initialize the root inode. */
576         rc = inode_doinit_with_dentry(sb->s_root->d_inode, sb->s_root);
577
578         /* Initialize any other inodes associated with the superblock, e.g.
579            inodes created prior to initial policy load or inodes created
580            during get_sb by a pseudo filesystem that directly
581            populates itself. */
582         spin_lock(&sbsec->isec_lock);
583 next_inode:
584         if (!list_empty(&sbsec->isec_head)) {
585                 struct inode_security_struct *isec =
586                                 list_entry(sbsec->isec_head.next,
587                                            struct inode_security_struct, list);
588                 struct inode *inode = isec->inode;
589                 spin_unlock(&sbsec->isec_lock);
590                 inode = igrab(inode);
591                 if (inode) {
592                         inode_doinit(inode);
593                         iput(inode);
594                 }
595                 spin_lock(&sbsec->isec_lock);
596                 list_del_init(&isec->list);
597                 goto next_inode;
598         }
599         spin_unlock(&sbsec->isec_lock);
600 out:
601         up(&sbsec->sem);
602         return rc;
603 }
604
605 static inline u16 inode_mode_to_security_class(umode_t mode)
606 {
607         switch (mode & S_IFMT) {
608         case S_IFSOCK:
609                 return SECCLASS_SOCK_FILE;
610         case S_IFLNK:
611                 return SECCLASS_LNK_FILE;
612         case S_IFREG:
613                 return SECCLASS_FILE;
614         case S_IFBLK:
615                 return SECCLASS_BLK_FILE;
616         case S_IFDIR:
617                 return SECCLASS_DIR;
618         case S_IFCHR:
619                 return SECCLASS_CHR_FILE;
620         case S_IFIFO:
621                 return SECCLASS_FIFO_FILE;
622
623         }
624
625         return SECCLASS_FILE;
626 }
627
628 static inline u16 socket_type_to_security_class(int family, int type, int protocol)
629 {
630         switch (family) {
631         case PF_UNIX:
632                 switch (type) {
633                 case SOCK_STREAM:
634                 case SOCK_SEQPACKET:
635                         return SECCLASS_UNIX_STREAM_SOCKET;
636                 case SOCK_DGRAM:
637                         return SECCLASS_UNIX_DGRAM_SOCKET;
638                 }
639                 break;
640         case PF_INET:
641         case PF_INET6:
642                 switch (type) {
643                 case SOCK_STREAM:
644                         return SECCLASS_TCP_SOCKET;
645                 case SOCK_DGRAM:
646                         return SECCLASS_UDP_SOCKET;
647                 case SOCK_RAW:
648                         return SECCLASS_RAWIP_SOCKET;
649                 }
650                 break;
651         case PF_NETLINK:
652                 switch (protocol) {
653                 case NETLINK_ROUTE:
654                         return SECCLASS_NETLINK_ROUTE_SOCKET;
655                 case NETLINK_FIREWALL:
656                         return SECCLASS_NETLINK_FIREWALL_SOCKET;
657                 case NETLINK_TCPDIAG:
658                         return SECCLASS_NETLINK_TCPDIAG_SOCKET;
659                 case NETLINK_NFLOG:
660                         return SECCLASS_NETLINK_NFLOG_SOCKET;
661                 case NETLINK_XFRM:
662                         return SECCLASS_NETLINK_XFRM_SOCKET;
663                 case NETLINK_SELINUX:
664                         return SECCLASS_NETLINK_SELINUX_SOCKET;
665                 case NETLINK_AUDIT:
666                         return SECCLASS_NETLINK_AUDIT_SOCKET;
667                 case NETLINK_IP6_FW:
668                         return SECCLASS_NETLINK_IP6FW_SOCKET;
669                 case NETLINK_DNRTMSG:
670                         return SECCLASS_NETLINK_DNRT_SOCKET;
671                 default:
672                         return SECCLASS_NETLINK_SOCKET;
673                 }
674         case PF_PACKET:
675                 return SECCLASS_PACKET_SOCKET;
676         case PF_KEY:
677                 return SECCLASS_KEY_SOCKET;
678         }
679
680         return SECCLASS_SOCKET;
681 }
682
683 #ifdef CONFIG_PROC_FS
684 static int selinux_proc_get_sid(struct proc_dir_entry *de,
685                                 u16 tclass,
686                                 u32 *sid)
687 {
688         int buflen, rc;
689         char *buffer, *path, *end;
690
691         buffer = (char*)__get_free_page(GFP_KERNEL);
692         if (!buffer)
693                 return -ENOMEM;
694
695         buflen = PAGE_SIZE;
696         end = buffer+buflen;
697         *--end = '\0';
698         buflen--;
699         path = end-1;
700         *path = '/';
701         while (de && de != de->parent) {
702                 buflen -= de->namelen + 1;
703                 if (buflen < 0)
704                         break;
705                 end -= de->namelen;
706                 memcpy(end, de->name, de->namelen);
707                 *--end = '/';
708                 path = end;
709                 de = de->parent;
710         }
711         rc = security_genfs_sid("proc", path, tclass, sid);
712         free_page((unsigned long)buffer);
713         return rc;
714 }
715 #else
716 static int selinux_proc_get_sid(struct proc_dir_entry *de,
717                                 u16 tclass,
718                                 u32 *sid)
719 {
720         return -EINVAL;
721 }
722 #endif
723
724 /* The inode's security attributes must be initialized before first use. */
725 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
726 {
727         struct superblock_security_struct *sbsec = NULL;
728         struct inode_security_struct *isec = inode->i_security;
729         u32 sid;
730         struct dentry *dentry;
731 #define INITCONTEXTLEN 255
732         char *context = NULL;
733         unsigned len = 0;
734         int rc = 0;
735         int hold_sem = 0;
736
737         if (isec->initialized)
738                 goto out;
739
740         down(&isec->sem);
741         hold_sem = 1;
742         if (isec->initialized)
743                 goto out;
744
745         sbsec = inode->i_sb->s_security;
746         if (!sbsec->initialized) {
747                 /* Defer initialization until selinux_complete_init,
748                    after the initial policy is loaded and the security
749                    server is ready to handle calls. */
750                 spin_lock(&sbsec->isec_lock);
751                 if (list_empty(&isec->list))
752                         list_add(&isec->list, &sbsec->isec_head);
753                 spin_unlock(&sbsec->isec_lock);
754                 goto out;
755         }
756
757         switch (sbsec->behavior) {
758         case SECURITY_FS_USE_XATTR:
759                 if (!inode->i_op->getxattr) {
760                         isec->sid = sbsec->def_sid;
761                         break;
762                 }
763
764                 /* Need a dentry, since the xattr API requires one.
765                    Life would be simpler if we could just pass the inode. */
766                 if (opt_dentry) {
767                         /* Called from d_instantiate or d_splice_alias. */
768                         dentry = dget(opt_dentry);
769                 } else {
770                         /* Called from selinux_complete_init, try to find a dentry. */
771                         dentry = d_find_alias(inode);
772                 }
773                 if (!dentry) {
774                         printk(KERN_WARNING "%s:  no dentry for dev=%s "
775                                "ino=%ld\n", __FUNCTION__, inode->i_sb->s_id,
776                                inode->i_ino);
777                         goto out;
778                 }
779
780                 len = INITCONTEXTLEN;
781                 context = kmalloc(len, GFP_KERNEL);
782                 if (!context) {
783                         rc = -ENOMEM;
784                         dput(dentry);
785                         goto out;
786                 }
787                 rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
788                                            context, len);
789                 if (rc == -ERANGE) {
790                         /* Need a larger buffer.  Query for the right size. */
791                         rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
792                                                    NULL, 0);
793                         if (rc < 0) {
794                                 dput(dentry);
795                                 goto out;
796                         }
797                         kfree(context);
798                         len = rc;
799                         context = kmalloc(len, GFP_KERNEL);
800                         if (!context) {
801                                 rc = -ENOMEM;
802                                 dput(dentry);
803                                 goto out;
804                         }
805                         rc = inode->i_op->getxattr(dentry,
806                                                    XATTR_NAME_SELINUX,
807                                                    context, len);
808                 }
809                 dput(dentry);
810                 if (rc < 0) {
811                         if (rc != -ENODATA) {
812                                 printk(KERN_WARNING "%s:  getxattr returned "
813                                        "%d for dev=%s ino=%ld\n", __FUNCTION__,
814                                        -rc, inode->i_sb->s_id, inode->i_ino);
815                                 kfree(context);
816                                 goto out;
817                         }
818                         /* Map ENODATA to the default file SID */
819                         sid = sbsec->def_sid;
820                         rc = 0;
821                 } else {
822                         rc = security_context_to_sid(context, rc, &sid);
823                         if (rc) {
824                                 printk(KERN_WARNING "%s:  context_to_sid(%s) "
825                                        "returned %d for dev=%s ino=%ld\n",
826                                        __FUNCTION__, context, -rc,
827                                        inode->i_sb->s_id, inode->i_ino);
828                                 kfree(context);
829                                 goto out;
830                         }
831                 }
832                 kfree(context);
833                 isec->sid = sid;
834                 break;
835         case SECURITY_FS_USE_TASK:
836                 isec->sid = isec->task_sid;
837                 break;
838         case SECURITY_FS_USE_TRANS:
839                 /* Default to the fs SID. */
840                 isec->sid = sbsec->sid;
841
842                 /* Try to obtain a transition SID. */
843                 isec->sclass = inode_mode_to_security_class(inode->i_mode);
844                 rc = security_transition_sid(isec->task_sid,
845                                              sbsec->sid,
846                                              isec->sclass,
847                                              &sid);
848                 if (rc)
849                         goto out;
850                 isec->sid = sid;
851                 break;
852         default:
853                 /* Default to the fs SID. */
854                 isec->sid = sbsec->sid;
855
856                 if (sbsec->proc) {
857                         struct proc_inode *proci = PROC_I(inode);
858                         if (proci->pde) {
859                                 isec->sclass = inode_mode_to_security_class(inode->i_mode);
860                                 rc = selinux_proc_get_sid(proci->pde,
861                                                           isec->sclass,
862                                                           &sid);
863                                 if (rc)
864                                         goto out;
865                                 isec->sid = sid;
866                         }
867                 }
868                 break;
869         }
870
871         isec->initialized = 1;
872
873 out:
874         if (inode->i_sock) {
875                 struct socket *sock = SOCKET_I(inode);
876                 if (sock->sk) {
877                         isec->sclass = socket_type_to_security_class(sock->sk->sk_family,
878                                                                      sock->sk->sk_type,
879                                                                      sock->sk->sk_protocol);
880                 } else {
881                         isec->sclass = SECCLASS_SOCKET;
882                 }
883         } else {
884                 isec->sclass = inode_mode_to_security_class(inode->i_mode);
885         }
886
887         if (hold_sem)
888                 up(&isec->sem);
889         return rc;
890 }
891
892 /* Convert a Linux signal to an access vector. */
893 static inline u32 signal_to_av(int sig)
894 {
895         u32 perm = 0;
896
897         switch (sig) {
898         case SIGCHLD:
899                 /* Commonly granted from child to parent. */
900                 perm = PROCESS__SIGCHLD;
901                 break;
902         case SIGKILL:
903                 /* Cannot be caught or ignored */
904                 perm = PROCESS__SIGKILL;
905                 break;
906         case SIGSTOP:
907                 /* Cannot be caught or ignored */
908                 perm = PROCESS__SIGSTOP;
909                 break;
910         default:
911                 /* All other signals. */
912                 perm = PROCESS__SIGNAL;
913                 break;
914         }
915
916         return perm;
917 }
918
919 /* Check permission betweeen a pair of tasks, e.g. signal checks,
920    fork check, ptrace check, etc. */
921 int task_has_perm(struct task_struct *tsk1,
922                   struct task_struct *tsk2,
923                   u32 perms)
924 {
925         struct task_security_struct *tsec1, *tsec2;
926
927         tsec1 = tsk1->security;
928         tsec2 = tsk2->security;
929         return avc_has_perm(tsec1->sid, tsec2->sid,
930                             SECCLASS_PROCESS, perms, NULL);
931 }
932
933 /* Check whether a task is allowed to use a capability. */
934 int task_has_capability(struct task_struct *tsk,
935                         int cap)
936 {
937         struct task_security_struct *tsec;
938         struct avc_audit_data ad;
939
940         tsec = tsk->security;
941
942         AVC_AUDIT_DATA_INIT(&ad,CAP);
943         ad.tsk = tsk;
944         ad.u.cap = cap;
945
946         return avc_has_perm(tsec->sid, tsec->sid,
947                             SECCLASS_CAPABILITY, CAP_TO_MASK(cap), &ad);
948 }
949
950 /* Check whether a task is allowed to use a system operation. */
951 int task_has_system(struct task_struct *tsk,
952                     u32 perms)
953 {
954         struct task_security_struct *tsec;
955
956         tsec = tsk->security;
957
958         return avc_has_perm(tsec->sid, SECINITSID_KERNEL,
959                             SECCLASS_SYSTEM, perms, NULL);
960 }
961
962 /* Check whether a task has a particular permission to an inode.
963    The 'adp' parameter is optional and allows other audit
964    data to be passed (e.g. the dentry). */
965 int inode_has_perm(struct task_struct *tsk,
966                    struct inode *inode,
967                    u32 perms,
968                    struct avc_audit_data *adp)
969 {
970         struct task_security_struct *tsec;
971         struct inode_security_struct *isec;
972         struct avc_audit_data ad;
973
974         tsec = tsk->security;
975         isec = inode->i_security;
976
977         if (!adp) {
978                 adp = &ad;
979                 AVC_AUDIT_DATA_INIT(&ad, FS);
980                 ad.u.fs.inode = inode;
981         }
982
983         return avc_has_perm(tsec->sid, isec->sid, isec->sclass, perms, adp);
984 }
985
986 /* Same as inode_has_perm, but pass explicit audit data containing
987    the dentry to help the auditing code to more easily generate the
988    pathname if needed. */
989 static inline int dentry_has_perm(struct task_struct *tsk,
990                                   struct vfsmount *mnt,
991                                   struct dentry *dentry,
992                                   u32 av)
993 {
994         struct inode *inode = dentry->d_inode;
995         struct avc_audit_data ad;
996         AVC_AUDIT_DATA_INIT(&ad,FS);
997         ad.u.fs.mnt = mnt;
998         ad.u.fs.dentry = dentry;
999         return inode_has_perm(tsk, inode, av, &ad);
1000 }
1001
1002 /* Check whether a task can use an open file descriptor to
1003    access an inode in a given way.  Check access to the
1004    descriptor itself, and then use dentry_has_perm to
1005    check a particular permission to the file.
1006    Access to the descriptor is implicitly granted if it
1007    has the same SID as the process.  If av is zero, then
1008    access to the file is not checked, e.g. for cases
1009    where only the descriptor is affected like seek. */
1010 static inline int file_has_perm(struct task_struct *tsk,
1011                                 struct file *file,
1012                                 u32 av)
1013 {
1014         struct task_security_struct *tsec = tsk->security;
1015         struct file_security_struct *fsec = file->f_security;
1016         struct vfsmount *mnt = file->f_vfsmnt;
1017         struct dentry *dentry = file->f_dentry;
1018         struct inode *inode = dentry->d_inode;
1019         struct avc_audit_data ad;
1020         int rc;
1021
1022         AVC_AUDIT_DATA_INIT(&ad, FS);
1023         ad.u.fs.mnt = mnt;
1024         ad.u.fs.dentry = dentry;
1025
1026         if (tsec->sid != fsec->sid) {
1027                 rc = avc_has_perm(tsec->sid, fsec->sid,
1028                                   SECCLASS_FD,
1029                                   FD__USE,
1030                                   &ad);
1031                 if (rc)
1032                         return rc;
1033         }
1034
1035         /* av is zero if only checking access to the descriptor. */
1036         if (av)
1037                 return inode_has_perm(tsk, inode, av, &ad);
1038
1039         return 0;
1040 }
1041
1042 /* Check whether a task can create a file. */
1043 static int may_create(struct inode *dir,
1044                       struct dentry *dentry,
1045                       u16 tclass)
1046 {
1047         struct task_security_struct *tsec;
1048         struct inode_security_struct *dsec;
1049         struct superblock_security_struct *sbsec;
1050         u32 newsid;
1051         struct avc_audit_data ad;
1052         int rc;
1053
1054         tsec = current->security;
1055         dsec = dir->i_security;
1056         sbsec = dir->i_sb->s_security;
1057
1058         AVC_AUDIT_DATA_INIT(&ad, FS);
1059         ad.u.fs.dentry = dentry;
1060
1061         rc = avc_has_perm(tsec->sid, dsec->sid, SECCLASS_DIR,
1062                           DIR__ADD_NAME | DIR__SEARCH,
1063                           &ad);
1064         if (rc)
1065                 return rc;
1066
1067         if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) {
1068                 newsid = tsec->create_sid;
1069         } else {
1070                 rc = security_transition_sid(tsec->sid, dsec->sid, tclass,
1071                                              &newsid);
1072                 if (rc)
1073                         return rc;
1074         }
1075
1076         rc = avc_has_perm(tsec->sid, newsid, tclass, FILE__CREATE, &ad);
1077         if (rc)
1078                 return rc;
1079
1080         return avc_has_perm(newsid, sbsec->sid,
1081                             SECCLASS_FILESYSTEM,
1082                             FILESYSTEM__ASSOCIATE, &ad);
1083 }
1084
1085 #define MAY_LINK   0
1086 #define MAY_UNLINK 1
1087 #define MAY_RMDIR  2
1088
1089 /* Check whether a task can link, unlink, or rmdir a file/directory. */
1090 static int may_link(struct inode *dir,
1091                     struct dentry *dentry,
1092                     int kind)
1093
1094 {
1095         struct task_security_struct *tsec;
1096         struct inode_security_struct *dsec, *isec;
1097         struct avc_audit_data ad;
1098         u32 av;
1099         int rc;
1100
1101         tsec = current->security;
1102         dsec = dir->i_security;
1103         isec = dentry->d_inode->i_security;
1104
1105         AVC_AUDIT_DATA_INIT(&ad, FS);
1106         ad.u.fs.dentry = dentry;
1107
1108         av = DIR__SEARCH;
1109         av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
1110         rc = avc_has_perm(tsec->sid, dsec->sid, SECCLASS_DIR, av, &ad);
1111         if (rc)
1112                 return rc;
1113
1114         switch (kind) {
1115         case MAY_LINK:
1116                 av = FILE__LINK;
1117                 break;
1118         case MAY_UNLINK:
1119                 av = FILE__UNLINK;
1120                 break;
1121         case MAY_RMDIR:
1122                 av = DIR__RMDIR;
1123                 break;
1124         default:
1125                 printk(KERN_WARNING "may_link:  unrecognized kind %d\n", kind);
1126                 return 0;
1127         }
1128
1129         rc = avc_has_perm(tsec->sid, isec->sid, isec->sclass, av, &ad);
1130         return rc;
1131 }
1132
1133 static inline int may_rename(struct inode *old_dir,
1134                              struct dentry *old_dentry,
1135                              struct inode *new_dir,
1136                              struct dentry *new_dentry)
1137 {
1138         struct task_security_struct *tsec;
1139         struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1140         struct avc_audit_data ad;
1141         u32 av;
1142         int old_is_dir, new_is_dir;
1143         int rc;
1144
1145         tsec = current->security;
1146         old_dsec = old_dir->i_security;
1147         old_isec = old_dentry->d_inode->i_security;
1148         old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
1149         new_dsec = new_dir->i_security;
1150
1151         AVC_AUDIT_DATA_INIT(&ad, FS);
1152
1153         ad.u.fs.dentry = old_dentry;
1154         rc = avc_has_perm(tsec->sid, old_dsec->sid, SECCLASS_DIR,
1155                           DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1156         if (rc)
1157                 return rc;
1158         rc = avc_has_perm(tsec->sid, old_isec->sid,
1159                           old_isec->sclass, FILE__RENAME, &ad);
1160         if (rc)
1161                 return rc;
1162         if (old_is_dir && new_dir != old_dir) {
1163                 rc = avc_has_perm(tsec->sid, old_isec->sid,
1164                                   old_isec->sclass, DIR__REPARENT, &ad);
1165                 if (rc)
1166                         return rc;
1167         }
1168
1169         ad.u.fs.dentry = new_dentry;
1170         av = DIR__ADD_NAME | DIR__SEARCH;
1171         if (new_dentry->d_inode)
1172                 av |= DIR__REMOVE_NAME;
1173         rc = avc_has_perm(tsec->sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1174         if (rc)
1175                 return rc;
1176         if (new_dentry->d_inode) {
1177                 new_isec = new_dentry->d_inode->i_security;
1178                 new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode);
1179                 rc = avc_has_perm(tsec->sid, new_isec->sid,
1180                                   new_isec->sclass,
1181                                   (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1182                 if (rc)
1183                         return rc;
1184         }
1185
1186         return 0;
1187 }
1188
1189 /* Check whether a task can perform a filesystem operation. */
1190 int superblock_has_perm(struct task_struct *tsk,
1191                         struct super_block *sb,
1192                         u32 perms,
1193                         struct avc_audit_data *ad)
1194 {
1195         struct task_security_struct *tsec;
1196         struct superblock_security_struct *sbsec;
1197
1198         tsec = tsk->security;
1199         sbsec = sb->s_security;
1200         return avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
1201                             perms, ad);
1202 }
1203
1204 /* Convert a Linux mode and permission mask to an access vector. */
1205 static inline u32 file_mask_to_av(int mode, int mask)
1206 {
1207         u32 av = 0;
1208
1209         if ((mode & S_IFMT) != S_IFDIR) {
1210                 if (mask & MAY_EXEC)
1211                         av |= FILE__EXECUTE;
1212                 if (mask & MAY_READ)
1213                         av |= FILE__READ;
1214
1215                 if (mask & MAY_APPEND)
1216                         av |= FILE__APPEND;
1217                 else if (mask & MAY_WRITE)
1218                         av |= FILE__WRITE;
1219
1220         } else {
1221                 if (mask & MAY_EXEC)
1222                         av |= DIR__SEARCH;
1223                 if (mask & MAY_WRITE)
1224                         av |= DIR__WRITE;
1225                 if (mask & MAY_READ)
1226                         av |= DIR__READ;
1227         }
1228
1229         return av;
1230 }
1231
1232 /* Convert a Linux file to an access vector. */
1233 static inline u32 file_to_av(struct file *file)
1234 {
1235         u32 av = 0;
1236
1237         if (file->f_mode & FMODE_READ)
1238                 av |= FILE__READ;
1239         if (file->f_mode & FMODE_WRITE) {
1240                 if (file->f_flags & O_APPEND)
1241                         av |= FILE__APPEND;
1242                 else
1243                         av |= FILE__WRITE;
1244         }
1245
1246         return av;
1247 }
1248
1249 /* Set an inode's SID to a specified value. */
1250 int inode_security_set_sid(struct inode *inode, u32 sid)
1251 {
1252         struct inode_security_struct *isec = inode->i_security;
1253         struct superblock_security_struct *sbsec = inode->i_sb->s_security;
1254
1255         if (!sbsec->initialized) {
1256                 /* Defer initialization to selinux_complete_init. */
1257                 return 0;
1258         }
1259
1260         down(&isec->sem);
1261         isec->sclass = inode_mode_to_security_class(inode->i_mode);
1262         isec->sid = sid;
1263         isec->initialized = 1;
1264         up(&isec->sem);
1265         return 0;
1266 }
1267
1268 /* Set the security attributes on a newly created file. */
1269 static int post_create(struct inode *dir,
1270                        struct dentry *dentry)
1271 {
1272
1273         struct task_security_struct *tsec;
1274         struct inode *inode;
1275         struct inode_security_struct *dsec;
1276         struct superblock_security_struct *sbsec;
1277         u32 newsid;
1278         char *context;
1279         unsigned int len;
1280         int rc;
1281
1282         tsec = current->security;
1283         dsec = dir->i_security;
1284         sbsec = dir->i_sb->s_security;
1285
1286         inode = dentry->d_inode;
1287         if (!inode) {
1288                 /* Some file system types (e.g. NFS) may not instantiate
1289                    a dentry for all create operations (e.g. symlink),
1290                    so we have to check to see if the inode is non-NULL. */
1291                 printk(KERN_WARNING "post_create:  no inode, dir (dev=%s, "
1292                        "ino=%ld)\n", dir->i_sb->s_id, dir->i_ino);
1293                 return 0;
1294         }
1295
1296         if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) {
1297                 newsid = tsec->create_sid;
1298         } else {
1299                 rc = security_transition_sid(tsec->sid, dsec->sid,
1300                                              inode_mode_to_security_class(inode->i_mode),
1301                                              &newsid);
1302                 if (rc) {
1303                         printk(KERN_WARNING "post_create:  "
1304                                "security_transition_sid failed, rc=%d (dev=%s "
1305                                "ino=%ld)\n",
1306                                -rc, inode->i_sb->s_id, inode->i_ino);
1307                         return rc;
1308                 }
1309         }
1310
1311         rc = inode_security_set_sid(inode, newsid);
1312         if (rc) {
1313                 printk(KERN_WARNING "post_create:  inode_security_set_sid "
1314                        "failed, rc=%d (dev=%s ino=%ld)\n",
1315                        -rc, inode->i_sb->s_id, inode->i_ino);
1316                 return rc;
1317         }
1318
1319         if (sbsec->behavior == SECURITY_FS_USE_XATTR &&
1320             inode->i_op->setxattr) {
1321                 /* Use extended attributes. */
1322                 rc = security_sid_to_context(newsid, &context, &len);
1323                 if (rc) {
1324                         printk(KERN_WARNING "post_create:  sid_to_context "
1325                                "failed, rc=%d (dev=%s ino=%ld)\n",
1326                                -rc, inode->i_sb->s_id, inode->i_ino);
1327                         return rc;
1328                 }
1329                 down(&inode->i_sem);
1330                 rc = inode->i_op->setxattr(dentry,
1331                                            XATTR_NAME_SELINUX,
1332                                            context, len, 0);
1333                 up(&inode->i_sem);
1334                 kfree(context);
1335                 if (rc < 0) {
1336                         printk(KERN_WARNING "post_create:  setxattr failed, "
1337                                "rc=%d (dev=%s ino=%ld)\n",
1338                                -rc, inode->i_sb->s_id, inode->i_ino);
1339                         return rc;
1340                 }
1341         }
1342
1343         return 0;
1344 }
1345
1346
1347 /* Hook functions begin here. */
1348
1349 static int selinux_ptrace(struct task_struct *parent, struct task_struct *child)
1350 {
1351         struct task_security_struct *psec = parent->security;
1352         struct task_security_struct *csec = child->security;
1353         int rc;
1354
1355         rc = secondary_ops->ptrace(parent,child);
1356         if (rc)
1357                 return rc;
1358
1359         rc = task_has_perm(parent, child, PROCESS__PTRACE);
1360         /* Save the SID of the tracing process for later use in apply_creds. */
1361         if (!rc)
1362                 csec->ptrace_sid = psec->sid;
1363         return rc;
1364 }
1365
1366 static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
1367                           kernel_cap_t *inheritable, kernel_cap_t *permitted)
1368 {
1369         int error;
1370
1371         error = task_has_perm(current, target, PROCESS__GETCAP);
1372         if (error)
1373                 return error;
1374
1375         return secondary_ops->capget(target, effective, inheritable, permitted);
1376 }
1377
1378 static int selinux_capset_check(struct task_struct *target, kernel_cap_t *effective,
1379                                 kernel_cap_t *inheritable, kernel_cap_t *permitted)
1380 {
1381         int error;
1382
1383         error = secondary_ops->capset_check(target, effective, inheritable, permitted);
1384         if (error)
1385                 return error;
1386
1387         return task_has_perm(current, target, PROCESS__SETCAP);
1388 }
1389
1390 static void selinux_capset_set(struct task_struct *target, kernel_cap_t *effective,
1391                                kernel_cap_t *inheritable, kernel_cap_t *permitted)
1392 {
1393         secondary_ops->capset_set(target, effective, inheritable, permitted);
1394 }
1395
1396 static int selinux_capable(struct task_struct *tsk, int cap)
1397 {
1398         int rc;
1399
1400         rc = secondary_ops->capable(tsk, cap);
1401         if (rc)
1402                 return rc;
1403
1404         return task_has_capability(tsk,cap);
1405 }
1406
1407 static int selinux_sysctl(ctl_table *table, int op)
1408 {
1409         int error = 0;
1410         u32 av;
1411         struct task_security_struct *tsec;
1412         u32 tsid;
1413         int rc;
1414
1415         rc = secondary_ops->sysctl(table, op);
1416         if (rc)
1417                 return rc;
1418
1419         tsec = current->security;
1420
1421         rc = selinux_proc_get_sid(table->de, (op == 001) ?
1422                                   SECCLASS_DIR : SECCLASS_FILE, &tsid);
1423         if (rc) {
1424                 /* Default to the well-defined sysctl SID. */
1425                 tsid = SECINITSID_SYSCTL;
1426         }
1427
1428         /* The op values are "defined" in sysctl.c, thereby creating
1429          * a bad coupling between this module and sysctl.c */
1430         if(op == 001) {
1431                 error = avc_has_perm(tsec->sid, tsid,
1432                                      SECCLASS_DIR, DIR__SEARCH, NULL);
1433         } else {
1434                 av = 0;
1435                 if (op & 004)
1436                         av |= FILE__READ;
1437                 if (op & 002)
1438                         av |= FILE__WRITE;
1439                 if (av)
1440                         error = avc_has_perm(tsec->sid, tsid,
1441                                              SECCLASS_FILE, av, NULL);
1442         }
1443
1444         return error;
1445 }
1446
1447 static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
1448 {
1449         int rc = 0;
1450
1451         if (!sb)
1452                 return 0;
1453
1454         switch (cmds) {
1455                 case Q_SYNC:
1456                 case Q_QUOTAON:
1457                 case Q_QUOTAOFF:
1458                 case Q_SETINFO:
1459                 case Q_SETQUOTA:
1460                         rc = superblock_has_perm(current,
1461                                                  sb,
1462                                                  FILESYSTEM__QUOTAMOD, NULL);
1463                         break;
1464                 case Q_GETFMT:
1465                 case Q_GETINFO:
1466                 case Q_GETQUOTA:
1467                         rc = superblock_has_perm(current,
1468                                                  sb,
1469                                                  FILESYSTEM__QUOTAGET, NULL);
1470                         break;
1471                 default:
1472                         rc = 0;  /* let the kernel handle invalid cmds */
1473                         break;
1474         }
1475         return rc;
1476 }
1477
1478 static int selinux_quota_on(struct dentry *dentry)
1479 {
1480         return dentry_has_perm(current, NULL, dentry, FILE__QUOTAON);
1481 }
1482
1483 static int selinux_syslog(int type)
1484 {
1485         int rc;
1486
1487         rc = secondary_ops->syslog(type);
1488         if (rc)
1489                 return rc;
1490
1491         switch (type) {
1492                 case 3:         /* Read last kernel messages */
1493                 case 10:        /* Return size of the log buffer */
1494                         rc = task_has_system(current, SYSTEM__SYSLOG_READ);
1495                         break;
1496                 case 6:         /* Disable logging to console */
1497                 case 7:         /* Enable logging to console */
1498                 case 8:         /* Set level of messages printed to console */
1499                         rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
1500                         break;
1501                 case 0:         /* Close log */
1502                 case 1:         /* Open log */
1503                 case 2:         /* Read from log */
1504                 case 4:         /* Read/clear last kernel messages */
1505                 case 5:         /* Clear ring buffer */
1506                 default:
1507                         rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
1508                         break;
1509         }
1510         return rc;
1511 }
1512
1513 /*
1514  * Check that a process has enough memory to allocate a new virtual
1515  * mapping. 0 means there is enough memory for the allocation to
1516  * succeed and -ENOMEM implies there is not.
1517  *
1518  * Note that secondary_ops->capable and task_has_perm_noaudit return 0
1519  * if the capability is granted, but __vm_enough_memory requires 1 if
1520  * the capability is granted.
1521  *
1522  * Do not audit the selinux permission check, as this is applied to all
1523  * processes that allocate mappings.
1524  */
1525 static int selinux_vm_enough_memory(long pages)
1526 {
1527         int rc, cap_sys_admin = 0;
1528         struct task_security_struct *tsec = current->security;
1529
1530         rc = secondary_ops->capable(current, CAP_SYS_ADMIN);
1531         if (rc == 0)
1532                 rc = avc_has_perm_noaudit(tsec->sid, tsec->sid,
1533                                         SECCLASS_CAPABILITY,
1534                                         CAP_TO_MASK(CAP_SYS_ADMIN),
1535                                         NULL);
1536
1537         if (rc == 0)
1538                 cap_sys_admin = 1;
1539
1540         return __vm_enough_memory(pages, cap_sys_admin);
1541 }
1542
1543 /* binprm security operations */
1544
1545 static int selinux_bprm_alloc_security(struct linux_binprm *bprm)
1546 {
1547         struct bprm_security_struct *bsec;
1548
1549         bsec = kmalloc(sizeof(struct bprm_security_struct), GFP_KERNEL);
1550         if (!bsec)
1551                 return -ENOMEM;
1552
1553         memset(bsec, 0, sizeof *bsec);
1554         bsec->magic = SELINUX_MAGIC;
1555         bsec->bprm = bprm;
1556         bsec->sid = SECINITSID_UNLABELED;
1557         bsec->set = 0;
1558
1559         bprm->security = bsec;
1560         return 0;
1561 }
1562
1563 static int selinux_bprm_set_security(struct linux_binprm *bprm)
1564 {
1565         struct task_security_struct *tsec;
1566         struct inode *inode = bprm->file->f_dentry->d_inode;
1567         struct inode_security_struct *isec;
1568         struct bprm_security_struct *bsec;
1569         u32 newsid;
1570         struct avc_audit_data ad;
1571         int rc;
1572
1573         rc = secondary_ops->bprm_set_security(bprm);
1574         if (rc)
1575                 return rc;
1576
1577         bsec = bprm->security;
1578
1579         if (bsec->set)
1580                 return 0;
1581
1582         tsec = current->security;
1583         isec = inode->i_security;
1584
1585         /* Default to the current task SID. */
1586         bsec->sid = tsec->sid;
1587
1588         /* Reset create SID on execve. */
1589         tsec->create_sid = 0;
1590
1591         if (tsec->exec_sid) {
1592                 newsid = tsec->exec_sid;
1593                 /* Reset exec SID on execve. */
1594                 tsec->exec_sid = 0;
1595         } else {
1596                 /* Check for a default transition on this program. */
1597                 rc = security_transition_sid(tsec->sid, isec->sid,
1598                                              SECCLASS_PROCESS, &newsid);
1599                 if (rc)
1600                         return rc;
1601         }
1602
1603         AVC_AUDIT_DATA_INIT(&ad, FS);
1604         ad.u.fs.mnt = bprm->file->f_vfsmnt;
1605         ad.u.fs.dentry = bprm->file->f_dentry;
1606
1607         if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)
1608                 newsid = tsec->sid;
1609
1610         if (tsec->sid == newsid) {
1611                 rc = avc_has_perm(tsec->sid, isec->sid,
1612                                   SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
1613                 if (rc)
1614                         return rc;
1615         } else {
1616                 /* Check permissions for the transition. */
1617                 rc = avc_has_perm(tsec->sid, newsid,
1618                                   SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
1619                 if (rc)
1620                         return rc;
1621
1622                 rc = avc_has_perm(newsid, isec->sid,
1623                                   SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
1624                 if (rc)
1625                         return rc;
1626
1627                 /* Clear any possibly unsafe personality bits on exec: */
1628                 current->personality &= ~PER_CLEAR_ON_SETID;
1629
1630                 /* Set the security field to the new SID. */
1631                 bsec->sid = newsid;
1632         }
1633
1634         bsec->set = 1;
1635         return 0;
1636 }
1637
1638 static int selinux_bprm_check_security (struct linux_binprm *bprm)
1639 {
1640         return secondary_ops->bprm_check_security(bprm);
1641 }
1642
1643
1644 static int selinux_bprm_secureexec (struct linux_binprm *bprm)
1645 {
1646         struct task_security_struct *tsec = current->security;
1647         int atsecure = 0;
1648
1649         if (tsec->osid != tsec->sid) {
1650                 /* Enable secure mode for SIDs transitions unless
1651                    the noatsecure permission is granted between
1652                    the two SIDs, i.e. ahp returns 0. */
1653                 atsecure = avc_has_perm(tsec->osid, tsec->sid,
1654                                          SECCLASS_PROCESS,
1655                                          PROCESS__NOATSECURE, NULL);
1656         }
1657
1658         return (atsecure || secondary_ops->bprm_secureexec(bprm));
1659 }
1660
1661 static void selinux_bprm_free_security(struct linux_binprm *bprm)
1662 {
1663         struct bprm_security_struct *bsec = bprm->security;
1664         bprm->security = NULL;
1665         kfree(bsec);
1666 }
1667
1668 extern struct vfsmount *selinuxfs_mount;
1669 extern struct dentry *selinux_null;
1670
1671 /* Derived from fs/exec.c:flush_old_files. */
1672 static inline void flush_unauthorized_files(struct files_struct * files)
1673 {
1674         struct avc_audit_data ad;
1675         struct file *file, *devnull = NULL;
1676         struct tty_struct *tty = current->signal->tty;
1677         long j = -1;
1678
1679         if (tty) {
1680                 file_list_lock();
1681                 file = list_entry(tty->tty_files.next, typeof(*file), f_list);
1682                 if (file) {
1683                         /* Revalidate access to controlling tty.
1684                            Use inode_has_perm on the tty inode directly rather
1685                            than using file_has_perm, as this particular open
1686                            file may belong to another process and we are only
1687                            interested in the inode-based check here. */
1688                         struct inode *inode = file->f_dentry->d_inode;
1689                         if (inode_has_perm(current, inode,
1690                                            FILE__READ | FILE__WRITE, NULL)) {
1691                                 /* Reset controlling tty. */
1692                                 current->signal->tty = NULL;
1693                                 current->signal->tty_old_pgrp = 0;
1694                         }
1695                 }
1696                 file_list_unlock();
1697         }
1698
1699         /* Revalidate access to inherited open files. */
1700
1701         AVC_AUDIT_DATA_INIT(&ad,FS);
1702
1703         spin_lock(&files->file_lock);
1704         for (;;) {
1705                 unsigned long set, i;
1706                 int fd;
1707
1708                 j++;
1709                 i = j * __NFDBITS;
1710                 if (i >= files->max_fds || i >= files->max_fdset)
1711                         break;
1712                 set = files->open_fds->fds_bits[j];
1713                 if (!set)
1714                         continue;
1715                 spin_unlock(&files->file_lock);
1716                 for ( ; set ; i++,set >>= 1) {
1717                         if (set & 1) {
1718                                 file = fget(i);
1719                                 if (!file)
1720                                         continue;
1721                                 if (file_has_perm(current,
1722                                                   file,
1723                                                   file_to_av(file))) {
1724                                         sys_close(i);
1725                                         fd = get_unused_fd();
1726                                         if (fd != i) {
1727                                                 if (fd >= 0)
1728                                                         put_unused_fd(fd);
1729                                                 fput(file);
1730                                                 continue;
1731                                         }
1732                                         if (devnull) {
1733                                                 atomic_inc(&devnull->f_count);
1734                                         } else {
1735                                                 devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR);
1736                                                 if (!devnull) {
1737                                                         put_unused_fd(fd);
1738                                                         fput(file);
1739                                                         continue;
1740                                                 }
1741                                         }
1742                                         fd_install(fd, devnull);
1743                                 }
1744                                 fput(file);
1745                         }
1746                 }
1747                 spin_lock(&files->file_lock);
1748
1749         }
1750         spin_unlock(&files->file_lock);
1751 }
1752
1753 static void selinux_bprm_apply_creds(struct linux_binprm *bprm, int unsafe)
1754 {
1755         struct task_security_struct *tsec;
1756         struct bprm_security_struct *bsec;
1757         u32 sid;
1758         int rc;
1759
1760         secondary_ops->bprm_apply_creds(bprm, unsafe);
1761
1762         tsec = current->security;
1763
1764         bsec = bprm->security;
1765         sid = bsec->sid;
1766
1767         tsec->osid = tsec->sid;
1768         bsec->unsafe = 0;
1769         if (tsec->sid != sid) {
1770                 /* Check for shared state.  If not ok, leave SID
1771                    unchanged and kill. */
1772                 if (unsafe & LSM_UNSAFE_SHARE) {
1773                         rc = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
1774                                         PROCESS__SHARE, NULL);
1775                         if (rc) {
1776                                 bsec->unsafe = 1;
1777                                 return;
1778                         }
1779                 }
1780
1781                 /* Check for ptracing, and update the task SID if ok.
1782                    Otherwise, leave SID unchanged and kill. */
1783                 if (unsafe & (LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) {
1784                         rc = avc_has_perm(tsec->ptrace_sid, sid,
1785                                           SECCLASS_PROCESS, PROCESS__PTRACE,
1786                                           NULL);
1787                         if (rc) {
1788                                 bsec->unsafe = 1;
1789                                 return;
1790                         }
1791                 }
1792                 tsec->sid = sid;
1793         }
1794 }
1795
1796 /*
1797  * called after apply_creds without the task lock held
1798  */
1799 static void selinux_bprm_post_apply_creds(struct linux_binprm *bprm)
1800 {
1801         struct task_security_struct *tsec;
1802         struct rlimit *rlim, *initrlim;
1803         struct itimerval itimer;
1804         struct bprm_security_struct *bsec;
1805         int rc, i;
1806
1807         tsec = current->security;
1808         bsec = bprm->security;
1809
1810         if (bsec->unsafe) {
1811                 force_sig_specific(SIGKILL, current);
1812                 return;
1813         }
1814         if (tsec->osid == tsec->sid)
1815                 return;
1816
1817         /* Close files for which the new task SID is not authorized. */
1818         flush_unauthorized_files(current->files);
1819
1820         /* Check whether the new SID can inherit signal state
1821            from the old SID.  If not, clear itimers to avoid
1822            subsequent signal generation and flush and unblock
1823            signals. This must occur _after_ the task SID has
1824           been updated so that any kill done after the flush
1825           will be checked against the new SID. */
1826         rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
1827                           PROCESS__SIGINH, NULL);
1828         if (rc) {
1829                 memset(&itimer, 0, sizeof itimer);
1830                 for (i = 0; i < 3; i++)
1831                         do_setitimer(i, &itimer, NULL);
1832                 flush_signals(current);
1833                 spin_lock_irq(&current->sighand->siglock);
1834                 flush_signal_handlers(current, 1);
1835                 sigemptyset(&current->blocked);
1836                 recalc_sigpending();
1837                 spin_unlock_irq(&current->sighand->siglock);
1838         }
1839
1840         /* Check whether the new SID can inherit resource limits
1841            from the old SID.  If not, reset all soft limits to
1842            the lower of the current task's hard limit and the init
1843            task's soft limit.  Note that the setting of hard limits
1844            (even to lower them) can be controlled by the setrlimit
1845            check. The inclusion of the init task's soft limit into
1846            the computation is to avoid resetting soft limits higher
1847            than the default soft limit for cases where the default
1848            is lower than the hard limit, e.g. RLIMIT_CORE or
1849            RLIMIT_STACK.*/
1850         rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
1851                           PROCESS__RLIMITINH, NULL);
1852         if (rc) {
1853                 for (i = 0; i < RLIM_NLIMITS; i++) {
1854                         rlim = current->signal->rlim + i;
1855                         initrlim = init_task.signal->rlim+i;
1856                         rlim->rlim_cur = min(rlim->rlim_max,initrlim->rlim_cur);
1857                 }
1858         }
1859
1860         /* Wake up the parent if it is waiting so that it can
1861            recheck wait permission to the new task SID. */
1862         wake_up_interruptible(&current->parent->signal->wait_chldexit);
1863 }
1864
1865 /* superblock security operations */
1866
1867 static int selinux_sb_alloc_security(struct super_block *sb)
1868 {
1869         return superblock_alloc_security(sb);
1870 }
1871
1872 static void selinux_sb_free_security(struct super_block *sb)
1873 {
1874         superblock_free_security(sb);
1875 }
1876
1877 static inline int match_prefix(char *prefix, int plen, char *option, int olen)
1878 {
1879         if (plen > olen)
1880                 return 0;
1881
1882         return !memcmp(prefix, option, plen);
1883 }
1884
1885 static inline int selinux_option(char *option, int len)
1886 {
1887         return (match_prefix("context=", sizeof("context=")-1, option, len) ||
1888                 match_prefix("fscontext=", sizeof("fscontext=")-1, option, len) ||
1889                 match_prefix("defcontext=", sizeof("defcontext=")-1, option, len));
1890 }
1891
1892 static inline void take_option(char **to, char *from, int *first, int len)
1893 {
1894         if (!*first) {
1895                 **to = ',';
1896                 *to += 1;
1897         }
1898         else
1899                 *first = 0;
1900         memcpy(*to, from, len);
1901         *to += len;
1902 }
1903
1904 static int selinux_sb_copy_data(struct file_system_type *type, void *orig, void *copy)
1905 {
1906         int fnosec, fsec, rc = 0;
1907         char *in_save, *in_curr, *in_end;
1908         char *sec_curr, *nosec_save, *nosec;
1909
1910         in_curr = orig;
1911         sec_curr = copy;
1912
1913         /* Binary mount data: just copy */
1914         if (type->fs_flags & FS_BINARY_MOUNTDATA) {
1915                 copy_page(sec_curr, in_curr);
1916                 goto out;
1917         }
1918
1919         nosec = (char *)get_zeroed_page(GFP_KERNEL);
1920         if (!nosec) {
1921                 rc = -ENOMEM;
1922                 goto out;
1923         }
1924
1925         nosec_save = nosec;
1926         fnosec = fsec = 1;
1927         in_save = in_end = orig;
1928
1929         do {
1930                 if (*in_end == ',' || *in_end == '\0') {
1931                         int len = in_end - in_curr;
1932
1933                         if (selinux_option(in_curr, len))
1934                                 take_option(&sec_curr, in_curr, &fsec, len);
1935                         else
1936                                 take_option(&nosec, in_curr, &fnosec, len);
1937
1938                         in_curr = in_end + 1;
1939                 }
1940         } while (*in_end++);
1941
1942         copy_page(in_save, nosec_save);
1943 out:
1944         return rc;
1945 }
1946
1947 static int selinux_sb_kern_mount(struct super_block *sb, void *data)
1948 {
1949         struct avc_audit_data ad;
1950         int rc;
1951
1952         rc = superblock_doinit(sb, data);
1953         if (rc)
1954                 return rc;
1955
1956         AVC_AUDIT_DATA_INIT(&ad,FS);
1957         ad.u.fs.dentry = sb->s_root;
1958         return superblock_has_perm(current, sb, FILESYSTEM__MOUNT, &ad);
1959 }
1960
1961 static int selinux_sb_statfs(struct super_block *sb)
1962 {
1963         struct avc_audit_data ad;
1964
1965         AVC_AUDIT_DATA_INIT(&ad,FS);
1966         ad.u.fs.dentry = sb->s_root;
1967         return superblock_has_perm(current, sb, FILESYSTEM__GETATTR, &ad);
1968 }
1969
1970 static int selinux_mount(char * dev_name,
1971                          struct nameidata *nd,
1972                          char * type,
1973                          unsigned long flags,
1974                          void * data)
1975 {
1976         int rc;
1977
1978         rc = secondary_ops->sb_mount(dev_name, nd, type, flags, data);
1979         if (rc)
1980                 return rc;
1981
1982         if (flags & MS_REMOUNT)
1983                 return superblock_has_perm(current, nd->mnt->mnt_sb,
1984                                            FILESYSTEM__REMOUNT, NULL);
1985         else
1986                 return dentry_has_perm(current, nd->mnt, nd->dentry,
1987                                        FILE__MOUNTON);
1988 }
1989
1990 static int selinux_umount(struct vfsmount *mnt, int flags)
1991 {
1992         int rc;
1993
1994         rc = secondary_ops->sb_umount(mnt, flags);
1995         if (rc)
1996                 return rc;
1997
1998         return superblock_has_perm(current,mnt->mnt_sb,
1999                                    FILESYSTEM__UNMOUNT,NULL);
2000 }
2001
2002 /* inode security operations */
2003
2004 static int selinux_inode_alloc_security(struct inode *inode)
2005 {
2006         return inode_alloc_security(inode);
2007 }
2008
2009 static void selinux_inode_free_security(struct inode *inode)
2010 {
2011         inode_free_security(inode);
2012 }
2013
2014 static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
2015 {
2016         return may_create(dir, dentry, SECCLASS_FILE);
2017 }
2018
2019 static void selinux_inode_post_create(struct inode *dir, struct dentry *dentry, int mask)
2020 {
2021         post_create(dir, dentry);
2022 }
2023
2024 static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2025 {
2026         int rc;
2027
2028         rc = secondary_ops->inode_link(old_dentry,dir,new_dentry);
2029         if (rc)
2030                 return rc;
2031         return may_link(dir, old_dentry, MAY_LINK);
2032 }
2033
2034 static void selinux_inode_post_link(struct dentry *old_dentry, struct inode *inode, struct dentry *new_dentry)
2035 {
2036         return;
2037 }
2038
2039 static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
2040 {
2041         int rc;
2042
2043         rc = secondary_ops->inode_unlink(dir, dentry);
2044         if (rc)
2045                 return rc;
2046         return may_link(dir, dentry, MAY_UNLINK);
2047 }
2048
2049 static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2050 {
2051         return may_create(dir, dentry, SECCLASS_LNK_FILE);
2052 }
2053
2054 static void selinux_inode_post_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2055 {
2056         post_create(dir, dentry);
2057 }
2058
2059 static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
2060 {
2061         return may_create(dir, dentry, SECCLASS_DIR);
2062 }
2063
2064 static void selinux_inode_post_mkdir(struct inode *dir, struct dentry *dentry, int mask)
2065 {
2066         post_create(dir, dentry);
2067 }
2068
2069 static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
2070 {
2071         return may_link(dir, dentry, MAY_RMDIR);
2072 }
2073
2074 static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
2075 {
2076         int rc;
2077
2078         rc = secondary_ops->inode_mknod(dir, dentry, mode, dev);
2079         if (rc)
2080                 return rc;
2081
2082         return may_create(dir, dentry, inode_mode_to_security_class(mode));
2083 }
2084
2085 static void selinux_inode_post_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
2086 {
2087         post_create(dir, dentry);
2088 }
2089
2090 static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
2091                                 struct inode *new_inode, struct dentry *new_dentry)
2092 {
2093         return may_rename(old_inode, old_dentry, new_inode, new_dentry);
2094 }
2095
2096 static void selinux_inode_post_rename(struct inode *old_inode, struct dentry *old_dentry,
2097                                       struct inode *new_inode, struct dentry *new_dentry)
2098 {
2099         return;
2100 }
2101
2102 static int selinux_inode_readlink(struct dentry *dentry)
2103 {
2104         return dentry_has_perm(current, NULL, dentry, FILE__READ);
2105 }
2106
2107 static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
2108 {
2109         int rc;
2110
2111         rc = secondary_ops->inode_follow_link(dentry,nameidata);
2112         if (rc)
2113                 return rc;
2114         return dentry_has_perm(current, NULL, dentry, FILE__READ);
2115 }
2116
2117 static int selinux_inode_permission(struct inode *inode, int mask,
2118                                     struct nameidata *nd)
2119 {
2120         int rc;
2121
2122         rc = secondary_ops->inode_permission(inode, mask, nd);
2123         if (rc)
2124                 return rc;
2125
2126         if (!mask) {
2127                 /* No permission to check.  Existence test. */
2128                 return 0;
2129         }
2130
2131         return inode_has_perm(current, inode,
2132                                file_mask_to_av(inode->i_mode, mask), NULL);
2133 }
2134
2135 static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
2136 {
2137         int rc;
2138
2139         rc = secondary_ops->inode_setattr(dentry, iattr);
2140         if (rc)
2141                 return rc;
2142
2143         if (iattr->ia_valid & ATTR_FORCE)
2144                 return 0;
2145
2146         if (iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
2147                                ATTR_ATIME_SET | ATTR_MTIME_SET))
2148                 return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
2149
2150         return dentry_has_perm(current, NULL, dentry, FILE__WRITE);
2151 }
2152
2153 static int selinux_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
2154 {
2155         return dentry_has_perm(current, mnt, dentry, FILE__GETATTR);
2156 }
2157
2158 static int selinux_inode_setxattr(struct dentry *dentry, char *name, void *value, size_t size, int flags)
2159 {
2160         struct task_security_struct *tsec = current->security;
2161         struct inode *inode = dentry->d_inode;
2162         struct inode_security_struct *isec = inode->i_security;
2163         struct superblock_security_struct *sbsec;
2164         struct avc_audit_data ad;
2165         u32 newsid;
2166         int rc = 0;
2167
2168         if (strcmp(name, XATTR_NAME_SELINUX)) {
2169                 if (!strncmp(name, XATTR_SECURITY_PREFIX,
2170                              sizeof XATTR_SECURITY_PREFIX - 1) &&
2171                     !capable(CAP_SYS_ADMIN)) {
2172                         /* A different attribute in the security namespace.
2173                            Restrict to administrator. */
2174                         return -EPERM;
2175                 }
2176
2177                 /* Not an attribute we recognize, so just check the
2178                    ordinary setattr permission. */
2179                 return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
2180         }
2181
2182         sbsec = inode->i_sb->s_security;
2183         if (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)
2184                 return -EOPNOTSUPP;
2185
2186         if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
2187                 return -EPERM;
2188
2189         AVC_AUDIT_DATA_INIT(&ad,FS);
2190         ad.u.fs.dentry = dentry;
2191
2192         rc = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
2193                           FILE__RELABELFROM, &ad);
2194         if (rc)
2195                 return rc;
2196
2197         rc = security_context_to_sid(value, size, &newsid);
2198         if (rc)
2199                 return rc;
2200
2201         rc = avc_has_perm(tsec->sid, newsid, isec->sclass,
2202                           FILE__RELABELTO, &ad);
2203         if (rc)
2204                 return rc;
2205
2206         return avc_has_perm(newsid,
2207                             sbsec->sid,
2208                             SECCLASS_FILESYSTEM,
2209                             FILESYSTEM__ASSOCIATE,
2210                             &ad);
2211 }
2212
2213 static void selinux_inode_post_setxattr(struct dentry *dentry, char *name,
2214                                         void *value, size_t size, int flags)
2215 {
2216         struct inode *inode = dentry->d_inode;
2217         struct inode_security_struct *isec = inode->i_security;
2218         u32 newsid;
2219         int rc;
2220
2221         if (strcmp(name, XATTR_NAME_SELINUX)) {
2222                 /* Not an attribute we recognize, so nothing to do. */
2223                 return;
2224         }
2225
2226         rc = security_context_to_sid(value, size, &newsid);
2227         if (rc) {
2228                 printk(KERN_WARNING "%s:  unable to obtain SID for context "
2229                        "%s, rc=%d\n", __FUNCTION__, (char*)value, -rc);
2230                 return;
2231         }
2232
2233         isec->sid = newsid;
2234         return;
2235 }
2236
2237 static int selinux_inode_getxattr (struct dentry *dentry, char *name)
2238 {
2239         struct inode *inode = dentry->d_inode;
2240         struct superblock_security_struct *sbsec = inode->i_sb->s_security;
2241
2242         if (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)
2243                 return -EOPNOTSUPP;
2244
2245         return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
2246 }
2247
2248 static int selinux_inode_listxattr (struct dentry *dentry)
2249 {
2250         return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
2251 }
2252
2253 static int selinux_inode_removexattr (struct dentry *dentry, char *name)
2254 {
2255         if (strcmp(name, XATTR_NAME_SELINUX)) {
2256                 if (!strncmp(name, XATTR_SECURITY_PREFIX,
2257                              sizeof XATTR_SECURITY_PREFIX - 1) &&
2258                     !capable(CAP_SYS_ADMIN)) {
2259                         /* A different attribute in the security namespace.
2260                            Restrict to administrator. */
2261                         return -EPERM;
2262                 }
2263
2264                 /* Not an attribute we recognize, so just check the
2265                    ordinary setattr permission. Might want a separate
2266                    permission for removexattr. */
2267                 return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
2268         }
2269
2270         /* No one is allowed to remove a SELinux security label.
2271            You can change the label, but all data must be labeled. */
2272         return -EACCES;
2273 }
2274
2275 static int selinux_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size)
2276 {
2277         struct inode_security_struct *isec = inode->i_security;
2278         char *context;
2279         unsigned len;
2280         int rc;
2281
2282         /* Permission check handled by selinux_inode_getxattr hook.*/
2283
2284         if (strcmp(name, XATTR_SELINUX_SUFFIX))
2285                 return -EOPNOTSUPP;
2286
2287         rc = security_sid_to_context(isec->sid, &context, &len);
2288         if (rc)
2289                 return rc;
2290
2291         if (!buffer || !size) {
2292                 kfree(context);
2293                 return len;
2294         }
2295         if (size < len) {
2296                 kfree(context);
2297                 return -ERANGE;
2298         }
2299         memcpy(buffer, context, len);
2300         kfree(context);
2301         return len;
2302 }
2303
2304 static int selinux_inode_setsecurity(struct inode *inode, const char *name,
2305                                      const void *value, size_t size, int flags)
2306 {
2307         struct inode_security_struct *isec = inode->i_security;
2308         u32 newsid;
2309         int rc;
2310
2311         if (strcmp(name, XATTR_SELINUX_SUFFIX))
2312                 return -EOPNOTSUPP;
2313
2314         if (!value || !size)
2315                 return -EACCES;
2316
2317         rc = security_context_to_sid((void*)value, size, &newsid);
2318         if (rc)
2319                 return rc;
2320
2321         isec->sid = newsid;
2322         return 0;
2323 }
2324
2325 static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
2326 {
2327         const int len = sizeof(XATTR_NAME_SELINUX);
2328         if (buffer && len <= buffer_size)
2329                 memcpy(buffer, XATTR_NAME_SELINUX, len);
2330         return len;
2331 }
2332
2333 /* file security operations */
2334
2335 static int selinux_file_permission(struct file *file, int mask)
2336 {
2337         struct inode *inode = file->f_dentry->d_inode;
2338
2339         if (!mask) {
2340                 /* No permission to check.  Existence test. */
2341                 return 0;
2342         }
2343
2344         /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
2345         if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
2346                 mask |= MAY_APPEND;
2347
2348         return file_has_perm(current, file,
2349                              file_mask_to_av(inode->i_mode, mask));
2350 }
2351
2352 static int selinux_file_alloc_security(struct file *file)
2353 {
2354         return file_alloc_security(file);
2355 }
2356
2357 static void selinux_file_free_security(struct file *file)
2358 {
2359         file_free_security(file);
2360 }
2361
2362 static int selinux_file_ioctl(struct file *file, unsigned int cmd,
2363                               unsigned long arg)
2364 {
2365         int error = 0;
2366
2367         switch (cmd) {
2368                 case FIONREAD:
2369                 /* fall through */
2370                 case FIBMAP:
2371                 /* fall through */
2372                 case FIGETBSZ:
2373                 /* fall through */
2374                 case EXT2_IOC_GETFLAGS:
2375                 /* fall through */
2376                 case EXT2_IOC_GETVERSION:
2377                         error = file_has_perm(current, file, FILE__GETATTR);
2378                         break;
2379
2380                 case EXT2_IOC_SETFLAGS:
2381                 /* fall through */
2382                 case EXT2_IOC_SETVERSION:
2383                         error = file_has_perm(current, file, FILE__SETATTR);
2384                         break;
2385
2386                 /* sys_ioctl() checks */
2387                 case FIONBIO:
2388                 /* fall through */
2389                 case FIOASYNC:
2390                         error = file_has_perm(current, file, 0);
2391                         break;
2392
2393                 case KDSKBENT:
2394                 case KDSKBSENT:
2395                         error = task_has_capability(current,CAP_SYS_TTY_CONFIG);
2396                         break;
2397
2398                 /* default case assumes that the command will go
2399                  * to the file's ioctl() function.
2400                  */
2401                 default:
2402                         error = file_has_perm(current, file, FILE__IOCTL);
2403
2404         }
2405         return error;
2406 }
2407
2408 static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
2409 {
2410         if ((prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
2411                 /*
2412                  * We are making executable an anonymous mapping or a
2413                  * private file mapping that will also be writable.
2414                  * This has an additional check.
2415                  */
2416                 int rc = task_has_perm(current, current, PROCESS__EXECMEM);
2417                 if (rc)
2418                         return rc;
2419         }
2420
2421         if (file) {
2422                 /* read access is always possible with a mapping */
2423                 u32 av = FILE__READ;
2424
2425                 /* write access only matters if the mapping is shared */
2426                 if (shared && (prot & PROT_WRITE))
2427                         av |= FILE__WRITE;
2428
2429                 if (prot & PROT_EXEC)
2430                         av |= FILE__EXECUTE;
2431
2432                 return file_has_perm(current, file, av);
2433         }
2434         return 0;
2435 }
2436
2437 static int selinux_file_mmap(struct file *file, unsigned long prot, unsigned long flags)
2438 {
2439         int rc;
2440
2441         rc = secondary_ops->file_mmap(file, prot, flags);
2442         if (rc)
2443                 return rc;
2444
2445         return file_map_prot_check(file, prot,
2446                                    (flags & MAP_TYPE) == MAP_SHARED);
2447 }
2448
2449 static int selinux_file_mprotect(struct vm_area_struct *vma,
2450                                  unsigned long prot)
2451 {
2452         int rc;
2453
2454         rc = secondary_ops->file_mprotect(vma, prot);
2455         if (rc)
2456                 return rc;
2457
2458         if (vma->vm_file != NULL && vma->anon_vma != NULL && (prot & PROT_EXEC)) {
2459                 /*
2460                  * We are making executable a file mapping that has
2461                  * had some COW done. Since pages might have been written,
2462                  * check ability to execute the possibly modified content.
2463                  * This typically should only occur for text relocations.
2464                  */
2465                 int rc = file_has_perm(current, vma->vm_file, FILE__EXECMOD);
2466                 if (rc)
2467                         return rc;
2468         }
2469
2470         return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
2471 }
2472
2473 static int selinux_file_lock(struct file *file, unsigned int cmd)
2474 {
2475         return file_has_perm(current, file, FILE__LOCK);
2476 }
2477
2478 static int selinux_file_fcntl(struct file *file, unsigned int cmd,
2479                               unsigned long arg)
2480 {
2481         int err = 0;
2482
2483         switch (cmd) {
2484                 case F_SETFL:
2485                         if (!file->f_dentry || !file->f_dentry->d_inode) {
2486                                 err = -EINVAL;
2487                                 break;
2488                         }
2489
2490                         if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
2491                                 err = file_has_perm(current, file,FILE__WRITE);
2492                                 break;
2493                         }
2494                         /* fall through */
2495                 case F_SETOWN:
2496                 case F_SETSIG:
2497                 case F_GETFL:
2498                 case F_GETOWN:
2499                 case F_GETSIG:
2500                         /* Just check FD__USE permission */
2501                         err = file_has_perm(current, file, 0);
2502                         break;
2503                 case F_GETLK:
2504                 case F_SETLK:
2505                 case F_SETLKW:
2506 #if BITS_PER_LONG == 32
2507                 case F_GETLK64:
2508                 case F_SETLK64:
2509                 case F_SETLKW64:
2510 #endif
2511                         if (!file->f_dentry || !file->f_dentry->d_inode) {
2512                                 err = -EINVAL;
2513                                 break;
2514                         }
2515                         err = file_has_perm(current, file, FILE__LOCK);
2516                         break;
2517         }
2518
2519         return err;
2520 }
2521
2522 static int selinux_file_set_fowner(struct file *file)
2523 {
2524         struct task_security_struct *tsec;
2525         struct file_security_struct *fsec;
2526
2527         tsec = current->security;
2528         fsec = file->f_security;
2529         fsec->fown_sid = tsec->sid;
2530
2531         return 0;
2532 }
2533
2534 static int selinux_file_send_sigiotask(struct task_struct *tsk,
2535                                        struct fown_struct *fown, int signum)
2536 {
2537         struct file *file;
2538         u32 perm;
2539         struct task_security_struct *tsec;
2540         struct file_security_struct *fsec;
2541
2542         /* struct fown_struct is never outside the context of a struct file */
2543         file = (struct file *)((long)fown - offsetof(struct file,f_owner));
2544
2545         tsec = tsk->security;
2546         fsec = file->f_security;
2547
2548         if (!signum)
2549                 perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
2550         else
2551                 perm = signal_to_av(signum);
2552
2553         return avc_has_perm(fsec->fown_sid, tsec->sid,
2554                             SECCLASS_PROCESS, perm, NULL);
2555 }
2556
2557 static int selinux_file_receive(struct file *file)
2558 {
2559         return file_has_perm(current, file, file_to_av(file));
2560 }
2561
2562 /* task security operations */
2563
2564 static int selinux_task_create(unsigned long clone_flags)
2565 {
2566         int rc;
2567
2568         rc = secondary_ops->task_create(clone_flags);
2569         if (rc)
2570                 return rc;
2571
2572         return task_has_perm(current, current, PROCESS__FORK);
2573 }
2574
2575 static int selinux_task_alloc_security(struct task_struct *tsk)
2576 {
2577         struct task_security_struct *tsec1, *tsec2;
2578         int rc;
2579
2580         tsec1 = current->security;
2581
2582         rc = task_alloc_security(tsk);
2583         if (rc)
2584                 return rc;
2585         tsec2 = tsk->security;
2586
2587         tsec2->osid = tsec1->osid;
2588         tsec2->sid = tsec1->sid;
2589
2590         /* Retain the exec and create SIDs across fork */
2591         tsec2->exec_sid = tsec1->exec_sid;
2592         tsec2->create_sid = tsec1->create_sid;
2593
2594         /* Retain ptracer SID across fork, if any.
2595            This will be reset by the ptrace hook upon any
2596            subsequent ptrace_attach operations. */
2597         tsec2->ptrace_sid = tsec1->ptrace_sid;
2598
2599         return 0;
2600 }
2601
2602 static void selinux_task_free_security(struct task_struct *tsk)
2603 {
2604         task_free_security(tsk);
2605 }
2606
2607 static int selinux_task_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
2608 {
2609         /* Since setuid only affects the current process, and
2610            since the SELinux controls are not based on the Linux
2611            identity attributes, SELinux does not need to control
2612            this operation.  However, SELinux does control the use
2613            of the CAP_SETUID and CAP_SETGID capabilities using the
2614            capable hook. */
2615         return 0;
2616 }
2617
2618 static int selinux_task_post_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
2619 {
2620         return secondary_ops->task_post_setuid(id0,id1,id2,flags);
2621 }
2622
2623 static int selinux_task_setgid(gid_t id0, gid_t id1, gid_t id2, int flags)
2624 {
2625         /* See the comment for setuid above. */
2626         return 0;
2627 }
2628
2629 static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
2630 {
2631         return task_has_perm(current, p, PROCESS__SETPGID);
2632 }
2633
2634 static int selinux_task_getpgid(struct task_struct *p)
2635 {
2636         return task_has_perm(current, p, PROCESS__GETPGID);
2637 }
2638
2639 static int selinux_task_getsid(struct task_struct *p)
2640 {
2641         return task_has_perm(current, p, PROCESS__GETSESSION);
2642 }
2643
2644 static int selinux_task_setgroups(struct group_info *group_info)
2645 {
2646         /* See the comment for setuid above. */
2647         return 0;
2648 }
2649
2650 static int selinux_task_setnice(struct task_struct *p, int nice)
2651 {
2652         int rc;
2653
2654         rc = secondary_ops->task_setnice(p, nice);
2655         if (rc)
2656                 return rc;
2657
2658         return task_has_perm(current,p, PROCESS__SETSCHED);
2659 }
2660
2661 static int selinux_task_setrlimit(unsigned int resource, struct rlimit *new_rlim)
2662 {
2663         struct rlimit *old_rlim = current->signal->rlim + resource;
2664         int rc;
2665
2666         rc = secondary_ops->task_setrlimit(resource, new_rlim);
2667         if (rc)
2668                 return rc;
2669
2670         /* Control the ability to change the hard limit (whether
2671            lowering or raising it), so that the hard limit can
2672            later be used as a safe reset point for the soft limit
2673            upon context transitions. See selinux_bprm_apply_creds. */
2674         if (old_rlim->rlim_max != new_rlim->rlim_max)
2675                 return task_has_perm(current, current, PROCESS__SETRLIMIT);
2676
2677         return 0;
2678 }
2679
2680 static int selinux_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp)
2681 {
2682         return task_has_perm(current, p, PROCESS__SETSCHED);
2683 }
2684
2685 static int selinux_task_getscheduler(struct task_struct *p)
2686 {
2687         return task_has_perm(current, p, PROCESS__GETSCHED);
2688 }
2689
2690 static int selinux_task_kill(struct task_struct *p, struct siginfo *info, int sig)
2691 {
2692         u32 perm;
2693         int rc;
2694
2695         rc = secondary_ops->task_kill(p, info, sig);
2696         if (rc)
2697                 return rc;
2698
2699         if (info && ((unsigned long)info == 1 ||
2700                      (unsigned long)info == 2 || SI_FROMKERNEL(info)))
2701                 return 0;
2702
2703         if (!sig)
2704                 perm = PROCESS__SIGNULL; /* null signal; existence test */
2705         else
2706                 perm = signal_to_av(sig);
2707
2708         return task_has_perm(current, p, perm);
2709 }
2710
2711 static int selinux_task_prctl(int option,
2712                               unsigned long arg2,
2713                               unsigned long arg3,
2714                               unsigned long arg4,
2715                               unsigned long arg5)
2716 {
2717         /* The current prctl operations do not appear to require
2718            any SELinux controls since they merely observe or modify
2719            the state of the current process. */
2720         return 0;
2721 }
2722
2723 static int selinux_task_wait(struct task_struct *p)
2724 {
2725         u32 perm;
2726
2727         perm = signal_to_av(p->exit_signal);
2728
2729         return task_has_perm(p, current, perm);
2730 }
2731
2732 static void selinux_task_reparent_to_init(struct task_struct *p)
2733 {
2734         struct task_security_struct *tsec;
2735
2736         secondary_ops->task_reparent_to_init(p);
2737
2738         tsec = p->security;
2739         tsec->osid = tsec->sid;
2740         tsec->sid = SECINITSID_KERNEL;
2741         return;
2742 }
2743
2744 static void selinux_task_to_inode(struct task_struct *p,
2745                                   struct inode *inode)
2746 {
2747         struct task_security_struct *tsec = p->security;
2748         struct inode_security_struct *isec = inode->i_security;
2749
2750         isec->sid = tsec->sid;
2751         isec->initialized = 1;
2752         return;
2753 }
2754
2755 #ifdef CONFIG_SECURITY_NETWORK
2756
2757 /* Returns error only if unable to parse addresses */
2758 static int selinux_parse_skb_ipv4(struct sk_buff *skb, struct avc_audit_data *ad)
2759 {
2760         int offset, ihlen, ret = -EINVAL;
2761         struct iphdr _iph, *ih;
2762
2763         offset = skb->nh.raw - skb->data;
2764         ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
2765         if (ih == NULL)
2766                 goto out;
2767
2768         ihlen = ih->ihl * 4;
2769         if (ihlen < sizeof(_iph))
2770                 goto out;
2771
2772         ad->u.net.v4info.saddr = ih->saddr;
2773         ad->u.net.v4info.daddr = ih->daddr;
2774         ret = 0;
2775
2776         switch (ih->protocol) {
2777         case IPPROTO_TCP: {
2778                 struct tcphdr _tcph, *th;
2779
2780                 if (ntohs(ih->frag_off) & IP_OFFSET)
2781                         break;
2782
2783                 offset += ihlen;
2784                 th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
2785                 if (th == NULL)
2786                         break;
2787
2788                 ad->u.net.sport = th->source;
2789                 ad->u.net.dport = th->dest;
2790                 break;
2791         }
2792         
2793         case IPPROTO_UDP: {
2794                 struct udphdr _udph, *uh;
2795                 
2796                 if (ntohs(ih->frag_off) & IP_OFFSET)
2797                         break;
2798                         
2799                 offset += ihlen;
2800                 uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
2801                 if (uh == NULL)
2802                         break;  
2803
2804                 ad->u.net.sport = uh->source;
2805                 ad->u.net.dport = uh->dest;
2806                 break;
2807         }
2808
2809         default:
2810                 break;
2811         }
2812 out:
2813         return ret;
2814 }
2815
2816 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2817
2818 /* Returns error only if unable to parse addresses */
2819 static int selinux_parse_skb_ipv6(struct sk_buff *skb, struct avc_audit_data *ad)
2820 {
2821         u8 nexthdr;
2822         int ret = -EINVAL, offset;
2823         struct ipv6hdr _ipv6h, *ip6;
2824
2825         offset = skb->nh.raw - skb->data;
2826         ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
2827         if (ip6 == NULL)
2828                 goto out;
2829
2830         ipv6_addr_copy(&ad->u.net.v6info.saddr, &ip6->saddr);
2831         ipv6_addr_copy(&ad->u.net.v6info.daddr, &ip6->daddr);
2832         ret = 0;
2833
2834         nexthdr = ip6->nexthdr;
2835         offset += sizeof(_ipv6h);
2836         offset = ipv6_skip_exthdr(skb, offset, &nexthdr,
2837                                   skb->tail - skb->head - offset);
2838         if (offset < 0)
2839                 goto out;
2840
2841         switch (nexthdr) {
2842         case IPPROTO_TCP: {
2843                 struct tcphdr _tcph, *th;
2844
2845                 th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
2846                 if (th == NULL)
2847                         break;
2848
2849                 ad->u.net.sport = th->source;
2850                 ad->u.net.dport = th->dest;
2851                 break;
2852         }
2853
2854         case IPPROTO_UDP: {
2855                 struct udphdr _udph, *uh;
2856
2857                 uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
2858                 if (uh == NULL)
2859                         break;
2860
2861                 ad->u.net.sport = uh->source;
2862                 ad->u.net.dport = uh->dest;
2863                 break;
2864         }
2865
2866         /* includes fragments */
2867         default:
2868                 break;
2869         }
2870 out:
2871         return ret;
2872 }
2873
2874 #endif /* IPV6 */
2875
2876 static int selinux_parse_skb(struct sk_buff *skb, struct avc_audit_data *ad,
2877                              char **addrp, int *len, int src)
2878 {
2879         int ret = 0;
2880
2881         switch (ad->u.net.family) {
2882         case PF_INET:
2883                 ret = selinux_parse_skb_ipv4(skb, ad);
2884                 if (ret || !addrp)
2885                         break;
2886                 *len = 4;
2887                 *addrp = (char *)(src ? &ad->u.net.v4info.saddr :
2888                                         &ad->u.net.v4info.daddr);
2889                 break;
2890
2891 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2892         case PF_INET6:
2893                 ret = selinux_parse_skb_ipv6(skb, ad);
2894                 if (ret || !addrp)
2895                         break;
2896                 *len = 16;
2897                 *addrp = (char *)(src ? &ad->u.net.v6info.saddr :
2898                                         &ad->u.net.v6info.daddr);
2899                 break;
2900 #endif  /* IPV6 */
2901         default:
2902                 break;
2903         }
2904
2905         return ret;
2906 }
2907
2908 /* socket security operations */
2909 static int socket_has_perm(struct task_struct *task, struct socket *sock,
2910                            u32 perms)
2911 {
2912         struct inode_security_struct *isec;
2913         struct task_security_struct *tsec;
2914         struct avc_audit_data ad;
2915         int err = 0;
2916
2917         tsec = task->security;
2918         isec = SOCK_INODE(sock)->i_security;
2919
2920         if (isec->sid == SECINITSID_KERNEL)
2921                 goto out;
2922
2923         AVC_AUDIT_DATA_INIT(&ad,NET);
2924         ad.u.net.sk = sock->sk;
2925         err = avc_has_perm(tsec->sid, isec->sid, isec->sclass, perms, &ad);
2926
2927 out:
2928         return err;
2929 }
2930
2931 static int selinux_socket_create(int family, int type,
2932                                  int protocol, int kern)
2933 {
2934         int err = 0;
2935         struct task_security_struct *tsec;
2936
2937         if (kern)
2938                 goto out;
2939
2940         tsec = current->security;
2941         err = avc_has_perm(tsec->sid, tsec->sid,
2942                            socket_type_to_security_class(family, type,
2943                            protocol), SOCKET__CREATE, NULL);
2944
2945 out:
2946         return err;
2947 }
2948
2949 static void selinux_socket_post_create(struct socket *sock, int family,
2950                                        int type, int protocol, int kern)
2951 {
2952         int err;
2953         struct inode_security_struct *isec;
2954         struct task_security_struct *tsec;
2955
2956         err = inode_doinit(SOCK_INODE(sock));
2957         if (err < 0)
2958                 return;
2959         isec = SOCK_INODE(sock)->i_security;
2960
2961         tsec = current->security;
2962         isec->sclass = socket_type_to_security_class(family, type, protocol);
2963         isec->sid = kern ? SECINITSID_KERNEL : tsec->sid;
2964
2965         return;
2966 }
2967
2968 /* Range of port numbers used to automatically bind.
2969    Need to determine whether we should perform a name_bind
2970    permission check between the socket and the port number. */
2971 #define ip_local_port_range_0 sysctl_local_port_range[0]
2972 #define ip_local_port_range_1 sysctl_local_port_range[1]
2973
2974 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
2975 {
2976         u16 family;
2977         int err;
2978
2979         err = socket_has_perm(current, sock, SOCKET__BIND);
2980         if (err)
2981                 goto out;
2982
2983         /*
2984          * If PF_INET or PF_INET6, check name_bind permission for the port.
2985          */
2986         family = sock->sk->sk_family;
2987         if (family == PF_INET || family == PF_INET6) {
2988                 char *addrp;
2989                 struct inode_security_struct *isec;
2990                 struct task_security_struct *tsec;
2991                 struct avc_audit_data ad;
2992                 struct sockaddr_in *addr4 = NULL;
2993                 struct sockaddr_in6 *addr6 = NULL;
2994                 unsigned short snum;
2995                 struct sock *sk = sock->sk;
2996                 u32 sid, node_perm, addrlen;
2997
2998                 tsec = current->security;
2999                 isec = SOCK_INODE(sock)->i_security;
3000
3001                 if (family == PF_INET) {
3002                         addr4 = (struct sockaddr_in *)address;
3003                         snum = ntohs(addr4->sin_port);
3004                         addrlen = sizeof(addr4->sin_addr.s_addr);
3005                         addrp = (char *)&addr4->sin_addr.s_addr;
3006                 } else {
3007                         addr6 = (struct sockaddr_in6 *)address;
3008                         snum = ntohs(addr6->sin6_port);
3009                         addrlen = sizeof(addr6->sin6_addr.s6_addr);
3010                         addrp = (char *)&addr6->sin6_addr.s6_addr;
3011                 }
3012
3013                 if (snum&&(snum < max(PROT_SOCK,ip_local_port_range_0) ||
3014                            snum > ip_local_port_range_1)) {
3015                         err = security_port_sid(sk->sk_family, sk->sk_type,
3016                                                 sk->sk_protocol, snum, &sid);
3017                         if (err)
3018                                 goto out;
3019                         AVC_AUDIT_DATA_INIT(&ad,NET);
3020                         ad.u.net.sport = htons(snum);
3021                         ad.u.net.family = family;
3022                         err = avc_has_perm(isec->sid, sid,
3023                                            isec->sclass,
3024                                            SOCKET__NAME_BIND, &ad);
3025                         if (err)
3026                                 goto out;
3027                 }
3028                 
3029                 switch(sk->sk_protocol) {
3030                 case IPPROTO_TCP:
3031                         node_perm = TCP_SOCKET__NODE_BIND;
3032                         break;
3033                         
3034                 case IPPROTO_UDP:
3035                         node_perm = UDP_SOCKET__NODE_BIND;
3036                         break;
3037                         
3038                 default:
3039                         node_perm = RAWIP_SOCKET__NODE_BIND;
3040                         break;
3041                 }
3042                 
3043                 err = security_node_sid(family, addrp, addrlen, &sid);
3044                 if (err)
3045                         goto out;
3046                 
3047                 AVC_AUDIT_DATA_INIT(&ad,NET);
3048                 ad.u.net.sport = htons(snum);
3049                 ad.u.net.family = family;
3050
3051                 if (family == PF_INET)
3052                         ad.u.net.v4info.saddr = addr4->sin_addr.s_addr;
3053                 else
3054                         ipv6_addr_copy(&ad.u.net.v6info.saddr, &addr6->sin6_addr);
3055
3056                 err = avc_has_perm(isec->sid, sid,
3057                                    isec->sclass, node_perm, &ad);
3058                 if (err)
3059                         goto out;
3060         }
3061 out:
3062         return err;
3063 }
3064
3065 static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
3066 {
3067         return socket_has_perm(current, sock, SOCKET__CONNECT);
3068 }
3069
3070 static int selinux_socket_listen(struct socket *sock, int backlog)
3071 {
3072         return socket_has_perm(current, sock, SOCKET__LISTEN);
3073 }
3074
3075 static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
3076 {
3077         int err;
3078         struct inode_security_struct *isec;
3079         struct inode_security_struct *newisec;
3080
3081         err = socket_has_perm(current, sock, SOCKET__ACCEPT);
3082         if (err)
3083                 return err;
3084
3085         err = inode_doinit(SOCK_INODE(newsock));
3086         if (err < 0)
3087                 return err;
3088         newisec = SOCK_INODE(newsock)->i_security;
3089
3090         isec = SOCK_INODE(sock)->i_security;
3091         newisec->sclass = isec->sclass;
3092         newisec->sid = isec->sid;
3093
3094         return 0;
3095 }
3096
3097 static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
3098                                   int size)
3099 {
3100         return socket_has_perm(current, sock, SOCKET__WRITE);
3101 }
3102
3103 static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
3104                                   int size, int flags)
3105 {
3106         return socket_has_perm(current, sock, SOCKET__READ);
3107 }
3108
3109 static int selinux_socket_getsockname(struct socket *sock)
3110 {
3111         return socket_has_perm(current, sock, SOCKET__GETATTR);
3112 }
3113
3114 static int selinux_socket_getpeername(struct socket *sock)
3115 {
3116         return socket_has_perm(current, sock, SOCKET__GETATTR);
3117 }
3118
3119 static int selinux_socket_setsockopt(struct socket *sock,int level,int optname)
3120 {
3121         return socket_has_perm(current, sock, SOCKET__SETOPT);
3122 }
3123
3124 static int selinux_socket_getsockopt(struct socket *sock, int level,
3125                                      int optname)
3126 {
3127         return socket_has_perm(current, sock, SOCKET__GETOPT);
3128 }
3129
3130 static int selinux_socket_shutdown(struct socket *sock, int how)
3131 {
3132         return socket_has_perm(current, sock, SOCKET__SHUTDOWN);
3133 }
3134
3135 static int selinux_socket_unix_stream_connect(struct socket *sock,
3136                                               struct socket *other,
3137                                               struct sock *newsk)
3138 {
3139         struct sk_security_struct *ssec;
3140         struct inode_security_struct *isec;
3141         struct inode_security_struct *other_isec;
3142         struct avc_audit_data ad;
3143         int err;
3144
3145         err = secondary_ops->unix_stream_connect(sock, other, newsk);
3146         if (err)
3147                 return err;
3148
3149         isec = SOCK_INODE(sock)->i_security;
3150         other_isec = SOCK_INODE(other)->i_security;
3151
3152         AVC_AUDIT_DATA_INIT(&ad,NET);
3153         ad.u.net.sk = other->sk;
3154
3155         err = avc_has_perm(isec->sid, other_isec->sid,
3156                            isec->sclass,
3157                            UNIX_STREAM_SOCKET__CONNECTTO, &ad);
3158         if (err)
3159                 return err;
3160
3161         /* connecting socket */
3162         ssec = sock->sk->sk_security;
3163         ssec->peer_sid = other_isec->sid;
3164         
3165         /* server child socket */
3166         ssec = newsk->sk_security;
3167         ssec->peer_sid = isec->sid;
3168         
3169         return 0;
3170 }
3171
3172 static int selinux_socket_unix_may_send(struct socket *sock,
3173                                         struct socket *other)
3174 {
3175         struct inode_security_struct *isec;
3176         struct inode_security_struct *other_isec;
3177         struct avc_audit_data ad;
3178         int err;
3179
3180         isec = SOCK_INODE(sock)->i_security;
3181         other_isec = SOCK_INODE(other)->i_security;
3182
3183         AVC_AUDIT_DATA_INIT(&ad,NET);
3184         ad.u.net.sk = other->sk;
3185
3186         err = avc_has_perm(isec->sid, other_isec->sid,
3187                            isec->sclass, SOCKET__SENDTO, &ad);
3188         if (err)
3189                 return err;
3190
3191         return 0;
3192 }
3193
3194 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
3195 {
3196         u16 family;
3197         char *addrp;
3198         int len, err = 0;
3199         u32 netif_perm, node_perm, node_sid, if_sid, recv_perm = 0;
3200         u32 sock_sid = 0;
3201         u16 sock_class = 0;
3202         struct socket *sock;
3203         struct net_device *dev;
3204         struct avc_audit_data ad;
3205
3206         family = sk->sk_family;
3207         if (family != PF_INET && family != PF_INET6)
3208                 goto out;
3209
3210         /* Handle mapped IPv4 packets arriving via IPv6 sockets */
3211         if (family == PF_INET6 && skb->protocol == ntohs(ETH_P_IP))
3212                 family = PF_INET;
3213
3214         read_lock_bh(&sk->sk_callback_lock);
3215         sock = sk->sk_socket;
3216         if (sock) {
3217                 struct inode *inode;
3218                 inode = SOCK_INODE(sock);
3219                 if (inode) {
3220                         struct inode_security_struct *isec;
3221                         isec = inode->i_security;
3222                         sock_sid = isec->sid;
3223                         sock_class = isec->sclass;
3224                 }
3225         }
3226         read_unlock_bh(&sk->sk_callback_lock);
3227         if (!sock_sid)
3228                 goto out;
3229
3230         dev = skb->dev;
3231         if (!dev)
3232                 goto out;
3233
3234         err = sel_netif_sids(dev, &if_sid, NULL);
3235         if (err)
3236                 goto out;
3237
3238         switch (sock_class) {
3239         case SECCLASS_UDP_SOCKET:
3240                 netif_perm = NETIF__UDP_RECV;
3241                 node_perm = NODE__UDP_RECV;
3242                 recv_perm = UDP_SOCKET__RECV_MSG;
3243                 break;
3244         
3245         case SECCLASS_TCP_SOCKET:
3246                 netif_perm = NETIF__TCP_RECV;
3247                 node_perm = NODE__TCP_RECV;
3248                 recv_perm = TCP_SOCKET__RECV_MSG;
3249                 break;
3250         
3251         default:
3252                 netif_perm = NETIF__RAWIP_RECV;
3253                 node_perm = NODE__RAWIP_RECV;
3254                 break;
3255         }
3256
3257         AVC_AUDIT_DATA_INIT(&ad, NET);
3258         ad.u.net.netif = dev->name;
3259         ad.u.net.family = family;
3260
3261         err = selinux_parse_skb(skb, &ad, &addrp, &len, 1);
3262         if (err)
3263                 goto out;
3264
3265         err = avc_has_perm(sock_sid, if_sid, SECCLASS_NETIF, netif_perm, &ad);
3266         if (err)
3267                 goto out;
3268         
3269         /* Fixme: this lookup is inefficient */
3270         err = security_node_sid(family, addrp, len, &node_sid);
3271         if (err)
3272                 goto out;
3273         
3274         err = avc_has_perm(sock_sid, node_sid, SECCLASS_NODE, node_perm, &ad);
3275         if (err)
3276                 goto out;
3277
3278         if (recv_perm) {
3279                 u32 port_sid;
3280
3281                 /* Fixme: make this more efficient */
3282                 err = security_port_sid(sk->sk_family, sk->sk_type,
3283                                         sk->sk_protocol, ntohs(ad.u.net.sport),
3284                                         &port_sid);
3285                 if (err)
3286                         goto out;
3287
3288                 err = avc_has_perm(sock_sid, port_sid,
3289                                    sock_class, recv_perm, &ad);
3290         }
3291 out:    
3292         return err;
3293 }
3294
3295 static int selinux_socket_getpeersec(struct socket *sock, char __user *optval,
3296                                      int __user *optlen, unsigned len)
3297 {
3298         int err = 0;
3299         char *scontext;
3300         u32 scontext_len;
3301         struct sk_security_struct *ssec;
3302         struct inode_security_struct *isec;
3303
3304         isec = SOCK_INODE(sock)->i_security;
3305         if (isec->sclass != SECCLASS_UNIX_STREAM_SOCKET) {
3306                 err = -ENOPROTOOPT;
3307                 goto out;
3308         }
3309
3310         ssec = sock->sk->sk_security;
3311         
3312         err = security_sid_to_context(ssec->peer_sid, &scontext, &scontext_len);
3313         if (err)
3314                 goto out;
3315
3316         if (scontext_len > len) {
3317                 err = -ERANGE;
3318                 goto out_len;
3319         }
3320
3321         if (copy_to_user(optval, scontext, scontext_len))
3322                 err = -EFAULT;
3323
3324 out_len:
3325         if (put_user(scontext_len, optlen))
3326                 err = -EFAULT;
3327
3328         kfree(scontext);
3329 out:    
3330         return err;
3331 }
3332
3333 static int selinux_sk_alloc_security(struct sock *sk, int family, int priority)
3334 {
3335         return sk_alloc_security(sk, family, priority);
3336 }
3337
3338 static void selinux_sk_free_security(struct sock *sk)
3339 {
3340         sk_free_security(sk);
3341 }
3342
3343 static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
3344 {
3345         int err = 0;
3346         u32 perm;
3347         struct nlmsghdr *nlh;
3348         struct socket *sock = sk->sk_socket;
3349         struct inode_security_struct *isec = SOCK_INODE(sock)->i_security;
3350         
3351         if (skb->len < NLMSG_SPACE(0)) {
3352                 err = -EINVAL;
3353                 goto out;
3354         }
3355         nlh = (struct nlmsghdr *)skb->data;
3356         
3357         err = selinux_nlmsg_lookup(isec->sclass, nlh->nlmsg_type, &perm);
3358         if (err) {
3359                 /* Ignore */
3360                 if (err == -ENOENT)
3361                         err = 0;
3362                 goto out;
3363         }
3364
3365         err = socket_has_perm(current, sock, perm);
3366 out:
3367         return err;
3368 }
3369
3370 #ifdef CONFIG_NETFILTER
3371
3372 static unsigned int selinux_ip_postroute_last(unsigned int hooknum,
3373                                               struct sk_buff **pskb,
3374                                               const struct net_device *in,
3375                                               const struct net_device *out,
3376                                               int (*okfn)(struct sk_buff *),
3377                                               u16 family)
3378 {
3379         char *addrp;
3380         int len, err = NF_ACCEPT;
3381         u32 netif_perm, node_perm, node_sid, if_sid, send_perm = 0;
3382         struct sock *sk;
3383         struct socket *sock;
3384         struct inode *inode;
3385         struct sk_buff *skb = *pskb;
3386         struct inode_security_struct *isec;
3387         struct avc_audit_data ad;
3388         struct net_device *dev = (struct net_device *)out;
3389         
3390         sk = skb->sk;
3391         if (!sk)
3392                 goto out;
3393                 
3394         sock = sk->sk_socket;
3395         if (!sock)
3396                 goto out;
3397                 
3398         inode = SOCK_INODE(sock);
3399         if (!inode)
3400                 goto out;
3401
3402         err = sel_netif_sids(dev, &if_sid, NULL);
3403         if (err)
3404                 goto out;
3405
3406         isec = inode->i_security;
3407         
3408         switch (isec->sclass) {
3409         case SECCLASS_UDP_SOCKET:
3410                 netif_perm = NETIF__UDP_SEND;
3411                 node_perm = NODE__UDP_SEND;
3412                 send_perm = UDP_SOCKET__SEND_MSG;
3413                 break;
3414         
3415         case SECCLASS_TCP_SOCKET:
3416                 netif_perm = NETIF__TCP_SEND;
3417                 node_perm = NODE__TCP_SEND;
3418                 send_perm = TCP_SOCKET__SEND_MSG;
3419                 break;
3420         
3421         default:
3422                 netif_perm = NETIF__RAWIP_SEND;
3423                 node_perm = NODE__RAWIP_SEND;
3424                 break;
3425         }
3426
3427
3428         AVC_AUDIT_DATA_INIT(&ad, NET);
3429         ad.u.net.netif = dev->name;
3430         ad.u.net.family = family;
3431
3432         err = selinux_parse_skb(skb, &ad, &addrp,
3433                                 &len, 0) ? NF_DROP : NF_ACCEPT;
3434         if (err != NF_ACCEPT)
3435                 goto out;
3436
3437         err = avc_has_perm(isec->sid, if_sid, SECCLASS_NETIF,
3438                            netif_perm, &ad) ? NF_DROP : NF_ACCEPT;
3439         if (err != NF_ACCEPT)
3440                 goto out;
3441                 
3442         /* Fixme: this lookup is inefficient */
3443         err = security_node_sid(family, addrp, len,
3444                                 &node_sid) ? NF_DROP : NF_ACCEPT;
3445         if (err != NF_ACCEPT)
3446                 goto out;
3447         
3448         err = avc_has_perm(isec->sid, node_sid, SECCLASS_NODE,
3449                            node_perm, &ad) ? NF_DROP : NF_ACCEPT;
3450         if (err != NF_ACCEPT)
3451                 goto out;
3452
3453         if (send_perm) {
3454                 u32 port_sid;
3455                 
3456                 /* Fixme: make this more efficient */
3457                 err = security_port_sid(sk->sk_family,
3458                                         sk->sk_type,
3459                                         sk->sk_protocol,
3460                                         ntohs(ad.u.net.dport),
3461                                         &port_sid) ? NF_DROP : NF_ACCEPT;
3462                 if (err != NF_ACCEPT)
3463                         goto out;
3464
3465                 err = avc_has_perm(isec->sid, port_sid, isec->sclass,
3466                                    send_perm, &ad) ? NF_DROP : NF_ACCEPT;
3467         }
3468
3469 out:
3470         return err;
3471 }
3472
3473 static unsigned int selinux_ipv4_postroute_last(unsigned int hooknum,
3474                                                 struct sk_buff **pskb,
3475                                                 const struct net_device *in,
3476                                                 const struct net_device *out,
3477                                                 int (*okfn)(struct sk_buff *))
3478 {
3479         return selinux_ip_postroute_last(hooknum, pskb, in, out, okfn, PF_INET);
3480 }
3481
3482 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3483
3484 static unsigned int selinux_ipv6_postroute_last(unsigned int hooknum,
3485                                                 struct sk_buff **pskb,
3486                                                 const struct net_device *in,
3487                                                 const struct net_device *out,
3488                                                 int (*okfn)(struct sk_buff *))
3489 {
3490         return selinux_ip_postroute_last(hooknum, pskb, in, out, okfn, PF_INET6);
3491 }
3492
3493 #endif  /* IPV6 */
3494
3495 #endif  /* CONFIG_NETFILTER */
3496
3497 #else
3498
3499 static inline int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
3500 {
3501         return 0;
3502 }
3503
3504 #endif  /* CONFIG_SECURITY_NETWORK */
3505
3506 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
3507 {
3508         struct task_security_struct *tsec;
3509         struct av_decision avd;
3510         int err;
3511
3512         err = secondary_ops->netlink_send(sk, skb);
3513         if (err)
3514                 return err;
3515
3516         tsec = current->security;
3517
3518         avd.allowed = 0;
3519         avc_has_perm_noaudit(tsec->sid, tsec->sid,
3520                                 SECCLASS_CAPABILITY, ~0, &avd);
3521         cap_mask(NETLINK_CB(skb).eff_cap, avd.allowed);
3522
3523         if (policydb_loaded_version >= POLICYDB_VERSION_NLCLASS)
3524                 err = selinux_nlmsg_perm(sk, skb);
3525
3526         return err;
3527 }
3528
3529 static int selinux_netlink_recv(struct sk_buff *skb)
3530 {
3531         if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN))
3532                 return -EPERM;
3533         return 0;
3534 }
3535
3536 static int ipc_alloc_security(struct task_struct *task,
3537                               struct kern_ipc_perm *perm,
3538                               u16 sclass)
3539 {
3540         struct task_security_struct *tsec = task->security;
3541         struct ipc_security_struct *isec;
3542
3543         isec = kmalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
3544         if (!isec)
3545                 return -ENOMEM;
3546
3547         memset(isec, 0, sizeof(struct ipc_security_struct));
3548         isec->magic = SELINUX_MAGIC;
3549         isec->sclass = sclass;
3550         isec->ipc_perm = perm;
3551         if (tsec) {
3552                 isec->sid = tsec->sid;
3553         } else {
3554                 isec->sid = SECINITSID_UNLABELED;
3555         }
3556         perm->security = isec;
3557
3558         return 0;
3559 }
3560
3561 static void ipc_free_security(struct kern_ipc_perm *perm)
3562 {
3563         struct ipc_security_struct *isec = perm->security;
3564         if (!isec || isec->magic != SELINUX_MAGIC)
3565                 return;
3566
3567         perm->security = NULL;
3568         kfree(isec);
3569 }
3570
3571 static int msg_msg_alloc_security(struct msg_msg *msg)
3572 {
3573         struct msg_security_struct *msec;
3574
3575         msec = kmalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
3576         if (!msec)
3577                 return -ENOMEM;
3578
3579         memset(msec, 0, sizeof(struct msg_security_struct));
3580         msec->magic = SELINUX_MAGIC;
3581         msec->msg = msg;
3582         msec->sid = SECINITSID_UNLABELED;
3583         msg->security = msec;
3584
3585         return 0;
3586 }
3587
3588 static void msg_msg_free_security(struct msg_msg *msg)
3589 {
3590         struct msg_security_struct *msec = msg->security;
3591         if (!msec || msec->magic != SELINUX_MAGIC)
3592                 return;
3593
3594         msg->security = NULL;
3595         kfree(msec);
3596 }
3597
3598 static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
3599                         u16 sclass, u32 perms)
3600 {
3601         struct task_security_struct *tsec;
3602         struct ipc_security_struct *isec;
3603         struct avc_audit_data ad;
3604
3605         tsec = current->security;
3606         isec = ipc_perms->security;
3607
3608         AVC_AUDIT_DATA_INIT(&ad, IPC);
3609         ad.u.ipc_id = ipc_perms->key;
3610
3611         return avc_has_perm(tsec->sid, isec->sid, sclass, perms, &ad);
3612 }
3613
3614 static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
3615 {
3616         return msg_msg_alloc_security(msg);
3617 }
3618
3619 static void selinux_msg_msg_free_security(struct msg_msg *msg)
3620 {
3621         msg_msg_free_security(msg);
3622 }
3623
3624 /* message queue security operations */
3625 static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
3626 {
3627         struct task_security_struct *tsec;
3628         struct ipc_security_struct *isec;
3629         struct avc_audit_data ad;
3630         int rc;
3631
3632         rc = ipc_alloc_security(current, &msq->q_perm, SECCLASS_MSGQ);
3633         if (rc)
3634                 return rc;
3635
3636         tsec = current->security;
3637         isec = msq->q_perm.security;
3638
3639         AVC_AUDIT_DATA_INIT(&ad, IPC);
3640         ad.u.ipc_id = msq->q_perm.key;
3641
3642         rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
3643                           MSGQ__CREATE, &ad);
3644         if (rc) {
3645                 ipc_free_security(&msq->q_perm);
3646                 return rc;
3647         }
3648         return 0;
3649 }
3650
3651 static void selinux_msg_queue_free_security(struct msg_queue *msq)
3652 {
3653         ipc_free_security(&msq->q_perm);
3654 }
3655
3656 static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
3657 {
3658         struct task_security_struct *tsec;
3659         struct ipc_security_struct *isec;
3660         struct avc_audit_data ad;
3661
3662         tsec = current->security;
3663         isec = msq->q_perm.security;
3664
3665         AVC_AUDIT_DATA_INIT(&ad, IPC);
3666         ad.u.ipc_id = msq->q_perm.key;
3667
3668         return avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
3669                             MSGQ__ASSOCIATE, &ad);
3670 }
3671
3672 static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
3673 {
3674         int err;
3675         int perms;
3676
3677         switch(cmd) {
3678         case IPC_INFO:
3679         case MSG_INFO:
3680                 /* No specific object, just general system-wide information. */
3681                 return task_has_system(current, SYSTEM__IPC_INFO);
3682         case IPC_STAT:
3683         case MSG_STAT:
3684                 perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
3685                 break;
3686         case IPC_SET:
3687                 perms = MSGQ__SETATTR;
3688                 break;
3689         case IPC_RMID:
3690                 perms = MSGQ__DESTROY;
3691                 break;
3692         default:
3693                 return 0;
3694         }
3695
3696         err = ipc_has_perm(&msq->q_perm, SECCLASS_MSGQ, perms);
3697         return err;
3698 }
3699
3700 static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
3701 {
3702         struct task_security_struct *tsec;
3703         struct ipc_security_struct *isec;
3704         struct msg_security_struct *msec;
3705         struct avc_audit_data ad;
3706         int rc;
3707
3708         tsec = current->security;
3709         isec = msq->q_perm.security;
3710         msec = msg->security;
3711
3712         /*
3713          * First time through, need to assign label to the message
3714          */
3715         if (msec->sid == SECINITSID_UNLABELED) {
3716                 /*
3717                  * Compute new sid based on current process and
3718                  * message queue this message will be stored in
3719                  */
3720                 rc = security_transition_sid(tsec->sid,
3721                                              isec->sid,
3722                                              SECCLASS_MSG,
3723                                              &msec->sid);
3724                 if (rc)
3725                         return rc;
3726         }
3727
3728         AVC_AUDIT_DATA_INIT(&ad, IPC);
3729         ad.u.ipc_id = msq->q_perm.key;
3730
3731         /* Can this process write to the queue? */
3732         rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
3733                           MSGQ__WRITE, &ad);
3734         if (!rc)
3735                 /* Can this process send the message */
3736                 rc = avc_has_perm(tsec->sid, msec->sid,
3737                                   SECCLASS_MSG, MSG__SEND, &ad);
3738         if (!rc)
3739                 /* Can the message be put in the queue? */
3740                 rc = avc_has_perm(msec->sid, isec->sid,
3741                                   SECCLASS_MSGQ, MSGQ__ENQUEUE, &ad);
3742
3743         return rc;
3744 }
3745
3746 static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
3747                                     struct task_struct *target,
3748                                     long type, int mode)
3749 {
3750         struct task_security_struct *tsec;
3751         struct ipc_security_struct *isec;
3752         struct msg_security_struct *msec;
3753         struct avc_audit_data ad;
3754         int rc;
3755
3756         tsec = target->security;
3757         isec = msq->q_perm.security;
3758         msec = msg->security;
3759
3760         AVC_AUDIT_DATA_INIT(&ad, IPC);
3761         ad.u.ipc_id = msq->q_perm.key;
3762
3763         rc = avc_has_perm(tsec->sid, isec->sid,
3764                           SECCLASS_MSGQ, MSGQ__READ, &ad);
3765         if (!rc)
3766                 rc = avc_has_perm(tsec->sid, msec->sid,
3767                                   SECCLASS_MSG, MSG__RECEIVE, &ad);
3768         return rc;
3769 }
3770
3771 /* Shared Memory security operations */
3772 static int selinux_shm_alloc_security(struct shmid_kernel *shp)
3773 {
3774         struct task_security_struct *tsec;
3775         struct ipc_security_struct *isec;
3776         struct avc_audit_data ad;
3777         int rc;
3778
3779         rc = ipc_alloc_security(current, &shp->shm_perm, SECCLASS_SHM);
3780         if (rc)
3781                 return rc;
3782
3783         tsec = current->security;
3784         isec = shp->shm_perm.security;
3785
3786         AVC_AUDIT_DATA_INIT(&ad, IPC);
3787         ad.u.ipc_id = shp->shm_perm.key;
3788
3789         rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_SHM,
3790                           SHM__CREATE, &ad);
3791         if (rc) {
3792                 ipc_free_security(&shp->shm_perm);
3793                 return rc;
3794         }
3795         return 0;
3796 }
3797
3798 static void selinux_shm_free_security(struct shmid_kernel *shp)
3799 {
3800         ipc_free_security(&shp->shm_perm);
3801 }
3802
3803 static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
3804 {
3805         struct task_security_struct *tsec;
3806         struct ipc_security_struct *isec;
3807         struct avc_audit_data ad;
3808
3809         tsec = current->security;
3810         isec = shp->shm_perm.security;
3811
3812         AVC_AUDIT_DATA_INIT(&ad, IPC);
3813         ad.u.ipc_id = shp->shm_perm.key;
3814
3815         return avc_has_perm(tsec->sid, isec->sid, SECCLASS_SHM,
3816                             SHM__ASSOCIATE, &ad);
3817 }
3818
3819 /* Note, at this point, shp is locked down */
3820 static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
3821 {
3822         int perms;
3823         int err;
3824
3825         switch(cmd) {
3826         case IPC_INFO:
3827         case SHM_INFO:
3828                 /* No specific object, just general system-wide information. */
3829                 return task_has_system(current, SYSTEM__IPC_INFO);
3830         case IPC_STAT:
3831         case SHM_STAT:
3832                 perms = SHM__GETATTR | SHM__ASSOCIATE;
3833                 break;
3834         case IPC_SET:
3835                 perms = SHM__SETATTR;
3836                 break;
3837         case SHM_LOCK:
3838         case SHM_UNLOCK:
3839                 perms = SHM__LOCK;
3840                 break;
3841         case IPC_RMID:
3842                 perms = SHM__DESTROY;
3843                 break;
3844         default:
3845                 return 0;
3846         }
3847
3848         err = ipc_has_perm(&shp->shm_perm, SECCLASS_SHM, perms);
3849         return err;
3850 }
3851
3852 static int selinux_shm_shmat(struct shmid_kernel *shp,
3853                              char __user *shmaddr, int shmflg)
3854 {
3855         u32 perms;
3856         int rc;
3857
3858         rc = secondary_ops->shm_shmat(shp, shmaddr, shmflg);
3859         if (rc)
3860                 return rc;
3861
3862         if (shmflg & SHM_RDONLY)
3863                 perms = SHM__READ;
3864         else
3865                 perms = SHM__READ | SHM__WRITE;
3866
3867         return ipc_has_perm(&shp->shm_perm, SECCLASS_SHM, perms);
3868 }
3869
3870 /* Semaphore security operations */
3871 static int selinux_sem_alloc_security(struct sem_array *sma)
3872 {
3873         struct task_security_struct *tsec;
3874         struct ipc_security_struct *isec;
3875         struct avc_audit_data ad;
3876         int rc;
3877
3878         rc = ipc_alloc_security(current, &sma->sem_perm, SECCLASS_SEM);
3879         if (rc)
3880                 return rc;
3881
3882         tsec = current->security;
3883         isec = sma->sem_perm.security;
3884
3885         AVC_AUDIT_DATA_INIT(&ad, IPC);
3886         ad.u.ipc_id = sma->sem_perm.key;
3887
3888         rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_SEM,
3889                           SEM__CREATE, &ad);
3890         if (rc) {
3891                 ipc_free_security(&sma->sem_perm);
3892                 return rc;
3893         }
3894         return 0;
3895 }
3896
3897 static void selinux_sem_free_security(struct sem_array *sma)
3898 {
3899         ipc_free_security(&sma->sem_perm);
3900 }
3901
3902 static int selinux_sem_associate(struct sem_array *sma, int semflg)
3903 {
3904         struct task_security_struct *tsec;
3905         struct ipc_security_struct *isec;
3906         struct avc_audit_data ad;
3907
3908         tsec = current->security;
3909         isec = sma->sem_perm.security;
3910
3911         AVC_AUDIT_DATA_INIT(&ad, IPC);
3912         ad.u.ipc_id = sma->sem_perm.key;
3913
3914         return avc_has_perm(tsec->sid, isec->sid, SECCLASS_SEM,
3915                             SEM__ASSOCIATE, &ad);
3916 }
3917
3918 /* Note, at this point, sma is locked down */
3919 static int selinux_sem_semctl(struct sem_array *sma, int cmd)
3920 {
3921         int err;
3922         u32 perms;
3923
3924         switch(cmd) {
3925         case IPC_INFO:
3926         case SEM_INFO:
3927                 /* No specific object, just general system-wide information. */
3928                 return task_has_system(current, SYSTEM__IPC_INFO);
3929         case GETPID:
3930         case GETNCNT:
3931         case GETZCNT:
3932                 perms = SEM__GETATTR;
3933                 break;
3934         case GETVAL:
3935         case GETALL:
3936                 perms = SEM__READ;
3937                 break;
3938         case SETVAL:
3939         case SETALL:
3940                 perms = SEM__WRITE;
3941                 break;
3942         case IPC_RMID:
3943                 perms = SEM__DESTROY;
3944                 break;
3945         case IPC_SET:
3946                 perms = SEM__SETATTR;
3947                 break;
3948         case IPC_STAT:
3949         case SEM_STAT:
3950                 perms = SEM__GETATTR | SEM__ASSOCIATE;
3951                 break;
3952         default:
3953                 return 0;
3954         }
3955
3956         err = ipc_has_perm(&sma->sem_perm, SECCLASS_SEM, perms);
3957         return err;
3958 }
3959
3960 static int selinux_sem_semop(struct sem_array *sma,
3961                              struct sembuf *sops, unsigned nsops, int alter)
3962 {
3963         u32 perms;
3964
3965         if (alter)
3966                 perms = SEM__READ | SEM__WRITE;
3967         else
3968                 perms = SEM__READ;
3969
3970         return ipc_has_perm(&sma->sem_perm, SECCLASS_SEM, perms);
3971 }
3972
3973 static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
3974 {
3975         struct ipc_security_struct *isec = ipcp->security;
3976         u16 sclass = SECCLASS_IPC;
3977         u32 av = 0;
3978
3979         if (isec && isec->magic == SELINUX_MAGIC)
3980                 sclass = isec->sclass;
3981
3982         av = 0;
3983         if (flag & S_IRUGO)
3984                 av |= IPC__UNIX_READ;
3985         if (flag & S_IWUGO)
3986                 av |= IPC__UNIX_WRITE;
3987
3988         if (av == 0)
3989                 return 0;
3990
3991         return ipc_has_perm(ipcp, sclass, av);
3992 }
3993
3994 /* module stacking operations */
3995 int selinux_register_security (const char *name, struct security_operations *ops)
3996 {
3997         if (secondary_ops != original_ops) {
3998                 printk(KERN_INFO "%s:  There is already a secondary security "
3999                        "module registered.\n", __FUNCTION__);
4000                 return -EINVAL;
4001         }
4002
4003         secondary_ops = ops;
4004
4005         printk(KERN_INFO "%s:  Registering secondary module %s\n",
4006                __FUNCTION__,
4007                name);
4008
4009         return 0;
4010 }
4011
4012 int selinux_unregister_security (const char *name, struct security_operations *ops)
4013 {
4014         if (ops != secondary_ops) {
4015                 printk (KERN_INFO "%s:  trying to unregister a security module "
4016                         "that is not registered.\n", __FUNCTION__);
4017                 return -EINVAL;
4018         }
4019
4020         secondary_ops = original_ops;
4021
4022         return 0;
4023 }
4024
4025 static void selinux_d_instantiate (struct dentry *dentry, struct inode *inode)
4026 {
4027         if (inode)
4028                 inode_doinit_with_dentry(inode, dentry);
4029 }
4030
4031 static int selinux_getprocattr(struct task_struct *p,
4032                                char *name, void *value, size_t size)
4033 {
4034         struct task_security_struct *tsec;
4035         u32 sid, len;
4036         char *context;
4037         int error;
4038
4039         if (current != p) {
4040                 error = task_has_perm(current, p, PROCESS__GETATTR);
4041                 if (error)
4042                         return error;
4043         }
4044
4045         if (!size)
4046                 return -ERANGE;
4047
4048         tsec = p->security;
4049
4050         if (!strcmp(name, "current"))
4051                 sid = tsec->sid;
4052         else if (!strcmp(name, "prev"))
4053                 sid = tsec->osid;
4054         else if (!strcmp(name, "exec"))
4055                 sid = tsec->exec_sid;
4056         else if (!strcmp(name, "fscreate"))
4057                 sid = tsec->create_sid;
4058         else
4059                 return -EINVAL;
4060
4061         if (!sid)
4062                 return 0;
4063
4064         error = security_sid_to_context(sid, &context, &len);
4065         if (error)
4066                 return error;
4067         if (len > size) {
4068                 kfree(context);
4069                 return -ERANGE;
4070         }
4071         memcpy(value, context, len);
4072         kfree(context);
4073         return len;
4074 }
4075
4076 static int selinux_setprocattr(struct task_struct *p,
4077                                char *name, void *value, size_t size)
4078 {
4079         struct task_security_struct *tsec;
4080         u32 sid = 0;
4081         int error;
4082
4083         if (current != p) {
4084                 /* SELinux only allows a process to change its own
4085                    security attributes. */
4086                 return -EACCES;
4087         }
4088
4089         /*
4090          * Basic control over ability to set these attributes at all.
4091          * current == p, but we'll pass them separately in case the
4092          * above restriction is ever removed.
4093          */
4094         if (!strcmp(name, "exec"))
4095                 error = task_has_perm(current, p, PROCESS__SETEXEC);
4096         else if (!strcmp(name, "fscreate"))
4097                 error = task_has_perm(current, p, PROCESS__SETFSCREATE);
4098         else if (!strcmp(name, "current"))
4099                 error = task_has_perm(current, p, PROCESS__SETCURRENT);
4100         else
4101                 error = -EINVAL;
4102         if (error)
4103                 return error;
4104
4105         /* Obtain a SID for the context, if one was specified. */
4106         if (size) {
4107                 int error;
4108                 error = security_context_to_sid(value, size, &sid);
4109                 if (error)
4110                         return error;
4111         }
4112
4113         /* Permission checking based on the specified context is
4114            performed during the actual operation (execve,
4115            open/mkdir/...), when we know the full context of the
4116            operation.  See selinux_bprm_set_security for the execve
4117            checks and may_create for the file creation checks. The
4118            operation will then fail if the context is not permitted. */
4119         tsec = p->security;
4120         if (!strcmp(name, "exec"))
4121                 tsec->exec_sid = sid;
4122         else if (!strcmp(name, "fscreate"))
4123                 tsec->create_sid = sid;
4124         else if (!strcmp(name, "current")) {
4125                 struct av_decision avd;
4126
4127                 if (sid == 0)
4128                         return -EINVAL;
4129
4130                 /* Only allow single threaded processes to change context */
4131                 if (atomic_read(&p->mm->mm_users) != 1) {
4132                         struct task_struct *g, *t;
4133                         struct mm_struct *mm = p->mm;
4134                         read_lock(&tasklist_lock);
4135                         do_each_thread(g, t)
4136                                 if (t->mm == mm && t != p) {
4137                                         read_unlock(&tasklist_lock);
4138                                         return -EPERM;
4139                                 }
4140                         while_each_thread(g, t);
4141                         read_unlock(&tasklist_lock);
4142                 }
4143
4144                 /* Check permissions for the transition. */
4145                 error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
4146                                      PROCESS__DYNTRANSITION, NULL);
4147                 if (error)
4148                         return error;
4149
4150                 /* Check for ptracing, and update the task SID if ok.
4151                    Otherwise, leave SID unchanged and fail. */
4152                 task_lock(p);
4153                 if (p->ptrace & PT_PTRACED) {
4154                         error = avc_has_perm_noaudit(tsec->ptrace_sid, sid,
4155                                                      SECCLASS_PROCESS,
4156                                                      PROCESS__PTRACE, &avd);
4157                         if (!error)
4158                                 tsec->sid = sid;
4159                         task_unlock(p);
4160                         avc_audit(tsec->ptrace_sid, sid, SECCLASS_PROCESS,
4161                                   PROCESS__PTRACE, &avd, error, NULL);
4162                         if (error)
4163                                 return error;
4164                 } else {
4165                         tsec->sid = sid;
4166                         task_unlock(p);
4167                 }
4168         }
4169         else
4170                 return -EINVAL;
4171
4172         return size;
4173 }
4174
4175 struct security_operations selinux_ops = {
4176         .ptrace =                       selinux_ptrace,
4177         .capget =                       selinux_capget,
4178         .capset_check =                 selinux_capset_check,
4179         .capset_set =                   selinux_capset_set,
4180         .sysctl =                       selinux_sysctl,
4181         .capable =                      selinux_capable,
4182         .quotactl =                     selinux_quotactl,
4183         .quota_on =                     selinux_quota_on,
4184         .syslog =                       selinux_syslog,
4185         .vm_enough_memory =             selinux_vm_enough_memory,
4186
4187         .netlink_send =                 selinux_netlink_send,
4188         .netlink_recv =                 selinux_netlink_recv,
4189
4190         .bprm_alloc_security =          selinux_bprm_alloc_security,
4191         .bprm_free_security =           selinux_bprm_free_security,
4192         .bprm_apply_creds =             selinux_bprm_apply_creds,
4193         .bprm_post_apply_creds =        selinux_bprm_post_apply_creds,
4194         .bprm_set_security =            selinux_bprm_set_security,
4195         .bprm_check_security =          selinux_bprm_check_security,
4196         .bprm_secureexec =              selinux_bprm_secureexec,
4197
4198         .sb_alloc_security =            selinux_sb_alloc_security,
4199         .sb_free_security =             selinux_sb_free_security,
4200         .sb_copy_data =                 selinux_sb_copy_data,
4201         .sb_kern_mount =                selinux_sb_kern_mount,
4202         .sb_statfs =                    selinux_sb_statfs,
4203         .sb_mount =                     selinux_mount,
4204         .sb_umount =                    selinux_umount,
4205
4206         .inode_alloc_security =         selinux_inode_alloc_security,
4207         .inode_free_security =          selinux_inode_free_security,
4208         .inode_create =                 selinux_inode_create,
4209         .inode_post_create =            selinux_inode_post_create,
4210         .inode_link =                   selinux_inode_link,
4211         .inode_post_link =              selinux_inode_post_link,
4212         .inode_unlink =                 selinux_inode_unlink,
4213         .inode_symlink =                selinux_inode_symlink,
4214         .inode_post_symlink =           selinux_inode_post_symlink,
4215         .inode_mkdir =                  selinux_inode_mkdir,
4216         .inode_post_mkdir =             selinux_inode_post_mkdir,
4217         .inode_rmdir =                  selinux_inode_rmdir,
4218         .inode_mknod =                  selinux_inode_mknod,
4219         .inode_post_mknod =             selinux_inode_post_mknod,
4220         .inode_rename =                 selinux_inode_rename,
4221         .inode_post_rename =            selinux_inode_post_rename,
4222         .inode_readlink =               selinux_inode_readlink,
4223         .inode_follow_link =            selinux_inode_follow_link,
4224         .inode_permission =             selinux_inode_permission,
4225         .inode_setattr =                selinux_inode_setattr,
4226         .inode_getattr =                selinux_inode_getattr,
4227         .inode_setxattr =               selinux_inode_setxattr,
4228         .inode_post_setxattr =          selinux_inode_post_setxattr,
4229         .inode_getxattr =               selinux_inode_getxattr,
4230         .inode_listxattr =              selinux_inode_listxattr,
4231         .inode_removexattr =            selinux_inode_removexattr,
4232         .inode_getsecurity =            selinux_inode_getsecurity,
4233         .inode_setsecurity =            selinux_inode_setsecurity,
4234         .inode_listsecurity =           selinux_inode_listsecurity,
4235
4236         .file_permission =              selinux_file_permission,
4237         .file_alloc_security =          selinux_file_alloc_security,
4238         .file_free_security =           selinux_file_free_security,
4239         .file_ioctl =                   selinux_file_ioctl,
4240         .file_mmap =                    selinux_file_mmap,
4241         .file_mprotect =                selinux_file_mprotect,
4242         .file_lock =                    selinux_file_lock,
4243         .file_fcntl =                   selinux_file_fcntl,
4244         .file_set_fowner =              selinux_file_set_fowner,
4245         .file_send_sigiotask =          selinux_file_send_sigiotask,
4246         .file_receive =                 selinux_file_receive,
4247
4248         .task_create =                  selinux_task_create,
4249         .task_alloc_security =          selinux_task_alloc_security,
4250         .task_free_security =           selinux_task_free_security,
4251         .task_setuid =                  selinux_task_setuid,
4252         .task_post_setuid =             selinux_task_post_setuid,
4253         .task_setgid =                  selinux_task_setgid,
4254         .task_setpgid =                 selinux_task_setpgid,
4255         .task_getpgid =                 selinux_task_getpgid,
4256         .task_getsid =                  selinux_task_getsid,
4257         .task_setgroups =               selinux_task_setgroups,
4258         .task_setnice =                 selinux_task_setnice,
4259         .task_setrlimit =               selinux_task_setrlimit,
4260         .task_setscheduler =            selinux_task_setscheduler,
4261         .task_getscheduler =            selinux_task_getscheduler,
4262         .task_kill =                    selinux_task_kill,
4263         .task_wait =                    selinux_task_wait,
4264         .task_prctl =                   selinux_task_prctl,
4265         .task_reparent_to_init =        selinux_task_reparent_to_init,
4266         .task_to_inode =                selinux_task_to_inode,
4267
4268         .ipc_permission =               selinux_ipc_permission,
4269
4270         .msg_msg_alloc_security =       selinux_msg_msg_alloc_security,
4271         .msg_msg_free_security =        selinux_msg_msg_free_security,
4272
4273         .msg_queue_alloc_security =     selinux_msg_queue_alloc_security,
4274         .msg_queue_free_security =      selinux_msg_queue_free_security,
4275         .msg_queue_associate =          selinux_msg_queue_associate,
4276         .msg_queue_msgctl =             selinux_msg_queue_msgctl,
4277         .msg_queue_msgsnd =             selinux_msg_queue_msgsnd,
4278         .msg_queue_msgrcv =             selinux_msg_queue_msgrcv,
4279
4280         .shm_alloc_security =           selinux_shm_alloc_security,
4281         .shm_free_security =            selinux_shm_free_security,
4282         .shm_associate =                selinux_shm_associate,
4283         .shm_shmctl =                   selinux_shm_shmctl,
4284         .shm_shmat =                    selinux_shm_shmat,
4285
4286         .sem_alloc_security =           selinux_sem_alloc_security,
4287         .sem_free_security =            selinux_sem_free_security,
4288         .sem_associate =                selinux_sem_associate,
4289         .sem_semctl =                   selinux_sem_semctl,
4290         .sem_semop =                    selinux_sem_semop,
4291
4292         .register_security =            selinux_register_security,
4293         .unregister_security =          selinux_unregister_security,
4294
4295         .d_instantiate =                selinux_d_instantiate,
4296
4297         .getprocattr =                  selinux_getprocattr,
4298         .setprocattr =                  selinux_setprocattr,
4299
4300 #ifdef CONFIG_SECURITY_NETWORK
4301         .unix_stream_connect =          selinux_socket_unix_stream_connect,
4302         .unix_may_send =                selinux_socket_unix_may_send,
4303
4304         .socket_create =                selinux_socket_create,
4305         .socket_post_create =           selinux_socket_post_create,
4306         .socket_bind =                  selinux_socket_bind,
4307         .socket_connect =               selinux_socket_connect,
4308         .socket_listen =                selinux_socket_listen,
4309         .socket_accept =                selinux_socket_accept,
4310         .socket_sendmsg =               selinux_socket_sendmsg,
4311         .socket_recvmsg =               selinux_socket_recvmsg,
4312         .socket_getsockname =           selinux_socket_getsockname,
4313         .socket_getpeername =           selinux_socket_getpeername,
4314         .socket_getsockopt =            selinux_socket_getsockopt,
4315         .socket_setsockopt =            selinux_socket_setsockopt,
4316         .socket_shutdown =              selinux_socket_shutdown,
4317         .socket_sock_rcv_skb =          selinux_socket_sock_rcv_skb,
4318         .socket_getpeersec =            selinux_socket_getpeersec,
4319         .sk_alloc_security =            selinux_sk_alloc_security,
4320         .sk_free_security =             selinux_sk_free_security,
4321 #endif
4322 };
4323
4324 __init int selinux_init(void)
4325 {
4326         struct task_security_struct *tsec;
4327
4328         if (!selinux_enabled) {
4329                 printk(KERN_INFO "SELinux:  Disabled at boot.\n");
4330                 return 0;
4331         }
4332
4333         printk(KERN_INFO "SELinux:  Initializing.\n");
4334
4335         /* Set the security state for the initial task. */
4336         if (task_alloc_security(current))
4337                 panic("SELinux:  Failed to initialize initial task.\n");
4338         tsec = current->security;
4339         tsec->osid = tsec->sid = SECINITSID_KERNEL;
4340
4341         avc_init();
4342
4343         original_ops = secondary_ops = security_ops;
4344         if (!secondary_ops)
4345                 panic ("SELinux: No initial security operations\n");
4346         if (register_security (&selinux_ops))
4347                 panic("SELinux: Unable to register with kernel.\n");
4348
4349         if (selinux_enforcing) {
4350                 printk(KERN_INFO "SELinux:  Starting in enforcing mode\n");
4351         } else {
4352                 printk(KERN_INFO "SELinux:  Starting in permissive mode\n");
4353         }
4354         return 0;
4355 }
4356
4357 void selinux_complete_init(void)
4358 {
4359         printk(KERN_INFO "SELinux:  Completing initialization.\n");
4360
4361         /* Set up any superblocks initialized prior to the policy load. */
4362         printk(KERN_INFO "SELinux:  Setting up existing superblocks.\n");
4363         spin_lock(&sb_security_lock);
4364 next_sb:
4365         if (!list_empty(&superblock_security_head)) {
4366                 struct superblock_security_struct *sbsec =
4367                                 list_entry(superblock_security_head.next,
4368                                            struct superblock_security_struct,
4369                                            list);
4370                 struct super_block *sb = sbsec->sb;
4371                 spin_lock(&sb_lock);
4372                 sb->s_count++;
4373                 spin_unlock(&sb_lock);
4374                 spin_unlock(&sb_security_lock);
4375                 down_read(&sb->s_umount);
4376                 if (sb->s_root)
4377                         superblock_doinit(sb, NULL);
4378                 drop_super(sb);
4379                 spin_lock(&sb_security_lock);
4380                 list_del_init(&sbsec->list);
4381                 goto next_sb;
4382         }
4383         spin_unlock(&sb_security_lock);
4384 }
4385
4386 /* SELinux requires early initialization in order to label
4387    all processes and objects when they are created. */
4388 security_initcall(selinux_init);
4389
4390 #if defined(CONFIG_SECURITY_NETWORK) && defined(CONFIG_NETFILTER)
4391
4392 static struct nf_hook_ops selinux_ipv4_op = {
4393         .hook =         selinux_ipv4_postroute_last,
4394         .owner =        THIS_MODULE,
4395         .pf =           PF_INET,
4396         .hooknum =      NF_IP_POST_ROUTING,
4397         .priority =     NF_IP_PRI_SELINUX_LAST,
4398 };
4399
4400 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4401
4402 static struct nf_hook_ops selinux_ipv6_op = {
4403         .hook =         selinux_ipv6_postroute_last,
4404         .owner =        THIS_MODULE,
4405         .pf =           PF_INET6,
4406         .hooknum =      NF_IP6_POST_ROUTING,
4407         .priority =     NF_IP6_PRI_SELINUX_LAST,
4408 };
4409
4410 #endif  /* IPV6 */
4411
4412 static int __init selinux_nf_ip_init(void)
4413 {
4414         int err = 0;
4415
4416         if (!selinux_enabled)
4417                 goto out;
4418                 
4419         printk(KERN_INFO "SELinux:  Registering netfilter hooks\n");
4420         
4421         err = nf_register_hook(&selinux_ipv4_op);
4422         if (err)
4423                 panic("SELinux: nf_register_hook for IPv4: error %d\n", err);
4424
4425 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4426
4427         err = nf_register_hook(&selinux_ipv6_op);
4428         if (err)
4429                 panic("SELinux: nf_register_hook for IPv6: error %d\n", err);
4430
4431 #endif  /* IPV6 */
4432 out:
4433         return err;
4434 }
4435
4436 __initcall(selinux_nf_ip_init);
4437
4438 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
4439 static void selinux_nf_ip_exit(void)
4440 {
4441         printk(KERN_INFO "SELinux:  Unregistering netfilter hooks\n");
4442
4443         nf_unregister_hook(&selinux_ipv4_op);
4444 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4445         nf_unregister_hook(&selinux_ipv6_op);
4446 #endif  /* IPV6 */
4447 }
4448 #endif
4449
4450 #else /* CONFIG_SECURITY_NETWORK && CONFIG_NETFILTER */
4451
4452 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
4453 #define selinux_nf_ip_exit()
4454 #endif
4455
4456 #endif /* CONFIG_SECURITY_NETWORK && CONFIG_NETFILTER */
4457
4458 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
4459 int selinux_disable(void)
4460 {
4461         extern void exit_sel_fs(void);
4462         static int selinux_disabled = 0;
4463
4464         if (ss_initialized) {
4465                 /* Not permitted after initial policy load. */
4466                 return -EINVAL;
4467         }
4468
4469         if (selinux_disabled) {
4470                 /* Only do this once. */
4471                 return -EINVAL;
4472         }
4473
4474         printk(KERN_INFO "SELinux:  Disabled at runtime.\n");
4475
4476         selinux_disabled = 1;
4477
4478         /* Reset security_ops to the secondary module, dummy or capability. */
4479         security_ops = secondary_ops;
4480
4481         /* Unregister netfilter hooks. */
4482         selinux_nf_ip_exit();
4483
4484         /* Unregister selinuxfs. */
4485         exit_sel_fs();
4486
4487         return 0;
4488 }
4489 #endif
4490
4491