sysctl: return EINVAL on out-of-bound writes
In strict mode when invalid writes are detected, return an error.
Suggested-by: Michael Kerrisk <mtk.manpages@gmail.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index a13bbda..4c07c0e 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -1907,7 +1907,7 @@
len = maxlen - 1;
if (*ppos > len)
- return 0;
+ return -EINVAL;
len = *ppos;
} else {
/* Start writing from beginning of buffer. */
@@ -2184,6 +2184,7 @@
if (*ppos) {
switch (sysctl_writes_strict) {
case SYSCTL_WRITES_STRICT:
+ err = -EINVAL;
goto out;
case SYSCTL_WRITES_WARN:
warn_sysctl_write(table);
@@ -2457,6 +2458,7 @@
if (*ppos) {
switch (sysctl_writes_strict) {
case SYSCTL_WRITES_STRICT:
+ err = -EINVAL;
goto out;
case SYSCTL_WRITES_WARN:
warn_sysctl_write(table);