summary refs log tree commit diff stats
path: root/lib/pure
diff options
context:
space:
mode:
authorSam Wang <Sam647254@users.noreply.github.com>2019-12-29 08:37:22 -0800
committerAndreas Rumpf <rumpf_a@web.de>2019-12-29 17:37:22 +0100
commit441cacf70f6de5369f3fba5d8bda966277881a71 (patch)
treec5f166895d58d8c802045e66c30798fb88ffeb13 /lib/pure
parentee9ee297d8d79ae17438343a6cb590906609f734 (diff)
downloadNim-441cacf70f6de5369f3fba5d8bda966277881a71.tar.gz
Added fix for handling TaintedStrings in streams and httpclient (#12969)
* Added fix for taint mode in streams and httpclient

* Removed taintMode export from system.nim
Diffstat (limited to 'lib/pure')
-rw-r--r--lib/pure/httpclient.nim8
-rw-r--r--lib/pure/streams.nim12
2 files changed, 14 insertions, 6 deletions
diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim
index a56539898..d9a6192a7 100644
--- a/lib/pure/httpclient.nim
+++ b/lib/pure/httpclient.nim
@@ -367,7 +367,7 @@ proc addFiles*(p: var MultipartData, xs: openArray[tuple[name, file: string]]):
     let (_, fName, ext) = splitFile(file)
     if ext.len > 0:
       contentType = m.getMimetype(ext[1..ext.high], "")
-    p.add(name, readFile(file), fName & ext, contentType)
+    p.add(name, readFile(file).string, fName & ext, contentType)
   result = p
 
 proc `[]=`*(p: var MultipartData, name, content: string) =
@@ -634,7 +634,7 @@ proc parseChunks(client: HttpClient | AsyncHttpClient): Future[void]
                  {.multisync.} =
   while true:
     var chunkSize = 0
-    var chunkSizeStr = await client.socket.recvLine()
+    var chunkSizeStr = (await client.socket.recvLine()).string
     var i = 0
     if chunkSizeStr == "":
       httpError("Server terminated connection prematurely")
@@ -734,9 +734,9 @@ proc parseResponse(client: HttpClient | AsyncHttpClient,
   while true:
     linei = 0
     when client is HttpClient:
-      line = await client.socket.recvLine(client.timeout)
+      line = (await client.socket.recvLine(client.timeout)).string
     else:
-      line = await client.socket.recvLine()
+      line = (await client.socket.recvLine()).string
     if line == "":
       # We've been disconnected.
       client.close()
diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim
index c9547eee1..cdb881960 100644
--- a/lib/pure/streams.nim
+++ b/lib/pure/streams.nim
@@ -96,6 +96,8 @@
 
 include "system/inclrtl"
 
+const taintMode = compileOption("taintmode")
+
 proc newEIO(msg: string): owned(ref IOError) =
   new(result)
   result.msg = msg
@@ -901,7 +903,10 @@ proc readLine*(s: Stream, line: var TaintedString): bool =
   else:
     # fallback
     when nimvm: #Bug #12282
-      line.setLen(0)
+      when taintMode:
+        line.string.setLen(0)
+      else:
+        line.setLen(0)
     else:
       line.string.setLen(0)
     while true:
@@ -914,7 +919,10 @@ proc readLine*(s: Stream, line: var TaintedString): bool =
         if line.len > 0: break
         else: return false
       when nimvm: #Bug #12282
-        line.add(c)
+        when taintMode:
+          line.string.add(c)
+        else:
+          line.add(c)
       else:
         line.string.add(c)
     result = true