1
0
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:
Josselin Costanzi 2017-03-05 18:04:30 +01:00 committed by Ian Lance Taylor
parent 0efc8b2188
commit 5ce06cf71d
2 changed files with 6 additions and 2 deletions

View File

@ -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)
}
}

View File

@ -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)))