summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2015-03-04 03:08:38 +0100
committerAndreas Rumpf <rumpf_a@web.de>2015-03-04 03:08:38 +0100
commitb1656f2db43213e3ceb509593ec6c4112905f740 (patch)
tree4e3071fc9e26da43020c74d63568c835cf5a8a2c
parent171de9c35506f0f6ad509b7f1bf14d19fd09af8d (diff)
parent758a883cc6d876646fb31084e361e49b54b89090 (diff)
downloadNim-b1656f2db43213e3ceb509593ec6c4112905f740.tar.gz
Merge pull request #2230 from Archs/devel
streams.ssWriteData: Call setLen only when new data truly increases the underlying string buffer
-rw-r--r--lib/pure/streams.nim10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim
index 67c80e592..e706f2016 100644
--- a/lib/pure/streams.nim
+++ b/lib/pure/streams.nim
@@ -224,10 +224,12 @@ proc ssReadData(s: Stream, buffer: pointer, bufLen: int): int =
 
 proc ssWriteData(s: Stream, buffer: pointer, bufLen: int) = 
   var s = StringStream(s)
-  if bufLen > 0: 
-    setLen(s.data, s.data.len + bufLen)
-    copyMem(addr(s.data[s.pos]), buffer, bufLen)
-    inc(s.pos, bufLen)
+  if bufLen <= 0:
+    return
+  if s.pos + bufLen > s.data.len:
+    setLen(s.data, s.pos + bufLen)
+  copyMem(addr(s.data[s.pos]), buffer, bufLen)
+  inc(s.pos, bufLen)
 
 proc ssClose(s: Stream) =
   var s = StringStream(s)