diff options
author | pgkos <pg.kosinski@gmail.com> | 2017-03-26 09:42:15 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-03-26 09:42:15 +0200 |
commit | 481d8ba24afaffdc926795a42150e5cd1e1c69b3 (patch) | |
tree | fbb46cc9f20e6a806dc77c30b878ccf61183d8d8 /lib | |
parent | 1268ca79e5436e33a9fca0999477adf8f3e937ae (diff) | |
download | Nim-481d8ba24afaffdc926795a42150e5cd1e1c69b3.tar.gz |
Fix segfault in db_mysql fastRows (#5605)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/impure/db_mysql.nim | 24 |
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) |