From 05121d84b33c1fd765d6998d01ef530592590ea6 Mon Sep 17 00:00:00 2001 From: Araq Date: Wed, 8 Aug 2018 12:05:29 +0200 Subject: fixes a long standing nil bug in substr --- lib/system/sysstr.nim | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/system/sysstr.nim') diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index 19c2c62ad..77f2ca040 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -95,6 +95,7 @@ proc mnewString(len: int): NimString {.compilerProc.} = proc copyStrLast(s: NimString, start, last: int): NimString {.compilerProc.} = let start = max(start, 0) + if s == nil: return nil let len = min(last, s.len-1) - start + 1 if len > 0: result = rawNewStringNoInit(len) -- cgit 1.4.1-2-gfad0 From babd31360a93b1c17d33240c82391761e8419a95 Mon Sep 17 00:00:00 2001 From: Araq Date: Wed, 8 Aug 2018 18:22:48 +0200 Subject: fixes more nil string bugs --- lib/packages/docutils/rstgen.nim | 7 +++---- lib/pure/strutils.nim | 10 ++++++---- lib/system/sysstr.nim | 1 + 3 files changed, 10 insertions(+), 8 deletions(-) (limited to 'lib/system/sysstr.nim') diff --git a/lib/packages/docutils/rstgen.nim b/lib/packages/docutils/rstgen.nim index 43a429a17..db9a83755 100644 --- a/lib/packages/docutils/rstgen.nim +++ b/lib/packages/docutils/rstgen.nim @@ -312,7 +312,6 @@ proc setIndexTerm*(d: var RstGenerator, id, term: string, ## The index won't be written to disk unless you call `writeIndexFile() ## <#writeIndexFile>`_. The purpose of the index is documented in the `docgen ## tools guide `_. - assert(not d.theIndex.isNil) var entry = term isTitle = false @@ -337,7 +336,7 @@ proc hash(n: PRstNode): int = result = hash(n.text) elif n.len > 0: result = hash(n.sons[0]) - for i in 1 .. $2 """, [url, text, desc]) else: - result.addf("""
  • $2
  • """, [url, text]) inc j @@ -524,7 +523,7 @@ proc generateDocumentationTOC(entries: seq[IndexEntry]): string = titleTag = levels[L].text else: result.add(level.indentToLevel(levels[L].level)) - result.addf("""
  • + result.addf("""
  • $3
  • """, [titleTag & " : " & levels[L].text, link, levels[L].text]) inc L diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index 4aede541a..989a832cf 100644 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -1366,9 +1366,11 @@ proc find*(s: string, sub: char, start: Natural = 0, last: Natural = 0): int {.n if sub == s[i]: return i else: when hasCStringBuiltin: - let found = c_memchr(s[start].unsafeAddr, sub, last-start+1) - if not found.isNil: - return cast[ByteAddress](found) -% cast[ByteAddress](s.cstring) + let L = last-start+1 + if L > 0: + let found = c_memchr(s[start].unsafeAddr, sub, L) + if not found.isNil: + return cast[ByteAddress](found) -% cast[ByteAddress](s.cstring) else: for i in start..last: if sub == s[i]: return i @@ -1515,7 +1517,7 @@ proc replace*(s, sub: string, by = ""): string {.noSideEffect, elif subLen == 1: # when the pattern is a single char, we use a faster # char-based search that doesn't need a skip table: - var c = sub[0] + let c = sub[0] let last = s.high var i = 0 while true: diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index 77f2ca040..0e690d832 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -110,6 +110,7 @@ proc nimToCStringConv(s: NimString): cstring {.compilerProc, inline.} = else: result = cstring(addr s.data) proc copyStr(s: NimString, start: int): NimString {.compilerProc.} = + if s == nil: return nil result = copyStrLast(s, start, s.len-1) proc toNimStr(str: cstring, len: int): NimString {.compilerProc.} = -- cgit 1.4.1-2-gfad0