|
Luis R. Rodriguez |
c68714 |
From: "Luis R. Rodriguez" <mcgrof@kernel.org>
|
|
Luis R. Rodriguez |
c68714 |
Date: Wed, 12 Jul 2017 14:33:33 -0700
|
|
Luis R. Rodriguez |
c68714 |
Subject: [PATCH 05/14] sysctl: fold sysctl_writes_strict checks into helper
|
|
Luis R. Rodriguez |
c68714 |
Git-commit: d383d48470819e86fe30eb72f0e9494e1ee0e2af
|
|
Luis R. Rodriguez |
c68714 |
Patch-mainline: v4.13-rc1
|
|
Luis R. Rodriguez |
c68714 |
References: bsc#1048893
|
|
Luis R. Rodriguez |
c68714 |
|
|
Luis R. Rodriguez |
c68714 |
The mode sysctl_writes_strict positional checks keep being copy and pasted
|
|
Luis R. Rodriguez |
c68714 |
as we add new proc handlers. Just add a helper to avoid code duplication.
|
|
Luis R. Rodriguez |
c68714 |
|
|
Luis R. Rodriguez |
c68714 |
Link: http://lkml.kernel.org/r/20170519033554.18592-4-mcgrof@kernel.org
|
|
Luis R. Rodriguez |
c68714 |
Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
|
|
Luis R. Rodriguez |
c68714 |
Suggested-by: Kees Cook <keescook@chromium.org>
|
|
Luis R. Rodriguez |
c68714 |
Cc: Al Viro <viro@zeniv.linux.org.uk>
|
|
Luis R. Rodriguez |
c68714 |
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
|
|
Luis R. Rodriguez |
c68714 |
Cc: Alexey Dobriyan <adobriyan@gmail.com>
|
|
Luis R. Rodriguez |
c68714 |
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|
Luis R. Rodriguez |
c68714 |
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
Luis R. Rodriguez |
c68714 |
Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
|
|
Luis R. Rodriguez |
c68714 |
---
|
|
Luis R. Rodriguez |
c68714 |
kernel/sysctl.c | 56 ++++++++++++++++++++++++++++++++------------------------
|
|
Luis R. Rodriguez |
c68714 |
1 file changed, 32 insertions(+), 24 deletions(-)
|
|
Luis R. Rodriguez |
c68714 |
|
|
Luis R. Rodriguez |
c68714 |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
|
|
Luis R. Rodriguez |
c68714 |
index 00c582a05dc0..b47a479de51d 100644
|
|
Luis R. Rodriguez |
c68714 |
--- a/kernel/sysctl.c
|
|
Luis R. Rodriguez |
c68714 |
+++ b/kernel/sysctl.c
|
|
Luis R. Rodriguez |
c68714 |
@@ -1973,6 +1973,32 @@ static void warn_sysctl_write(struct ctl_table *table)
|
|
Luis R. Rodriguez |
c68714 |
}
|
|
Luis R. Rodriguez |
c68714 |
|
|
Luis R. Rodriguez |
c68714 |
/**
|
|
Luis R. Rodriguez |
c68714 |
+ * proc_first_pos_non_zero_ignore - check if firs position is allowed
|
|
Luis R. Rodriguez |
c68714 |
+ * @ppos: file position
|
|
Luis R. Rodriguez |
c68714 |
+ * @table: the sysctl table
|
|
Luis R. Rodriguez |
c68714 |
+ *
|
|
Luis R. Rodriguez |
c68714 |
+ * Returns true if the first position is non-zero and the sysctl_writes_strict
|
|
Luis R. Rodriguez |
c68714 |
+ * mode indicates this is not allowed for numeric input types. String proc
|
|
Luis R. Rodriguez |
c68714 |
+ * hadlers can ignore the return value.
|
|
Luis R. Rodriguez |
c68714 |
+ */
|
|
Luis R. Rodriguez |
c68714 |
+static bool proc_first_pos_non_zero_ignore(loff_t *ppos,
|
|
Luis R. Rodriguez |
c68714 |
+ struct ctl_table *table)
|
|
Luis R. Rodriguez |
c68714 |
+{
|
|
Luis R. Rodriguez |
c68714 |
+ if (!*ppos)
|
|
Luis R. Rodriguez |
c68714 |
+ return false;
|
|
Luis R. Rodriguez |
c68714 |
+
|
|
Luis R. Rodriguez |
c68714 |
+ switch (sysctl_writes_strict) {
|
|
Luis R. Rodriguez |
c68714 |
+ case SYSCTL_WRITES_STRICT:
|
|
Luis R. Rodriguez |
c68714 |
+ return true;
|
|
Luis R. Rodriguez |
c68714 |
+ case SYSCTL_WRITES_WARN:
|
|
Luis R. Rodriguez |
c68714 |
+ warn_sysctl_write(table);
|
|
Luis R. Rodriguez |
c68714 |
+ return false;
|
|
Luis R. Rodriguez |
c68714 |
+ default:
|
|
Luis R. Rodriguez |
c68714 |
+ return false;
|
|
Luis R. Rodriguez |
c68714 |
+ }
|
|
Luis R. Rodriguez |
c68714 |
+}
|
|
Luis R. Rodriguez |
c68714 |
+
|
|
Luis R. Rodriguez |
c68714 |
+/**
|
|
Luis R. Rodriguez |
c68714 |
* proc_dostring - read a string sysctl
|
|
Luis R. Rodriguez |
c68714 |
* @table: the sysctl table
|
|
Luis R. Rodriguez |
c68714 |
* @write: %TRUE if this is a write to the sysctl file
|
|
Luis R. Rodriguez |
c68714 |
@@ -1992,8 +2018,8 @@ static void warn_sysctl_write(struct ctl_table *table)
|
|
Luis R. Rodriguez |
c68714 |
int proc_dostring(struct ctl_table *table, int write,
|
|
Luis R. Rodriguez |
c68714 |
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
Luis R. Rodriguez |
c68714 |
{
|
|
Luis R. Rodriguez |
c68714 |
- if (write && *ppos && sysctl_writes_strict == SYSCTL_WRITES_WARN)
|
|
Luis R. Rodriguez |
c68714 |
- warn_sysctl_write(table);
|
|
Luis R. Rodriguez |
c68714 |
+ if (write)
|
|
Luis R. Rodriguez |
c68714 |
+ proc_first_pos_non_zero_ignore(ppos, table);
|
|
Luis R. Rodriguez |
c68714 |
|
|
Luis R. Rodriguez |
c68714 |
return _proc_do_string((char *)(table->data), table->maxlen, write,
|
|
Luis R. Rodriguez |
c68714 |
(char __user *)buffer, lenp, ppos);
|
|
Luis R. Rodriguez |
c68714 |
@@ -2195,17 +2221,8 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
|
|
Luis R. Rodriguez |
c68714 |
conv = do_proc_dointvec_conv;
|
|
Luis R. Rodriguez |
c68714 |
|
|
Luis R. Rodriguez |
c68714 |
if (write) {
|
|
Luis R. Rodriguez |
c68714 |
- if (*ppos) {
|
|
Luis R. Rodriguez |
c68714 |
- switch (sysctl_writes_strict) {
|
|
Luis R. Rodriguez |
c68714 |
- case SYSCTL_WRITES_STRICT:
|
|
Luis R. Rodriguez |
c68714 |
- goto out;
|
|
Luis R. Rodriguez |
c68714 |
- case SYSCTL_WRITES_WARN:
|
|
Luis R. Rodriguez |
c68714 |
- warn_sysctl_write(table);
|
|
Luis R. Rodriguez |
c68714 |
- break;
|
|
Luis R. Rodriguez |
c68714 |
- default:
|
|
Luis R. Rodriguez |
c68714 |
- break;
|
|
Luis R. Rodriguez |
c68714 |
- }
|
|
Luis R. Rodriguez |
c68714 |
- }
|
|
Luis R. Rodriguez |
c68714 |
+ if (proc_first_pos_non_zero_ignore(ppos, table))
|
|
Luis R. Rodriguez |
c68714 |
+ goto out;
|
|
Luis R. Rodriguez |
c68714 |
|
|
Luis R. Rodriguez |
c68714 |
if (left > PAGE_SIZE - 1)
|
|
Luis R. Rodriguez |
c68714 |
left = PAGE_SIZE - 1;
|
|
Luis R. Rodriguez |
c68714 |
@@ -2480,17 +2497,8 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int
|
|
Luis R. Rodriguez |
c68714 |
left = *lenp;
|
|
Luis R. Rodriguez |
c68714 |
|
|
Luis R. Rodriguez |
c68714 |
if (write) {
|
|
Luis R. Rodriguez |
c68714 |
- if (*ppos) {
|
|
Luis R. Rodriguez |
c68714 |
- switch (sysctl_writes_strict) {
|
|
Luis R. Rodriguez |
c68714 |
- case SYSCTL_WRITES_STRICT:
|
|
Luis R. Rodriguez |
c68714 |
- goto out;
|
|
Luis R. Rodriguez |
c68714 |
- case SYSCTL_WRITES_WARN:
|
|
Luis R. Rodriguez |
c68714 |
- warn_sysctl_write(table);
|
|
Luis R. Rodriguez |
c68714 |
- break;
|
|
Luis R. Rodriguez |
c68714 |
- default:
|
|
Luis R. Rodriguez |
c68714 |
- break;
|
|
Luis R. Rodriguez |
c68714 |
- }
|
|
Luis R. Rodriguez |
c68714 |
- }
|
|
Luis R. Rodriguez |
c68714 |
+ if (proc_first_pos_non_zero_ignore(ppos, table))
|
|
Luis R. Rodriguez |
c68714 |
+ goto out;
|
|
Luis R. Rodriguez |
c68714 |
|
|
Luis R. Rodriguez |
c68714 |
if (left > PAGE_SIZE - 1)
|
|
Luis R. Rodriguez |
c68714 |
left = PAGE_SIZE - 1;
|
|
Luis R. Rodriguez |
c68714 |
--
|
|
Luis R. Rodriguez |
c68714 |
2.11.0
|
|
Luis R. Rodriguez |
c68714 |
|