aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib/surface/byte_buffer_reader.c
diff options
context:
space:
mode:
authorGravatar David Garcia Quintas <dgq@google.com>2016-05-05 18:25:34 -0700
committerGravatar David Garcia Quintas <dgq@google.com>2016-05-05 18:26:13 -0700
commit303d3082a07363c29dc747e986658fd6c8dc4053 (patch)
treeb4def2842e1c764354e1c190218c8b02bfe1a26f /src/core/lib/surface/byte_buffer_reader.c
parent900ed58732c139f66fa93e06ba0b136dc5067868 (diff)
Fixed compression interop and re-enable for C++.
Also added some defense in depth for compression algorithms in the receive path.
Diffstat (limited to 'src/core/lib/surface/byte_buffer_reader.c')
-rw-r--r--src/core/lib/surface/byte_buffer_reader.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/core/lib/surface/byte_buffer_reader.c b/src/core/lib/surface/byte_buffer_reader.c
index 809fd5f1fa..c7f941525d 100644
--- a/src/core/lib/surface/byte_buffer_reader.c
+++ b/src/core/lib/surface/byte_buffer_reader.c
@@ -62,12 +62,19 @@ void grpc_byte_buffer_reader_init(grpc_byte_buffer_reader *reader,
case GRPC_BB_RAW:
gpr_slice_buffer_init(&decompressed_slices_buffer);
if (is_compressed(reader->buffer_in)) {
- grpc_msg_decompress(reader->buffer_in->data.raw.compression,
- &reader->buffer_in->data.raw.slice_buffer,
- &decompressed_slices_buffer);
- reader->buffer_out =
- grpc_raw_byte_buffer_create(decompressed_slices_buffer.slices,
- decompressed_slices_buffer.count);
+ if (grpc_msg_decompress(reader->buffer_in->data.raw.compression,
+ &reader->buffer_in->data.raw.slice_buffer,
+ &decompressed_slices_buffer) < 0) {
+ gpr_log(GPR_ERROR,
+ "Unexpected error decompressing data for algorithm with enum "
+ "value '%d'. Reading data as if it were uncompressed.",
+ reader->buffer_in->data.raw.compression);
+ reader->buffer_out = reader->buffer_in;
+ } else { /* all fine */
+ reader->buffer_out =
+ grpc_raw_byte_buffer_create(decompressed_slices_buffer.slices,
+ decompressed_slices_buffer.count);
+ }
gpr_slice_buffer_destroy(&decompressed_slices_buffer);
} else { /* not compressed, use the input buffer as output */
reader->buffer_out = reader->buffer_in;