mirror of
https://github.com/golang/go
synced 2024-11-18 13:54:59 -07:00
encoding/base64: fix decode reports incorrect index
Fix Decode to return the correct illegal data index from a corrupted input that contains whitespaces. Fixes #19406 Change-Id: Ib2b2b6ed7e41f024d0da2bd035caec4317c2869c Reviewed-on: https://go-review.googlesource.com/37837 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
0efc8b2188
commit
5ce06cf71d
@ -254,6 +254,7 @@ func (e CorruptInputError) Error() string {
|
||||
// indicates if end-of-message padding or a partial quantum was encountered
|
||||
// and thus any additional data is an error.
|
||||
func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
|
||||
var inIdx int
|
||||
si := 0
|
||||
|
||||
// skip over newlines
|
||||
@ -275,6 +276,7 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
|
||||
break
|
||||
}
|
||||
in := src[si]
|
||||
inIdx = si
|
||||
|
||||
si++
|
||||
// skip over newlines
|
||||
@ -287,7 +289,7 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
|
||||
switch j {
|
||||
case 0, 1:
|
||||
// incorrect padding
|
||||
return n, false, CorruptInputError(si - 1)
|
||||
return n, false, CorruptInputError(inIdx)
|
||||
case 2:
|
||||
// "==" is expected, the first "=" is already consumed.
|
||||
if si == len(src) {
|
||||
@ -314,7 +316,7 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
|
||||
}
|
||||
dbuf[j] = enc.decodeMap[in]
|
||||
if dbuf[j] == 0xFF {
|
||||
return n, false, CorruptInputError(si - 1)
|
||||
return n, false, CorruptInputError(inIdx)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -220,6 +220,8 @@ func TestDecodeCorrupt(t *testing.T) {
|
||||
{"AAAA", -1},
|
||||
{"AAAAAA=", 7},
|
||||
{"YWJjZA=====", 8},
|
||||
{"A!\n", 1},
|
||||
{"A=\n", 1},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
dbuf := make([]byte, StdEncoding.DecodedLen(len(tc.input)))
|
||||
|
Loading…
Reference in New Issue
Block a user