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