summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorpgkos <pg.kosinski@gmail.com>2017-03-26 09:42:15 +0200
committerAndreas Rumpf <rumpf_a@web.de>2017-03-26 09:42:15 +0200
commit481d8ba24afaffdc926795a42150e5cd1e1c69b3 (patch)
treefbb46cc9f20e6a806dc77c30b878ccf61183d8d8 /lib
parent1268ca79e5436e33a9fca0999477adf8f3e937ae (diff)
downloadNim-481d8ba24afaffdc926795a42150e5cd1e1c69b3.tar.gz
Fix segfault in db_mysql fastRows (#5605)
Diffstat (limited to 'lib')
-rw-r--r--lib/impure/db_mysql.nim24
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/impure/db_mysql.nim b/lib/impure/db_mysql.nim
index 1b7f1de61..1b79b3543 100644
--- a/lib/impure/db_mysql.nim
+++ b/lib/impure/db_mysql.nim
@@ -173,17 +173,33 @@ iterator fastRows*(db: DbConn, query: SqlQuery,
   rawExec(db, query, args)
   var sqlres = mysql.useResult(db)
   if sqlres != nil:
-    var L = int(mysql.numFields(sqlres))
-    var result = newRow(L)
-    var row: cstringArray
+    var
+      L = int(mysql.numFields(sqlres))
+      row: cstringArray
+      result: Row
+      backup: Row
+    newSeq(result, L)
     while true:
       row = mysql.fetchRow(sqlres)
       if row == nil: break
       for i in 0..L-1:
-        setLen(result[i], 0)
         if row[i] == nil:
+          if backup == nil:
+            newSeq(backup, L)
+          if backup[i] == nil and result[i] != nil:
+            shallowCopy(backup[i], result[i])
           result[i] = nil
         else:
+          if result[i] == nil:
+            if backup != nil:
+              if backup[i] == nil:
+                backup[i] = ""
+              shallowCopy(result[i], backup[i])
+              setLen(result[i], 0)
+            else:
+              result[i] = ""
+          else:
+            setLen(result[i], 0)
           add(result[i], row[i])
       yield result
     properFreeResult(sqlres, row)