proto: validate UTF-8 in proto3 strings

Change-Id: I6a495730c3f438e7b2c4ca86edade7d6f25aa47d
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/171700
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/proto/encode.go b/proto/encode.go
index b294392..8635790 100644
--- a/proto/encode.go
+++ b/proto/encode.go
@@ -182,13 +182,13 @@
 	switch {
 	case field.Cardinality() != protoreflect.Repeated:
 		b = wire.AppendTag(b, num, wireTypes[kind])
-		return o.marshalSingular(b, num, kind, value)
+		return o.marshalSingular(b, num, field, value)
 	case field.IsMap():
 		return o.marshalMap(b, num, kind, field.MessageType(), value.Map())
 	case field.IsPacked():
-		return o.marshalPacked(b, num, kind, value.List())
+		return o.marshalPacked(b, num, field, value.List())
 	default:
-		return o.marshalList(b, num, kind, value.List())
+		return o.marshalList(b, num, field, value.List())
 	}
 }
 
@@ -229,13 +229,13 @@
 	mapsort.Range(mapv, kind, f)
 }
 
-func (o MarshalOptions) marshalPacked(b []byte, num wire.Number, kind protoreflect.Kind, list protoreflect.List) ([]byte, error) {
+func (o MarshalOptions) marshalPacked(b []byte, num wire.Number, field protoreflect.FieldDescriptor, list protoreflect.List) ([]byte, error) {
 	b = wire.AppendTag(b, num, wire.BytesType)
 	b, pos := appendSpeculativeLength(b)
 	var nerr errors.NonFatal
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		var err error
-		b, err = o.marshalSingular(b, num, kind, list.Get(i))
+		b, err = o.marshalSingular(b, num, field, list.Get(i))
 		if !nerr.Merge(err) {
 			return b, err
 		}
@@ -244,12 +244,13 @@
 	return b, nerr.E
 }
 
-func (o MarshalOptions) marshalList(b []byte, num wire.Number, kind protoreflect.Kind, list protoreflect.List) ([]byte, error) {
+func (o MarshalOptions) marshalList(b []byte, num wire.Number, field protoreflect.FieldDescriptor, list protoreflect.List) ([]byte, error) {
+	kind := field.Kind()
 	var nerr errors.NonFatal
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		var err error
 		b = wire.AppendTag(b, num, wireTypes[kind])
-		b, err = o.marshalSingular(b, num, kind, list.Get(i))
+		b, err = o.marshalSingular(b, num, field, list.Get(i))
 		if !nerr.Merge(err) {
 			return b, err
 		}