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)

(cherry picked from commit f8fa94cb20)
This commit is contained in:
Ștefan Talpalaru
2018-11-22 14:47:27 +01:00
committed by narimiran
parent 9fcdc14527
commit 7dfb2a8cd3
2 changed files with 9 additions and 0 deletions

View File

@@ -3974,6 +3974,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"