Skip to content

Commit b7b5755

Browse files
author
James Morris
committed
Merge branch 'master' of git://git.infradead.org/users/eparis/selinux into for-linus
Conflicts: lib/flex_array.c security/selinux/avc.c security/selinux/hooks.c security/selinux/ss/policydb.c security/smack/smack_lsm.c Manually resolve conflicts. Signed-off-by: James Morris <jmorris@namei.org>
2 parents 434d42c + 7a627e3 commit b7b5755

File tree

14 files changed

+398
-220
lines changed

14 files changed

+398
-220
lines changed

MAINTAINERS

+2-1
Original file line numberDiff line numberDiff line change
@@ -5592,10 +5592,11 @@ M: James Morris <jmorris@namei.org>
55925592
M: Eric Paris <eparis@parisplace.org>
55935593
L: selinux@tycho.nsa.gov (subscribers-only, general discussion)
55945594
W: http://selinuxproject.org
5595-
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git
5595+
T: git git://git.infradead.org/users/eparis/selinux.git
55965596
S: Supported
55975597
F: include/linux/selinux*
55985598
F: security/selinux/
5599+
F: scripts/selinux/
55995600

56005601
APPARMOR SECURITY MODULE
56015602
M: John Johansen <john.johansen@canonical.com>

include/linux/lsm_audit.h

