Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
security
selinux
netlink.c
Go to the documentation of this file.
1
/*
2
* Netlink event notifications for SELinux.
3
*
4
* Author: James Morris <
[email protected]
>
5
*
6
* Copyright (C) 2004 Red Hat, Inc., James Morris <
[email protected]
>
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License version 2,
10
* as published by the Free Software Foundation.
11
*/
12
#include <
linux/init.h
>
13
#include <linux/types.h>
14
#include <linux/slab.h>
15
#include <linux/stddef.h>
16
#include <linux/kernel.h>
17
#include <linux/export.h>
18
#include <
linux/skbuff.h
>
19
#include <linux/netlink.h>
20
#include <
linux/selinux_netlink.h
>
21
#include <
net/net_namespace.h
>
22
#include <
net/netlink.h
>
23
24
#include "security.h"
25
26
static
struct
sock
*selnl;
27
28
static
int
selnl_msglen(
int
msgtype
)
29
{
30
int
ret
= 0;
31
32
switch
(msgtype) {
33
case
SELNL_MSG_SETENFORCE
:
34
ret =
sizeof
(
struct
selnl_msg_setenforce
);
35
break
;
36
37
case
SELNL_MSG_POLICYLOAD
:
38
ret =
sizeof
(
struct
selnl_msg_policyload
);
39
break
;
40
41
default
:
42
BUG
();
43
}
44
return
ret
;
45
}
46
47
static
void
selnl_add_payload(
struct
nlmsghdr
*nlh,
int
len,
int
msgtype,
void
*
data
)
48
{
49
switch
(msgtype) {
50
case
SELNL_MSG_SETENFORCE
: {
51
struct
selnl_msg_setenforce
*
msg
= nlmsg_data(nlh);
52
53
memset
(msg, 0, len);
54
msg->
val
= *((
int
*)data);
55
break
;
56
}
57
58
case
SELNL_MSG_POLICYLOAD
: {
59
struct
selnl_msg_policyload
*
msg
= nlmsg_data(nlh);
60
61
memset
(msg, 0, len);
62
msg->
seqno
= *((
u32
*)data);
63
break
;
64
}
65
66
default
:
67
BUG
();
68
}
69
}
70
71
static
void
selnl_notify(
int
msgtype,
void
*data)
72
{
73
int
len;
74
sk_buff_data_t
tmp
;
75
struct
sk_buff
*
skb
;
76
struct
nlmsghdr
*nlh;
77
78
len = selnl_msglen(msgtype);
79
80
skb = alloc_skb(
NLMSG_SPACE
(len),
GFP_USER
);
81
if
(!skb)
82
goto
oom;
83
84
tmp = skb->
tail
;
85
nlh = nlmsg_put(skb, 0, 0, msgtype, len, 0);
86
if
(!nlh)
87
goto
out_kfree_skb;
88
selnl_add_payload(nlh, len, msgtype, data);
89
nlh->
nlmsg_len
= skb->
tail
-
tmp
;
90
NETLINK_CB
(skb).dst_group =
SELNLGRP_AVC
;
91
netlink_broadcast
(selnl, skb, 0,
SELNLGRP_AVC
,
GFP_USER
);
92
out
:
93
return
;
94
95
out_kfree_skb:
96
kfree_skb
(skb);
97
oom:
98
printk
(
KERN_ERR
"SELinux: OOM in %s\n"
, __func__);
99
goto
out
;
100
}
101
102
void
selnl_notify_setenforce
(
int
val
)
103
{
104
selnl_notify(
SELNL_MSG_SETENFORCE
, &val);
105
}
106
107
void
selnl_notify_policyload
(
u32
seqno
)
108
{
109
selnl_notify(
SELNL_MSG_POLICYLOAD
, &seqno);
110
}
111
112
static
int
__init
selnl_init(
void
)
113
{
114
struct
netlink_kernel_cfg
cfg
= {
115
.groups =
SELNLGRP_MAX
,
116
.flags =
NL_CFG_F_NONROOT_RECV
,
117
};
118
119
selnl = netlink_kernel_create(&
init_net
,
NETLINK_SELINUX
, &cfg);
120
if
(selnl ==
NULL
)
121
panic
(
"SELinux: Cannot create netlink socket."
);
122
return
0;
123
}
124
125
__initcall
(selnl_init);
Generated on Thu Jan 10 2013 13:37:02 for Linux Kernel by
1.8.2