From d6e84b3ed8ed5e0a3e16959abe23a876de13c314 Mon Sep 17 00:00:00 2001 From: "kenton@google.com" Date: Tue, 22 Dec 2009 19:43:41 +0000 Subject: When serializing to an ostream, verify that there were no stream-level errors before returning success. --- src/google/protobuf/message.cc | 7 +++++-- src/google/protobuf/message_unittest.cc | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/google/protobuf/message.cc b/src/google/protobuf/message.cc index 09166f3a..91e6878e 100644 --- a/src/google/protobuf/message.cc +++ b/src/google/protobuf/message.cc @@ -168,8 +168,11 @@ bool Message::SerializePartialToFileDescriptor(int file_descriptor) const { } bool Message::SerializeToOstream(ostream* output) const { - io::OstreamOutputStream zero_copy_output(output); - return SerializeToZeroCopyStream(&zero_copy_output); + { + io::OstreamOutputStream zero_copy_output(output); + if (!SerializeToZeroCopyStream(&zero_copy_output)) return false; + } + return output->good(); } bool Message::SerializePartialToOstream(ostream* output) const { diff --git a/src/google/protobuf/message_unittest.cc b/src/google/protobuf/message_unittest.cc index 46e68446..33b9e77c 100644 --- a/src/google/protobuf/message_unittest.cc +++ b/src/google/protobuf/message_unittest.cc @@ -43,6 +43,7 @@ #include #endif #include +#include #include #include @@ -77,9 +78,9 @@ TEST(MessageTest, SerializeHelpers) { string str1("foo"); string str2("bar"); - message.SerializeToString(&str1); - message.AppendToString(&str2); - message.SerializeToOstream(&stream); + EXPECT_TRUE(message.SerializeToString(&str1)); + EXPECT_TRUE(message.AppendToString(&str2)); + EXPECT_TRUE(message.SerializeToOstream(&stream)); EXPECT_EQ(str1.size() + 3, str2.size()); EXPECT_EQ("bar", str2.substr(0, 3)); @@ -95,6 +96,14 @@ TEST(MessageTest, SerializeHelpers) { } +TEST(MessageTest, SerializeToBrokenOstream) { + ofstream out; + protobuf_unittest::TestAllTypes message; + message.set_optional_int32(123); + + EXPECT_FALSE(message.SerializeToOstream(&out)); +} + TEST(MessageTest, ParseFromFileDescriptor) { string filename = TestSourceDir() + "/google/protobuf/testdata/golden_message"; -- cgit v1.2.3