Improve error message for strutils.addf (#20157)

Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
This commit is contained in:
konsumlamm 2022-08-05 19:44:21 +02:00 • committed by GitHub
commit 3fef2fd52c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -2698,8 +2698,8 @@ func findNormalized(x: string, inArray: openArray[string]): int =
# security hole... # security hole...
return -1 return -1
func invalidFormatString() {.noinline.} = func invalidFormatString(formatstr: string) {.noinline.} =
raise newException(ValueError, "invalid format string") raise newException(ValueError, "invalid format string: " & formatstr)
func addf*(s: var string, formatstr: string, a: varargs[string, `$`]) {.rtl, func addf*(s: var string, formatstr: string, a: varargs[string, `$`]) {.rtl,
extern: "nsuAddf".} = extern: "nsuAddf".} =
@ -2711,7 +2711,7 @@ func addf*(s: var string, formatstr: string, a: varargs[string, `$`]) {.rtl,
if formatstr[i] == '$' and i+1 < len(formatstr): if formatstr[i] == '$' and i+1 < len(formatstr):
case formatstr[i+1] case formatstr[i+1]
of '#': of '#':
if num > a.high: invalidFormatString() if num > a.high: invalidFormatString(formatstr)
add s, a[num] add s, a[num]
inc i, 2 inc i, 2
inc num inc num
@ -2727,7 +2727,7 @@ func addf*(s: var string, formatstr: string, a: varargs[string, `$`]) {.rtl,
j = j * 10 + ord(formatstr[i]) - ord('0') j = j * 10 + ord(formatstr[i]) - ord('0')
inc(i) inc(i)
let idx = if not negative: j-1 else: a.len-j let idx = if not negative: j-1 else: a.len-j
if idx < 0 or idx > a.high: invalidFormatString() if idx < 0 or idx > a.high: invalidFormatString(formatstr)
add s, a[idx] add s, a[idx]
of '{': of '{':
var j = i+2 var j = i+2
@ -2744,22 +2744,22 @@ func addf*(s: var string, formatstr: string, a: varargs[string, `$`]) {.rtl,
inc(j) inc(j)
if isNumber == 1: if isNumber == 1:
let idx = if not negative: k-1 else: a.len-k let idx = if not negative: k-1 else: a.len-k
if idx < 0 or idx > a.high: invalidFormatString() if idx < 0 or idx > a.high: invalidFormatString(formatstr)
add s, a[idx] add s, a[idx]
else: else:
var x = findNormalized(substr(formatstr, i+2, j-1), a) var x = findNormalized(substr(formatstr, i+2, j-1), a)
if x >= 0 and x < high(a): add s, a[x+1] if x >= 0 and x < high(a): add s, a[x+1]
else: invalidFormatString() else: invalidFormatString(formatstr)
i = j+1 i = j+1
of 'a'..'z', 'A'..'Z', '\128'..'\255', '_': of 'a'..'z', 'A'..'Z', '\128'..'\255', '_':
var j = i+1 var j = i+1
while j < formatstr.len and formatstr[j] in PatternChars: inc(j) while j < formatstr.len and formatstr[j] in PatternChars: inc(j)
var x = findNormalized(substr(formatstr, i+1, j-1), a) var x = findNormalized(substr(formatstr, i+1, j-1), a)
if x >= 0 and x < high(a): add s, a[x+1] if x >= 0 and x < high(a): add s, a[x+1]
else: invalidFormatString() else: invalidFormatString(formatstr)
i = j i = j
else: else:
invalidFormatString() invalidFormatString(formatstr)
else: else:
add s, formatstr[i] add s, formatstr[i]
inc(i) inc(i)