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