summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2017-02-03 09:48:52 +0100
committerAndreas Rumpf <rumpf_a@web.de>2017-02-03 09:48:52 +0100
commit04c4d3d77f86086efa2447c0c9b47ba84342d245 (patch)
tree420bc3040326613b2e10047b81da7d1a883ebb62
parent2c6c865b353d0e15783a95886d672288ca7da46c (diff)
downloadNim-04c4d3d77f86086efa2447c0c9b47ba84342d245.tar.gz
critical realloc bugfix; refs #4818
-rw-r--r--lib/system/alloc.nim7
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/system/alloc.nim b/lib/system/alloc.nim
index 6e7801be5..065b13460 100644
--- a/lib/system/alloc.nim
+++ b/lib/system/alloc.nim
@@ -295,10 +295,11 @@ proc writeFreeList(a: MemRegion) =
 proc requestOsChunks(a: var MemRegion, size: int): PBigChunk =
   when not defined(emscripten):
     if not a.blockChunkSizeIncrease:
-      if a.currMem < 64 * 1024:
+      let usedMem = a.currMem # - a.freeMem
+      if usedMem < 64 * 1024:
         a.nextChunkSize = PageSize*4
       else:
-        a.nextChunkSize = min(roundup(a.currMem shr 2, PageSize), a.nextChunkSize * 2)
+        a.nextChunkSize = min(roundup(usedMem shr 2, PageSize), a.nextChunkSize * 2)
   var size = size
 
   if size > a.nextChunkSize:
@@ -708,7 +709,7 @@ proc realloc(allocator: var MemRegion, p: pointer, newsize: Natural): pointer =
   if newsize > 0:
     result = alloc0(allocator, newsize)
     if p != nil:
-      copyMem(result, p, ptrSize(p))
+      copyMem(result, p, min(ptrSize(p), newsize))
       dealloc(allocator, p)
   elif p != nil:
     dealloc(allocator, p)