internal/impl: catch varint overflow in validator

Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=20477

Change-Id: I6afe82e3818f8b4e9cf5eded2125317eae8be49d
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/217309
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/internal/impl/validate.go b/internal/impl/validate.go
index bf5f60d..eab8ec0 100644
--- a/internal/impl/validate.go
+++ b/internal/impl/validate.go
@@ -360,7 +360,7 @@
 
 			switch wtyp {
 			case wire.VarintType:
-				if len(b) >= 10 {
+				if len(b) >= 9 {
 					switch {
 					case b[0] < 0x80:
 						b = b[1:]
@@ -380,7 +380,7 @@
 						b = b[8:]
 					case b[8] < 0x80:
 						b = b[9:]
-					case b[9] < 0x80:
+					case b[9] < 0x80 && b[9] < 2:
 						b = b[10:]
 					default:
 						return ValidationInvalid
@@ -405,7 +405,7 @@
 						b = b[8:]
 					case len(b) > 8 && b[8] < 0x80:
 						b = b[9:]
-					case len(b) > 9 && b[9] < 0x80:
+					case len(b) > 9 && b[9] < 2:
 						b = b[10:]
 					default:
 						return ValidationInvalid