public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1 v2] kernel/fork.c: avoid division by zero
@ 2015-02-17 19:01 Heinrich Schuchardt
  2015-02-17 23:15 ` Andrew Morton
  0 siblings, 1 reply; 41+ messages in thread
From: Heinrich Schuchardt @ 2015-02-17 19:01 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Kirill A. Shutemov, Peter Zijlstra, Oleg Nesterov, Rik van Riel,
	Vladimir Davydov, Thomas Gleixner, David Rientjes, Kees Cook,
	linux-kernel, Guenter Roeck, Heinrich Schuchardt

PAGE_SIZE is not guaranteed to be equal to or less than 8 times the
THREAD_SIZE.

E.g. architecture hexagon may have page size 1M and thread size 4096.

This would lead to a division by zero.

The futex implementation assumes that tids fit into the FUTEX_TID_MASK.
This limits the number of allowable threads.

version 2:
  * use div64_u64
  * check against FUTEX_TID_MASK

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
 kernel/fork.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/kernel/fork.c b/kernel/fork.c
index cf65139..1449923 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -74,6 +74,7 @@
 #include <linux/uprobes.h>
 #include <linux/aio.h>
 #include <linux/compiler.h>
+#include <linux/math64.h>
 
 #include <asm/pgtable.h>
 #include <asm/pgalloc.h>
@@ -255,6 +256,8 @@ void __init __weak arch_task_cache_init(void) { }
 
 void __init fork_init(unsigned long mempages)
 {
+	u64 temp;
+
 #ifndef CONFIG_ARCH_TASK_STRUCT_ALLOCATOR
 #ifndef ARCH_MIN_TASKALIGN
 #define ARCH_MIN_TASKALIGN	L1_CACHE_BYTES
@@ -273,7 +276,16 @@ void __init fork_init(unsigned long mempages)
 	 * value: the thread structures can take up at most half
 	 * of memory.
 	 */
-	max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
+	temp = div64_u64((u64) mempages * (u64) PAGE_SIZE,
+			 (u64) THREAD_SIZE * 8UL);
+
+	/*
+	 * The futex code assumes that tids fit into the FUTEX_TID_MASK.
+	 */
+	if (temp < FUTEX_TID_MASK)
+		max_threads = temp;
+	else
+		max_threads = FUTEX_TID_MASK;
 
 	/*
 	 * we need to allow at least 20 threads to boot a system
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 41+ messages in thread

end of thread, other threads:[~2015-02-25 21:07 UTC | newest]

Thread overview: 41+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-17 19:01 [PATCH 1/1 v2] kernel/fork.c: avoid division by zero Heinrich Schuchardt
2015-02-17 23:15 ` Andrew Morton
2015-02-18 19:38   ` Guenter Roeck
2015-02-18 19:50     ` Heinrich Schuchardt
2015-02-18 20:23       ` Guenter Roeck
2015-02-18 19:47   ` Heinrich Schuchardt
2015-02-18 20:28     ` Andrew Morton
2015-02-21 22:19       ` [PATCH 0/3 v3] kernel/fork.c max_thread handling Heinrich Schuchardt
2015-02-21 22:19         ` [PATCH 1/3 v3] kernel/fork.c: avoid division by zero Heinrich Schuchardt
2015-02-22  7:58           ` Ingo Molnar
2015-02-23 20:14             ` [PATCH 0/4 v4] max_threadx handling Heinrich Schuchardt
2015-02-23 20:14               ` [PATCH 1/4 v4] kernel/fork.c: new function for max_threads Heinrich Schuchardt
2015-02-23 20:14               ` [PATCH 2/4 v4] kernel/fork.c: avoid division by zero Heinrich Schuchardt
2015-02-23 21:10                 ` Peter Zijlstra
2015-02-23 21:29                   ` Heinrich Schuchardt
2015-02-24  7:35                 ` Ingo Molnar
2015-02-23 20:14               ` [PATCH 3/4 v4] kernel/sysctl.c: threads-max observe limits Heinrich Schuchardt
2015-02-23 20:14               ` [PATCH 4/4 v4] kernel/fork.c: memory hotplug updates max_threads Heinrich Schuchardt
2015-02-23 20:50                 ` Oleg Nesterov
2015-02-23 20:54                   ` Oleg Nesterov
2015-02-23 21:11                     ` Heinrich Schuchardt
2015-02-23 21:46                       ` Oleg Nesterov
2015-02-24 19:38               ` [PATCH 0/3 v5] max_threadx handling Heinrich Schuchardt
2015-02-24 19:38                 ` [PATCH 1/3 v5] kernel/fork.c: new function for max_threads Heinrich Schuchardt
2015-02-24 21:03                   ` David Rientjes
2015-02-24 21:23                     ` Heinrich Schuchardt
2015-02-24 22:16                       ` David Rientjes
2015-02-25  7:21                         ` Heinrich Schuchardt
2015-02-25 10:17                         ` Ingo Molnar
2015-02-25 19:08                           ` Heinrich Schuchardt
2015-02-25 21:07                             ` David Rientjes
2015-02-24 19:38                 ` [PATCH 2/3 v5] kernel/fork.c: avoid division by zero Heinrich Schuchardt
2015-02-24 21:14                   ` David Rientjes
2015-02-24 19:38                 ` [PATCH 3/3] kernel/sysctl.c: threads-max observe limits Heinrich Schuchardt
2015-02-24 21:17                   ` David Rientjes
2015-02-24 21:31                     ` Heinrich Schuchardt
2015-02-24 22:20                       ` David Rientjes
2015-02-25 18:47                         ` Heinrich Schuchardt
2015-02-25 20:47                           ` David Rientjes
2015-02-21 22:19         ` [PATCH 2/3 v3] " Heinrich Schuchardt
2015-02-21 22:19         ` [PATCH 3/3 v3] kernel/fork.c: memory hotplug updates max_threads Heinrich Schuchardt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox