aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-09-07 22:58:56 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-07 22:58:56 -0400
commit21d236bf2bde518844b5675ec4980f4b2fd13e1a (patch)
tree0a0f93f452f96becaa5779b76e85db4e0d31f2eb
parent8dc5b3a6cb2fc5d4f751bda56a378589202a118b (diff)
parentc71b02e4d207cbcf097f9746d5f7967b22905e70 (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.c24
-rw-r--r--include/linux/syslog.h9
-rw-r--r--kernel/printk/printk.c3
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
135static 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
147static ssize_t pstore_file_read(struct file *file, char __user *userbuf, 134static 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
50int do_syslog(int type, char __user *buf, int count, int source); 50int do_syslog(int type, char __user *buf, int count, int source);
51 51
52#ifdef CONFIG_PRINTK
53int check_syslog_permissions(int type, int source);
54#else
55static 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
652int check_syslog_permissions(int type, int source) 652static 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)
677ok: 677ok:
678 return security_syslog(type); 678 return security_syslog(type);
679} 679}
680EXPORT_SYMBOL_GPL(check_syslog_permissions);
681 680
682static void append_char(char **pp, char *e, char c) 681static void append_char(char **pp, char *e, char c)
683{ 682{