[commit: ghc] master: Check for integer overflow in osGetMBlocks (4886552)

git at git.haskell.org git at git.haskell.org
Fri Aug 30 00:17:10 CEST 2013


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/48865521de6638240819b3979edbb3d33401dc8e/ghc

>---------------------------------------------------------------

commit 48865521de6638240819b3979edbb3d33401dc8e
Author: Reid Barton <rwbarton at gmail.com>
Date:   Wed Aug 28 17:08:19 2013 -0400

    Check for integer overflow in osGetMBlocks
    
    Fixes Trac #5188.
    
    Signed-off-by: Austin Seipp <aseipp at pobox.com>


>---------------------------------------------------------------

48865521de6638240819b3979edbb3d33401dc8e
 rts/posix/OSMem.c |   13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/rts/posix/OSMem.c b/rts/posix/OSMem.c
index 26aebc2..000ad63 100644
--- a/rts/posix/OSMem.c
+++ b/rts/posix/OSMem.c
@@ -177,7 +177,18 @@ void *
 osGetMBlocks(nat n)
 {
   caddr_t ret;
-  W_ size = MBLOCK_SIZE * (W_)n;
+  W_ size;
+
+  // Compute size = MBLOCK_SIZE * (W_)n,
+  // while testing for integer overflow.
+  // We assume that W_ is at least as large a type as nat.
+  if ((W_)n > ((W_)-1) / MBLOCK_SIZE) {
+      // We tried to allocate, say, 4 GB or more on a 32-bit system.
+      errorBelch("out of memory (requested %d MBlocks)", n);
+      stg_exit(EXIT_FAILURE);
+  } else {
+      size = MBLOCK_SIZE * (W_)n;
+  }
 
   if (next_request == 0) {
       // use gen_map_mblocks the first time.





More information about the ghc-commits mailing list