public inbox for linuxppc-dev@ozlabs.org 
 help / color / mirror / Atom feed
From: Aaron Tomlin <atomlin@redhat•com>
To: peterz@infradead•org
Cc: dzickus@redhat•com, jcastillo@redhat•com, riel@redhat•com,
	x86@kernel•org, akpm@linux-foundation•org, minchan@kernel•org,
	bmr@redhat•com, prarit@redhat•com, oleg@redhat•com,
	rostedt@goodmis•org, linux-kernel@vger•kernel.org,
	hannes@cmpxchg•org, mingo@redhat•com,
	aneesh.kumar@linux•vnet.ibm.com, atomlin@redhat•com,
	jgh@redhat•com, linuxppc-dev@lists•ozlabs.org,
	tglx@linutronix•de, akpm@google•com
Subject: [PATCH v4 3/3] sched: BUG when stack end location is over written
Date: Fri, 12 Sep 2014 14:16:19 +0100	[thread overview]
Message-ID: <1410527779-8133-4-git-send-email-atomlin@redhat.com> (raw)
In-Reply-To: <1410527779-8133-1-git-send-email-atomlin@redhat.com>

Currently in the event of a stack overrun a call to schedule()
does not check for this type of corruption. This corruption is
often silent and can go unnoticed. However once the corrupted
region is examined at a later stage, the outcome is undefined
and often results in a sporadic page fault which cannot be
handled.

This patch checks for a stack overrun and takes appropriate
action since the damage is already done, there is no point
in continuing.

Signed-off-by: Aaron Tomlin <atomlin@redhat•com>
---
 kernel/sched/core.c |  3 +++
 lib/Kconfig.debug   | 12 ++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index ec1a286..6ed1a24 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2660,6 +2660,9 @@ static noinline void __schedule_bug(struct task_struct *prev)
  */
 static inline void schedule_debug(struct task_struct *prev)
 {
+#ifdef CONFIG_SCHED_STACK_END_CHECK
+	BUG_ON(unlikely(task_stack_end_corrupted(prev)));
+#endif
 	/*
 	 * Test if we are atomic. Since do_exit() needs to call into
 	 * schedule() atomically, we ignore that path. Otherwise whine
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index a285900..e58163d 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -824,6 +824,18 @@ config SCHEDSTATS
 	  application, you can say N to avoid the very slight overhead
 	  this adds.
 
+config SCHED_STACK_END_CHECK
+	bool "Detect stack corruption on calls to schedule()"
+	depends on DEBUG_KERNEL
+	default n
+	help
+	  This option checks for a stack overrun on calls to schedule().
+	  If the stack end location is found to be over written always panic as
+	  the content of the corrupted region can no longer be trusted.
+	  This is to ensure no erroneous behaviour occurs which could result in
+	  data corruption or a sporadic crash at a later stage once the region
+	  is examined. The runtime overhead introduced is minimal.
+
 config TIMER_STATS
 	bool "Collect kernel timers statistics"
 	depends on DEBUG_KERNEL && PROC_FS
-- 
1.9.3

      parent reply	other threads:[~2014-09-12 13:19 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-12 13:16 [PATCH v4 0/3] sched: Always check the integrity of the canary Aaron Tomlin
2014-09-12 13:16 ` [PATCH v4 1/3] init/main.c: Give init_task a canary Aaron Tomlin
2014-09-18 20:27   ` Oleg Nesterov
2014-09-12 13:16 ` [PATCH v4 2/3] sched: Add helper for task stack page overrun checking Aaron Tomlin
2014-09-12 13:16 ` Aaron Tomlin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1410527779-8133-4-git-send-email-atomlin@redhat.com \
    --to=atomlin@redhat$(echo .)com \
    --cc=akpm@google$(echo .)com \
    --cc=akpm@linux-foundation$(echo .)org \
    --cc=aneesh.kumar@linux$(echo .)vnet.ibm.com \
    --cc=bmr@redhat$(echo .)com \
    --cc=dzickus@redhat$(echo .)com \
    --cc=hannes@cmpxchg$(echo .)org \
    --cc=jcastillo@redhat$(echo .)com \
    --cc=jgh@redhat$(echo .)com \
    --cc=linux-kernel@vger$(echo .)kernel.org \
    --cc=linuxppc-dev@lists$(echo .)ozlabs.org \
    --cc=minchan@kernel$(echo .)org \
    --cc=mingo@redhat$(echo .)com \
    --cc=oleg@redhat$(echo .)com \
    --cc=peterz@infradead$(echo .)org \
    --cc=prarit@redhat$(echo .)com \
    --cc=riel@redhat$(echo .)com \
    --cc=rostedt@goodmis$(echo .)org \
    --cc=tglx@linutronix$(echo .)de \
    --cc=x86@kernel$(echo .)org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox