From 2cf952730daa9e167bf261276fa77fad5312c6ff Mon Sep 17 00:00:00 2001 From: Yang Gao Date: Tue, 17 Feb 2015 11:01:07 -0800 Subject: [PATCH 1/4] Deserialization success should not override earlier failure --- src/cpp/common/call.cc | 2 +- src/cpp/server/server.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc index df800d940dd..9ec93bc6262 100644 --- a/src/cpp/common/call.cc +++ b/src/cpp/common/call.cc @@ -254,7 +254,7 @@ void CallOpBuffer::FinalizeResult(void** tag, bool* status) { if (recv_message_) { if (recv_message_buf_) { got_message = true; - *status = DeserializeProto(recv_message_buf_, recv_message_); + *status &= DeserializeProto(recv_message_buf_, recv_message_); grpc_byte_buffer_destroy(recv_message_buf_); recv_message_buf_ = nullptr; } else { diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index 294eeae5850..35ced54aa78 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -314,7 +314,7 @@ class Server::AsyncRequest final : public CompletionQueueTag { *tag = tag_; if (*status && request_) { if (payload_) { - *status = DeserializeProto(payload_, request_); + *status &= DeserializeProto(payload_, request_); } else { *status = false; } From 27658f41baa23b9f2fcaa963da08bdceb91ea924 Mon Sep 17 00:00:00 2001 From: Yang Gao Date: Tue, 17 Feb 2015 11:47:48 -0800 Subject: [PATCH 2/4] Clear receive message buffer when adding it, so that any reused buffer will not appear when decoding fails. --- src/cpp/common/call.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc index 9ec93bc6262..0922a6e4603 100644 --- a/src/cpp/common/call.cc +++ b/src/cpp/common/call.cc @@ -31,6 +31,7 @@ * */ +#include #include #include #include @@ -144,6 +145,7 @@ void CallOpBuffer::AddSendMessage(const google::protobuf::Message& message) { void CallOpBuffer::AddRecvMessage(google::protobuf::Message* message) { recv_message_ = message; + recv_message_->Clear(); } void CallOpBuffer::AddClientSendClose() { client_send_close_ = true; } From 467d7bd414238427c051a44316d64d267c068ea3 Mon Sep 17 00:00:00 2001 From: Yang Gao Date: Tue, 17 Feb 2015 12:08:43 -0800 Subject: [PATCH 3/4] When the entire op fails, the recv_message is always discarded. --- src/cpp/common/call.cc | 2 +- src/cpp/server/server.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc index 0922a6e4603..70daa6a3b04 100644 --- a/src/cpp/common/call.cc +++ b/src/cpp/common/call.cc @@ -256,7 +256,7 @@ void CallOpBuffer::FinalizeResult(void** tag, bool* status) { if (recv_message_) { if (recv_message_buf_) { got_message = true; - *status &= DeserializeProto(recv_message_buf_, recv_message_); + *status = *status && DeserializeProto(recv_message_buf_, recv_message_); grpc_byte_buffer_destroy(recv_message_buf_); recv_message_buf_ = nullptr; } else { diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index 35ced54aa78..ee9a1daa8e9 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -314,7 +314,7 @@ class Server::AsyncRequest final : public CompletionQueueTag { *tag = tag_; if (*status && request_) { if (payload_) { - *status &= DeserializeProto(payload_, request_); + *status = *status && DeserializeProto(payload_, request_); } else { *status = false; } From caa5106c4f80e408a282693ad0197d8b45611d6e Mon Sep 17 00:00:00 2001 From: Yang Gao Date: Tue, 17 Feb 2015 12:09:14 -0800 Subject: [PATCH 4/4] also set got_message --- src/cpp/common/call.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc index 70daa6a3b04..f1142cf8e56 100644 --- a/src/cpp/common/call.cc +++ b/src/cpp/common/call.cc @@ -255,7 +255,7 @@ void CallOpBuffer::FinalizeResult(void** tag, bool* status) { // Parse received message if any. if (recv_message_) { if (recv_message_buf_) { - got_message = true; + got_message = *status; *status = *status && DeserializeProto(recv_message_buf_, recv_message_); grpc_byte_buffer_destroy(recv_message_buf_); recv_message_buf_ = nullptr;