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