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);