From 7dfe71606861da9ab1cece3c416f5231d5b4003a Mon Sep 17 00:00:00 2001 From: Doug Fawley Date: Fri, 1 Nov 2019 15:27:05 -0700 Subject: [PATCH 1/5] test: add test of malformed gzip payload --- test/end2end_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/test/end2end_test.go b/test/end2end_test.go index 9f42bd2c261..8e9097fc8ab 100644 --- a/test/end2end_test.go +++ b/test/end2end_test.go @@ -24,6 +24,7 @@ package test import ( "bufio" "bytes" + "compress/gzip" "context" "crypto/tls" "errors" @@ -7525,3 +7526,46 @@ func (s) TestClientCancellationPropagatesUnary(t *testing.T) { } wg.Wait() } + +type badGzipCompressor struct{} + +func (badGzipCompressor) Do(w io.Writer, p []byte) error { + buf := &bytes.Buffer{} + gzw := gzip.NewWriter(buf) + if _, err := gzw.Write(p); err != nil { + return err + } + err := gzw.Close() + bs := buf.Bytes() + bs[len(bs)-4] -= 1 // modify checksum (big endian) at end by 1 byte + buf = bytes.NewBuffer(bs) + buf.WriteTo(w) + return err +} + +func (badGzipCompressor) Type() string { + return "gzip" +} + +func (s) TestGzipWithoutFooter(t *testing.T) { + ss := &stubServer{ + unaryCall: func(ctx context.Context, _ *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { + return &testpb.SimpleResponse{}, nil + }, + } + if err := ss.Start(nil, grpc.WithCompressor(badGzipCompressor{})); err != nil { + t.Fatalf("Error starting endpoint server: %v", err) + } + defer ss.Stop() + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + p, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(1024)) + if err != nil { + panic(err) + } + if _, err := ss.client.UnaryCall(ctx, &testpb.SimpleRequest{Payload: p}); err == nil || status.Code(err) != codes.Internal { + t.Errorf("ss.client.UnaryCall(_) = _, %v; want _, Code()=codes.Internal", err) + } +} From afc938a23495ca82d0440da49c5e7a62ff0f4c99 Mon Sep 17 00:00:00 2001 From: Doug Fawley Date: Tue, 5 Nov 2019 09:46:07 -0800 Subject: [PATCH 2/5] vet --- test/end2end_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/end2end_test.go b/test/end2end_test.go index 8e9097fc8ab..d8f3821430c 100644 --- a/test/end2end_test.go +++ b/test/end2end_test.go @@ -7537,7 +7537,7 @@ func (badGzipCompressor) Do(w io.Writer, p []byte) error { } err := gzw.Close() bs := buf.Bytes() - bs[len(bs)-4] -= 1 // modify checksum (big endian) at end by 1 byte + bs[len(bs)-4]-- // modify checksum (big endian) at end by 1 byte buf = bytes.NewBuffer(bs) buf.WriteTo(w) return err From 7f138c9755d8867d1eebd1547f166f33de715a8d Mon Sep 17 00:00:00 2001 From: Doug Fawley Date: Tue, 5 Nov 2019 09:54:39 -0800 Subject: [PATCH 3/5] review comments --- test/end2end_test.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/test/end2end_test.go b/test/end2end_test.go index d8f3821430c..1a45635cd52 100644 --- a/test/end2end_test.go +++ b/test/end2end_test.go @@ -7537,9 +7537,10 @@ func (badGzipCompressor) Do(w io.Writer, p []byte) error { } err := gzw.Close() bs := buf.Bytes() - bs[len(bs)-4]-- // modify checksum (big endian) at end by 1 byte - buf = bytes.NewBuffer(bs) - buf.WriteTo(w) + if len(bs) >= 4 { + bs[len(bs)-4]-- // modify checksum (big endian) at end by 1 byte + } + w.Write(bs) return err } @@ -7547,7 +7548,7 @@ func (badGzipCompressor) Type() string { return "gzip" } -func (s) TestGzipWithoutFooter(t *testing.T) { +func (s) TestGzipBadChecksum(t *testing.T) { ss := &stubServer{ unaryCall: func(ctx context.Context, _ *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { return &testpb.SimpleResponse{}, nil @@ -7563,9 +7564,11 @@ func (s) TestGzipWithoutFooter(t *testing.T) { p, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(1024)) if err != nil { - panic(err) + t.Fatalf("Unexpected error from newPayload: %v", err) } - if _, err := ss.client.UnaryCall(ctx, &testpb.SimpleRequest{Payload: p}); err == nil || status.Code(err) != codes.Internal { - t.Errorf("ss.client.UnaryCall(_) = _, %v; want _, Code()=codes.Internal", err) + if _, err := ss.client.UnaryCall(ctx, &testpb.SimpleRequest{Payload: p}); err == nil || + status.Code(err) != codes.Internal || + !strings.Contains(status.Convert(err).Message(), gzip.ErrChecksum.Error()) { + t.Errorf("ss.client.UnaryCall(_) = _, %v\n\twant: _, status(codes.Internal, contains %q)", err, gzip.ErrChecksum) } } From 4007a6c8e8967a5dae645290420ebe9d9624c1b7 Mon Sep 17 00:00:00 2001 From: Doug Fawley Date: Tue, 5 Nov 2019 10:02:38 -0800 Subject: [PATCH 4/5] modify csum instead of length --- test/end2end_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/end2end_test.go b/test/end2end_test.go index 1a45635cd52..61ca9bc819e 100644 --- a/test/end2end_test.go +++ b/test/end2end_test.go @@ -7537,8 +7537,8 @@ func (badGzipCompressor) Do(w io.Writer, p []byte) error { } err := gzw.Close() bs := buf.Bytes() - if len(bs) >= 4 { - bs[len(bs)-4]-- // modify checksum (big endian) at end by 1 byte + if len(bs) >= 6 { + bs[len(bs)-6] ^= 1 // modify checksum at end by 1 byte } w.Write(bs) return err From 55f2f35dd06dc94f4a8f47031d6476455c17ef90 Mon Sep 17 00:00:00 2001 From: Doug Fawley Date: Tue, 5 Nov 2019 10:24:34 -0800 Subject: [PATCH 5/5] empty commit