diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-07 22:58:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-07 22:58:56 -0400 |
commit | 21d236bf2bde518844b5675ec4980f4b2fd13e1a (patch) | |
tree | 0a0f93f452f96becaa5779b76e85db4e0d31f2eb | |
parent | 8dc5b3a6cb2fc5d4f751bda56a378589202a118b (diff) | |
parent | c71b02e4d207cbcf097f9746d5f7967b22905e70 (diff) |
Merge tag 'pstore-v4.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull pstore update from Kees Cook:
"Make pstore permissions more versatile by removing CAP_SYSLOG
requirement and defining more restrictive root directory DAC
permissions default (0750, which can be adjust after boot unlike the
CAP_SYSLOG check).
Suggested by Nick Kralevich"
* tag 'pstore-v4.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
Revert "pstore: Honor dmesg_restrict sysctl on dmesg dumps"
pstore: Make default pstorefs root dir perms 0750
-rw-r--r-- | fs/pstore/inode.c | 24 | ||||
-rw-r--r-- | include/linux/syslog.h | 9 | ||||
-rw-r--r-- | kernel/printk/printk.c | 3 |
3 files changed, 2 insertions, 34 deletions
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index fefd22611cf6..d814723fb27d 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c | |||
@@ -36,7 +36,6 @@ | |||
36 | #include <linux/slab.h> | 36 | #include <linux/slab.h> |
37 | #include <linux/spinlock.h> | 37 | #include <linux/spinlock.h> |
38 | #include <linux/uaccess.h> | 38 | #include <linux/uaccess.h> |
39 | #include <linux/syslog.h> | ||
40 | 39 | ||
41 | #include "internal.h" | 40 | #include "internal.h" |
42 | 41 | ||
@@ -132,18 +131,6 @@ static const struct seq_operations pstore_ftrace_seq_ops = { | |||
132 | .show = pstore_ftrace_seq_show, | 131 | .show = pstore_ftrace_seq_show, |
133 | }; | 132 | }; |
134 | 133 | ||
135 | static int pstore_check_syslog_permissions(struct pstore_private *ps) | ||
136 | { | ||
137 | switch (ps->record->type) { | ||
138 | case PSTORE_TYPE_DMESG: | ||
139 | case PSTORE_TYPE_CONSOLE: | ||
140 | return check_syslog_permissions(SYSLOG_ACTION_READ_ALL, | ||
141 | SYSLOG_FROM_READER); | ||
142 | default: | ||
143 | return 0; | ||
144 | } | ||
145 | } | ||
146 | |||
147 | static ssize_t pstore_file_read(struct file *file, char __user *userbuf, | 134 | static ssize_t pstore_file_read(struct file *file, char __user *userbuf, |
148 | size_t count, loff_t *ppos) | 135 | size_t count, loff_t *ppos) |
149 | { | 136 | { |
@@ -163,10 +150,6 @@ static int pstore_file_open(struct inode *inode, struct file *file) | |||
163 | int err; | 150 | int err; |
164 | const struct seq_operations *sops = NULL; | 151 | const struct seq_operations *sops = NULL; |
165 | 152 | ||
166 | err = pstore_check_syslog_permissions(ps); | ||
167 | if (err) | ||
168 | return err; | ||
169 | |||
170 | if (ps->record->type == PSTORE_TYPE_FTRACE) | 153 | if (ps->record->type == PSTORE_TYPE_FTRACE) |
171 | sops = &pstore_ftrace_seq_ops; | 154 | sops = &pstore_ftrace_seq_ops; |
172 | 155 | ||
@@ -204,11 +187,6 @@ static int pstore_unlink(struct inode *dir, struct dentry *dentry) | |||
204 | { | 187 | { |
205 | struct pstore_private *p = d_inode(dentry)->i_private; | 188 | struct pstore_private *p = d_inode(dentry)->i_private; |
206 | struct pstore_record *record = p->record; | 189 | struct pstore_record *record = p->record; |
207 | int err; | ||
208 | |||
209 | err = pstore_check_syslog_permissions(p); | ||
210 | if (err) | ||
211 | return err; | ||
212 | 190 | ||
213 | if (!record->psi->erase) | 191 | if (!record->psi->erase) |
214 | return -EPERM; | 192 | return -EPERM; |
@@ -471,7 +449,7 @@ static int pstore_fill_super(struct super_block *sb, void *data, int silent) | |||
471 | 449 | ||
472 | inode = pstore_get_inode(sb); | 450 | inode = pstore_get_inode(sb); |
473 | if (inode) { | 451 | if (inode) { |
474 | inode->i_mode = S_IFDIR | 0755; | 452 | inode->i_mode = S_IFDIR | 0750; |
475 | inode->i_op = &pstore_dir_inode_operations; | 453 | inode->i_op = &pstore_dir_inode_operations; |
476 | inode->i_fop = &simple_dir_operations; | 454 | inode->i_fop = &simple_dir_operations; |
477 | inc_nlink(inode); | 455 | inc_nlink(inode); |
diff --git a/include/linux/syslog.h b/include/linux/syslog.h index c3a7f0cc3a27..e1c3632f4e81 100644 --- a/include/linux/syslog.h +++ b/include/linux/syslog.h | |||
@@ -49,13 +49,4 @@ | |||
49 | 49 | ||
50 | int do_syslog(int type, char __user *buf, int count, int source); | 50 | int do_syslog(int type, char __user *buf, int count, int source); |
51 | 51 | ||
52 | #ifdef CONFIG_PRINTK | ||
53 | int check_syslog_permissions(int type, int source); | ||
54 | #else | ||
55 | static inline int check_syslog_permissions(int type, int source) | ||
56 | { | ||
57 | return 0; | ||
58 | } | ||
59 | #endif | ||
60 | |||
61 | #endif /* _LINUX_SYSLOG_H */ | 52 | #endif /* _LINUX_SYSLOG_H */ |
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index fc47863f629c..97bda7b0655b 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c | |||
@@ -649,7 +649,7 @@ static int syslog_action_restricted(int type) | |||
649 | type != SYSLOG_ACTION_SIZE_BUFFER; | 649 | type != SYSLOG_ACTION_SIZE_BUFFER; |
650 | } | 650 | } |
651 | 651 | ||
652 | int check_syslog_permissions(int type, int source) | 652 | static int check_syslog_permissions(int type, int source) |
653 | { | 653 | { |
654 | /* | 654 | /* |
655 | * If this is from /proc/kmsg and we've already opened it, then we've | 655 | * If this is from /proc/kmsg and we've already opened it, then we've |
@@ -677,7 +677,6 @@ int check_syslog_permissions(int type, int source) | |||
677 | ok: | 677 | ok: |
678 | return security_syslog(type); | 678 | return security_syslog(type); |
679 | } | 679 | } |
680 | EXPORT_SYMBOL_GPL(check_syslog_permissions); | ||
681 | 680 | ||
682 | static void append_char(char **pp, char *e, char c) | 681 | static void append_char(char **pp, char *e, char c) |
683 | { | 682 | { |