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