+6-5
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,21 @@
2727
/* Auxiliary data to use in generating the audit record. */
2828
struct common_audit_data {
2929
char type;
30-
#define LSM_AUDIT_DATA_FS 1
30+
#define LSM_AUDIT_DATA_PATH 1
3131
#define LSM_AUDIT_DATA_NET 2
3232
#define LSM_AUDIT_DATA_CAP 3
3333
#define LSM_AUDIT_DATA_IPC 4
3434
#define LSM_AUDIT_DATA_TASK 5
3535
#define LSM_AUDIT_DATA_KEY 6
3636
#define LSM_AUDIT_DATA_NONE 7
3737
#define LSM_AUDIT_DATA_KMOD 8
38+
#define LSM_AUDIT_DATA_INODE 9
39+
#define LSM_AUDIT_DATA_DENTRY 10
3840
struct task_struct *tsk;
3941
union {
40-
struct {
41-
struct path path;
42-
struct inode *inode;
43-
} fs;
42+
struct path path;
43+
struct dentry *dentry;
44+
struct inode *inode;
4445
struct {
4546
int netif;
4647
struct sock *sk;

lib/flex_array.c

+20-6
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,11 @@ struct flex_array *flex_array_alloc(int element_size, unsigned int total,
8888
gfp_t flags)
8989
{
9090
struct flex_array *ret;
91-
int max_size = FLEX_ARRAY_NR_BASE_PTRS *
92-
FLEX_ARRAY_ELEMENTS_PER_PART(element_size);
91+
int max_size = 0;
92+
93+
if (element_size)
94+
max_size = FLEX_ARRAY_NR_BASE_PTRS *
95+
FLEX_ARRAY_ELEMENTS_PER_PART(element_size);
9396

9497
/* max_size will end up 0 if element_size > PAGE_SIZE */
9598
if (total > max_size)
@@ -183,15 +186,18 @@ __fa_get_part(struct flex_array *fa, int part_nr, gfp_t flags)
183186
int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src,
184187
gfp_t flags)
185188
{
186-
int part_nr = fa_element_to_part_nr(fa, element_nr);
189+
int part_nr;
187190
struct flex_array_part *part;
188191
void *dst;
189192

190193
if (element_nr >= fa->total_nr_elements)
191194
return -ENOSPC;
195+
if (!fa->element_size)
196+
return 0;
192197
if (elements_fit_in_base(fa))
193198
part = (struct flex_array_part *)&fa->parts[0];
194199
else {
200+
part_nr = fa_element_to_part_nr(fa, element_nr);
195201
part = __fa_get_part(fa, part_nr, flags);
196202
if (!part)
197203
return -ENOMEM;
@@ -211,15 +217,18 @@ EXPORT_SYMBOL(flex_array_put);
211217
*/
212218
int flex_array_clear(struct flex_array *fa, unsigned int element_nr)
213219
{
214-
int part_nr = fa_element_to_part_nr(fa, element_nr);
220+
int part_nr;
215221
struct flex_array_part *part;
216222
void *dst;
217223

218224
if (element_nr >= fa->total_nr_elements)
219225
return -ENOSPC;
226+
if (!fa->element_size)
227+
return 0;
220228
if (elements_fit_in_base(fa))
221229
part = (struct flex_array_part *)&fa->parts[0];
222230
else {
231+
part_nr = fa_element_to_part_nr(fa, element_nr);
223232
part = fa->parts[part_nr];
224233
if (!part)
225234
return -EINVAL;
@@ -264,6 +273,8 @@ int flex_array_prealloc(struct flex_array *fa, unsigned int start,
264273

265274
if (end >= fa->total_nr_elements)
266275
return -ENOSPC;
276+
if (!fa->element_size)
277+
return 0;
267278
if (elements_fit_in_base(fa))
268279
return 0;
269280
start_part = fa_element_to_part_nr(fa, start);
@@ -291,14 +302,17 @@ EXPORT_SYMBOL(flex_array_prealloc);
291302
*/
292303
void *flex_array_get(struct flex_array *fa, unsigned int element_nr)
293304
{
294-
int part_nr = fa_element_to_part_nr(fa, element_nr);
305+
int part_nr;
295306
struct flex_array_part *part;
296307

308+
if (!fa->element_size)
309+
return NULL;
297310
if (element_nr >= fa->total_nr_elements)
298311
return NULL;
299312
if (elements_fit_in_base(fa))
300313
part = (struct flex_array_part *)&fa->parts[0];
301314
else {
315+
part_nr = fa_element_to_part_nr(fa, element_nr);
302316
part = fa->parts[part_nr];
303317
if (!part)
304318
return NULL;
@@ -353,7 +367,7 @@ int flex_array_shrink(struct flex_array *fa)
353367
int part_nr;
354368
int ret = 0;
355369

356-
if (!fa->total_nr_elements)
370+
if (!fa->total_nr_elements || !fa->element_size)
357371
return 0;
358372
if (elements_fit_in_base(fa))
359373
return ret;

security/lsm_audit.c

+36-23
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ static inline void print_ipv4_addr(struct audit_buffer *ab, __be32 addr,
210210
static void dump_common_audit_data(struct audit_buffer *ab,
211211
struct common_audit_data *a)
212212
{
213-
struct inode *inode = NULL;
214213
struct task_struct *tsk = current;
215214

216215
if (a->tsk)
@@ -229,33 +228,47 @@ static void dump_common_audit_data(struct audit_buffer *ab,
229228
case LSM_AUDIT_DATA_CAP:
230229
audit_log_format(ab, " capability=%d ", a->u.cap);
231230
break;
232-
case LSM_AUDIT_DATA_FS:
233-
if (a->u.fs.path.dentry) {
234-
struct dentry *dentry = a->u.fs.path.dentry;
235-
if (a->u.fs.path.mnt) {
236-
audit_log_d_path(ab, "path=", &a->u.fs.path);
237-
} else {
238-
audit_log_format(ab, " name=");
239-
audit_log_untrustedstring(ab,
240-
dentry->d_name.name);
241-
}
242-
inode = dentry->d_inode;
243-
} else if (a->u.fs.inode) {
244-
struct dentry *dentry;
245-
inode = a->u.fs.inode;
246-
dentry = d_find_alias(inode);
247-
if (dentry) {
248-
audit_log_format(ab, " name=");
249-
audit_log_untrustedstring(ab,
250-
dentry->d_name.name);
251-
dput(dentry);
252-
}
253-
}
231+
case LSM_AUDIT_DATA_PATH: {
232+
struct inode *inode;
233+
234+
audit_log_d_path(ab, "path=", &a->u.path);
235+
236+
inode = a->u.path.dentry->d_inode;
254237
if (inode)
255238
audit_log_format(ab, " dev=%s ino=%lu",
256239
inode->i_sb->s_id,
257240
inode->i_ino);
258241
break;
242+
}
243+
case LSM_AUDIT_DATA_DENTRY: {
244+
struct inode *inode;
245+
246+
audit_log_format(ab, " name=");
247+
audit_log_untrustedstring(ab, a->u.dentry->d_name.name);
248+
249+
inode = a->u.dentry->d_inode;
250+
if (inode)
251+
audit_log_format(ab, " dev=%s ino=%lu",
252+
inode->i_sb->s_id,
253+
inode->i_ino);
254+
break;
255+
}
256+
case LSM_AUDIT_DATA_INODE: {
257+
struct dentry *dentry;
258+
struct inode *inode;
259+
260+
inode = a->u.inode;
261+
dentry = d_find_alias(inode);
262+
if (dentry) {
263+
audit_log_format(ab, " name=");
264+
audit_log_untrustedstring(ab,
265+
dentry->d_name.name);
266+
dput(dentry);
267+
}
268+
audit_log_format(ab, " dev=%s ino=%lu", inode->i_sb->s_id,
269+
inode->i_ino);
270+
break;
271+
}
259272
case LSM_AUDIT_DATA_TASK:
260273
tsk = a->u.tsk;
261274
if (tsk && tsk->pid) {

security/selinux/avc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ int avc_audit(u32 ssid, u32 tsid,
526526
* during retry. However this is logically just as if the operation
527527
* happened a little later.
528528
*/
529-
if ((a->type == LSM_AUDIT_DATA_FS) &&
529+
if ((a->type == LSM_AUDIT_DATA_INODE) &&
530530
(flags & IPERM_FLAG_RCU))
531531
return -ECHILD;
532532

0 commit comments

Comments
 (0)