encoding/simplifiedchinese: fix incorrect transform count to avoid infinite loop If the final character in the source buffer is a single '~' escape character, size is not updated. The loop either doesn't make progress if size is zero, or size retains the value from a previous iteration which may return an incorrect source bytes consumed count. Count the single '~' as 1 byte consumed. Fixes golang/go#35118 Change-Id: I3eadf1b4cb632a7c4dc4255325b467a6907c10c0 Reviewed-on: https://go-review.googlesource.com/c/text/+/220460 Reviewed-by: Nigel Tao <nigeltao@golang.org> Trust: Nigel Tao <nigeltao@golang.org> Trust: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/encoding/simplifiedchinese/all_test.go b/encoding/simplifiedchinese/all_test.go index b369da2..a556c94 100644 --- a/encoding/simplifiedchinese/all_test.go +++ b/encoding/simplifiedchinese/all_test.go
@@ -53,6 +53,8 @@ {dec, GB18030, strings.Repeat("\xfe\x30", n), strings.Repeat("\ufffd0", n)}, {dec, HZGB2312, "~/", "\ufffd"}, + {dec, HZGB2312, "~", "\ufffd"}, + {dec, HZGB2312, "~~~", "~\ufffd"}, {dec, HZGB2312, "~{a\x80", "\ufffd"}, {dec, HZGB2312, "~{a\x80", "\ufffd"}, {dec, HZGB2312, "~{" + strings.Repeat("z~", n), strings.Repeat("\ufffd", n)},
diff --git a/encoding/simplifiedchinese/hzgb2312.go b/encoding/simplifiedchinese/hzgb2312.go index eb3157f..e15b7bf 100644 --- a/encoding/simplifiedchinese/hzgb2312.go +++ b/encoding/simplifiedchinese/hzgb2312.go
@@ -57,7 +57,7 @@ err = transform.ErrShortSrc break loop } - r = utf8.RuneError + r, size = utf8.RuneError, 1 goto write } size = 2