fix segfault when calling shallow() on an empty string (#9782) [backport]

shallow() casts its string argument to a seq and then tries to access
its fields. Guess what happens when that string is nil, which seems to
be the representation of an empty string (both the default value and an
explicitly assigned "").

Segfault encountered when running "ntags -R ." on a large project. The relevant line:
a1c62c38e5/ntags.nim (lines-125)
This commit is contained in:
Ștefan Talpalaru
2018-11-22 14:47:27 +01:00
committed by Andreas Rumpf
parent c7eba64dee
commit f8fa94cb20
2 changed files with 9 additions and 0 deletions

View File

@@ -4028,6 +4028,8 @@ proc shallow*(s: var string) {.noSideEffect, inline.} =
## purposes.
when not defined(JS) and not defined(nimscript) and not defined(gcDestructors):
var s = cast[PGenericSeq](s)
if s == nil:
s = cast[PGenericSeq](newString(0))
# string literals cannot become 'shallow':
if (s.reserved and strlitFlag) == 0:
s.reserved = s.reserved or seqShallowFlag

View File

@@ -23,3 +23,10 @@ when true:
doAssert s == "fooabc"
echo x
# casting an empty string as sequence with shallow() should not segfault
var s2: string
shallow(s2)
s2 &= "foo"
doAssert s2 == "foo"