proto: fix MarshalAppend fast path
Was overwriting the output buffer rather than appending to it.
Change-Id: I6ffb72a440f464f4259cfebc42c1dc75b73fb5ae
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/171117
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/proto/encode.go b/proto/encode.go
index 1626c3f..98410a6 100644
--- a/proto/encode.go
+++ b/proto/encode.go
@@ -65,18 +65,18 @@
// MarshalAppend appends the wire-format encoding of m to b,
// returning the result.
func (o MarshalOptions) MarshalAppend(b []byte, m Message) ([]byte, error) {
- b, err := o.marshalMessageFast(b, m)
+ out, err := o.marshalMessageFast(b, m)
if err == errInternalNoFast {
- b, err = o.marshalMessage(b, m.ProtoReflect())
+ out, err = o.marshalMessage(b, m.ProtoReflect())
}
var nerr errors.NonFatal
if !nerr.Merge(err) {
- return b, err
+ return out, err
}
if !o.AllowPartial {
nerr.Merge(IsInitialized(m))
}
- return b, nerr.E
+ return out, nerr.E
}
func (o MarshalOptions) marshalMessageFast(b []byte, m Message) ([]byte, error) {
diff --git a/proto/encode_test.go b/proto/encode_test.go
index b9e04b9..30722e0 100644
--- a/proto/encode_test.go
+++ b/proto/encode_test.go
@@ -9,6 +9,8 @@
protoV1 "github.com/golang/protobuf/proto"
"github.com/golang/protobuf/v2/proto"
"github.com/google/go-cmp/cmp"
+
+ test3pb "github.com/golang/protobuf/v2/internal/testprotos/test3"
)
func TestEncode(t *testing.T) {
@@ -105,3 +107,17 @@
}
}
}
+
+func TestMarshalAppend(t *testing.T) {
+ want := []byte("prefix")
+ got := append([]byte(nil), want...)
+ got, err := proto.MarshalOptions{}.MarshalAppend(got, &test3pb.TestAllTypes{
+ OptionalString: "value",
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !bytes.HasPrefix(got, want) {
+ t.Fatalf("MarshalAppend modified prefix: got %v, want prefix %v", got, want)
+ }
+}