diff options
-rw-r--r-- | fs/open.c | 4 | ||||
-rw-r--r-- | fs/xattr.c | 16 | ||||
-rw-r--r-- | include/linux/audit.h | 9 | ||||
-rw-r--r-- | ipc/mqueue.c | 4 | ||||
-rw-r--r-- | kernel/auditsc.c | 5 |
5 files changed, 24 insertions, 14 deletions
@@ -516,7 +516,7 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd, umode_t, mode) | |||
516 | int err = -EBADF; | 516 | int err = -EBADF; |
517 | 517 | ||
518 | if (f.file) { | 518 | if (f.file) { |
519 | audit_inode(NULL, f.file->f_path.dentry, 0); | 519 | audit_file(f.file); |
520 | err = chmod_common(&f.file->f_path, mode); | 520 | err = chmod_common(&f.file->f_path, mode); |
521 | fdput(f); | 521 | fdput(f); |
522 | } | 522 | } |
@@ -642,7 +642,7 @@ SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group) | |||
642 | error = mnt_want_write_file(f.file); | 642 | error = mnt_want_write_file(f.file); |
643 | if (error) | 643 | if (error) |
644 | goto out_fput; | 644 | goto out_fput; |
645 | audit_inode(NULL, f.file->f_path.dentry, 0); | 645 | audit_file(f.file); |
646 | error = chown_common(&f.file->f_path, user, group); | 646 | error = chown_common(&f.file->f_path, user, group); |
647 | mnt_drop_write_file(f.file); | 647 | mnt_drop_write_file(f.file); |
648 | out_fput: | 648 | out_fput: |
diff --git a/fs/xattr.c b/fs/xattr.c index 64e83efb742d..4ef698549e31 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
@@ -405,16 +405,14 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name, | |||
405 | const void __user *,value, size_t, size, int, flags) | 405 | const void __user *,value, size_t, size, int, flags) |
406 | { | 406 | { |
407 | struct fd f = fdget(fd); | 407 | struct fd f = fdget(fd); |
408 | struct dentry *dentry; | ||
409 | int error = -EBADF; | 408 | int error = -EBADF; |
410 | 409 | ||
411 | if (!f.file) | 410 | if (!f.file) |
412 | return error; | 411 | return error; |
413 | dentry = f.file->f_path.dentry; | 412 | audit_file(f.file); |
414 | audit_inode(NULL, dentry, 0); | ||
415 | error = mnt_want_write_file(f.file); | 413 | error = mnt_want_write_file(f.file); |
416 | if (!error) { | 414 | if (!error) { |
417 | error = setxattr(dentry, name, value, size, flags); | 415 | error = setxattr(f.file->f_path.dentry, name, value, size, flags); |
418 | mnt_drop_write_file(f.file); | 416 | mnt_drop_write_file(f.file); |
419 | } | 417 | } |
420 | fdput(f); | 418 | fdput(f); |
@@ -509,7 +507,7 @@ SYSCALL_DEFINE4(fgetxattr, int, fd, const char __user *, name, | |||
509 | 507 | ||
510 | if (!f.file) | 508 | if (!f.file) |
511 | return error; | 509 | return error; |
512 | audit_inode(NULL, f.file->f_path.dentry, 0); | 510 | audit_file(f.file); |
513 | error = getxattr(f.file->f_path.dentry, name, value, size); | 511 | error = getxattr(f.file->f_path.dentry, name, value, size); |
514 | fdput(f); | 512 | fdput(f); |
515 | return error; | 513 | return error; |
@@ -590,7 +588,7 @@ SYSCALL_DEFINE3(flistxattr, int, fd, char __user *, list, size_t, size) | |||
590 | 588 | ||
591 | if (!f.file) | 589 | if (!f.file) |
592 | return error; | 590 | return error; |
593 | audit_inode(NULL, f.file->f_path.dentry, 0); | 591 | audit_file(f.file); |
594 | error = listxattr(f.file->f_path.dentry, list, size); | 592 | error = listxattr(f.file->f_path.dentry, list, size); |
595 | fdput(f); | 593 | fdput(f); |
596 | return error; | 594 | return error; |
@@ -651,16 +649,14 @@ SYSCALL_DEFINE2(lremovexattr, const char __user *, pathname, | |||
651 | SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name) | 649 | SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name) |
652 | { | 650 | { |
653 | struct fd f = fdget(fd); | 651 | struct fd f = fdget(fd); |
654 | struct dentry *dentry; | ||
655 | int error = -EBADF; | 652 | int error = -EBADF; |
656 | 653 | ||
657 | if (!f.file) | 654 | if (!f.file) |
658 | return error; | 655 | return error; |
659 | dentry = f.file->f_path.dentry; | 656 | audit_file(f.file); |
660 | audit_inode(NULL, dentry, 0); | ||
661 | error = mnt_want_write_file(f.file); | 657 | error = mnt_want_write_file(f.file); |
662 | if (!error) { | 658 | if (!error) { |
663 | error = removexattr(dentry, name); | 659 | error = removexattr(f.file->f_path.dentry, name); |
664 | mnt_drop_write_file(f.file); | 660 | mnt_drop_write_file(f.file); |
665 | } | 661 | } |
666 | fdput(f); | 662 | fdput(f); |
diff --git a/include/linux/audit.h b/include/linux/audit.h index e58fe7df8b9c..0c04917c2f12 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -130,6 +130,7 @@ extern void audit_putname(struct filename *name); | |||
130 | #define AUDIT_INODE_HIDDEN 2 /* audit record should be hidden */ | 130 | #define AUDIT_INODE_HIDDEN 2 /* audit record should be hidden */ |
131 | extern void __audit_inode(struct filename *name, const struct dentry *dentry, | 131 | extern void __audit_inode(struct filename *name, const struct dentry *dentry, |
132 | unsigned int flags); | 132 | unsigned int flags); |
133 | extern void __audit_file(const struct file *); | ||
133 | extern void __audit_inode_child(const struct inode *parent, | 134 | extern void __audit_inode_child(const struct inode *parent, |
134 | const struct dentry *dentry, | 135 | const struct dentry *dentry, |
135 | const unsigned char type); | 136 | const unsigned char type); |
@@ -183,6 +184,11 @@ static inline void audit_inode(struct filename *name, | |||
183 | __audit_inode(name, dentry, flags); | 184 | __audit_inode(name, dentry, flags); |
184 | } | 185 | } |
185 | } | 186 | } |
187 | static inline void audit_file(struct file *file) | ||
188 | { | ||
189 | if (unlikely(!audit_dummy_context())) | ||
190 | __audit_file(file); | ||
191 | } | ||
186 | static inline void audit_inode_parent_hidden(struct filename *name, | 192 | static inline void audit_inode_parent_hidden(struct filename *name, |
187 | const struct dentry *dentry) | 193 | const struct dentry *dentry) |
188 | { | 194 | { |
@@ -357,6 +363,9 @@ static inline void audit_inode(struct filename *name, | |||
357 | const struct dentry *dentry, | 363 | const struct dentry *dentry, |
358 | unsigned int parent) | 364 | unsigned int parent) |
359 | { } | 365 | { } |
366 | static inline void audit_file(struct file *file) | ||
367 | { | ||
368 | } | ||
360 | static inline void audit_inode_parent_hidden(struct filename *name, | 369 | static inline void audit_inode_parent_hidden(struct filename *name, |
361 | const struct dentry *dentry) | 370 | const struct dentry *dentry) |
362 | { } | 371 | { } |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 4fcf39af1776..7635a1cf99f3 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
@@ -990,7 +990,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, | |||
990 | goto out_fput; | 990 | goto out_fput; |
991 | } | 991 | } |
992 | info = MQUEUE_I(inode); | 992 | info = MQUEUE_I(inode); |
993 | audit_inode(NULL, f.file->f_path.dentry, 0); | 993 | audit_file(f.file); |
994 | 994 | ||
995 | if (unlikely(!(f.file->f_mode & FMODE_WRITE))) { | 995 | if (unlikely(!(f.file->f_mode & FMODE_WRITE))) { |
996 | ret = -EBADF; | 996 | ret = -EBADF; |
@@ -1106,7 +1106,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr, | |||
1106 | goto out_fput; | 1106 | goto out_fput; |
1107 | } | 1107 | } |
1108 | info = MQUEUE_I(inode); | 1108 | info = MQUEUE_I(inode); |
1109 | audit_inode(NULL, f.file->f_path.dentry, 0); | 1109 | audit_file(f.file); |
1110 | 1110 | ||
1111 | if (unlikely(!(f.file->f_mode & FMODE_READ))) { | 1111 | if (unlikely(!(f.file->f_mode & FMODE_READ))) { |
1112 | ret = -EBADF; | 1112 | ret = -EBADF; |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 06820657c8ca..c75522a83678 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -1897,6 +1897,11 @@ out: | |||
1897 | audit_copy_inode(n, dentry, inode); | 1897 | audit_copy_inode(n, dentry, inode); |
1898 | } | 1898 | } |
1899 | 1899 | ||
1900 | void __audit_file(const struct file *file) | ||
1901 | { | ||
1902 | __audit_inode(NULL, file->f_path.dentry, 0); | ||
1903 | } | ||
1904 | |||
1900 | /** | 1905 | /** |
1901 | * __audit_inode_child - collect inode info for created/removed objects | 1906 | * __audit_inode_child - collect inode info for created/removed objects |
1902 | * @parent: inode of dentry parent | 1907 | * @parent: inode of dentry parent |