From bb19eb8f230b6077e0ca0248be237d59ec8cdedc Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Mon, 8 Jun 2020 14:10:53 +0300 Subject: [PATCH] IPCCompiler: Properly handle stream read errors If we exhaust the buffer stream, the reads appear to succeed, but the stream itself panics when we later attempt to drop it. To prevent it, we check for errors explicitly. --- DevTools/IPCCompiler/main.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/DevTools/IPCCompiler/main.cpp b/DevTools/IPCCompiler/main.cpp index 6356c9acd3..053e3a9611 100644 --- a/DevTools/IPCCompiler/main.cpp +++ b/DevTools/IPCCompiler/main.cpp @@ -393,19 +393,33 @@ int main(int argc, char** argv) out() << " BufferStream stream(const_cast(buffer));"; out() << " i32 message_endpoint_magic = 0;"; out() << " stream >> message_endpoint_magic;"; + out() << " if (stream.handle_read_failure()) {"; +#ifdef GENERATE_DEBUG_CODE + out() << " dbg() << \"Failed to read message endpoint magic\";"; +#endif + out() << " return nullptr;"; + out() << " }"; out() << " if (message_endpoint_magic != " << endpoint.magic << ") {"; #ifdef GENERATE_DEBUG_CODE - sout() << " sout() << \"endpoint magic \" << message_endpoint_magic << \" != " << endpoint.magic << "\";"; + out() << " dbg() << \"endpoint magic \" << message_endpoint_magic << \" != " << endpoint.magic << "\";"; #endif out() << " return nullptr;"; out() << " }"; out() << " i32 message_id = 0;"; out() << " stream >> message_id;"; + out() << " if (stream.handle_read_failure()) {"; +#ifdef GENERATE_DEBUG_CODE + out() << " dbg() << \"Failed to read message ID\";"; +#endif + out() << " return nullptr;"; + out() << " }"; + out() << " OwnPtr message;"; out() << " switch (message_id) {"; for (auto& message : endpoint.messages) { auto do_decode_message = [&](const String& name) { out() << " case (int)Messages::" << endpoint.name << "::MessageID::" << name << ":"; - out() << " return Messages::" << endpoint.name << "::" << name << "::decode(stream, size_in_bytes);"; + out() << " message = Messages::" << endpoint.name << "::" << name << "::decode(stream, size_in_bytes);"; + out() << " break;"; }; do_decode_message(message.name); if (message.is_synchronous) @@ -413,11 +427,18 @@ int main(int argc, char** argv) } out() << " default:"; #ifdef GENERATE_DEBUG_CODE - sout() << " sout() << \"Failed to decode " << endpoint.name << ".(\" << message_id << \")\";"; + out() << " dbg() << \"Failed to decode " << endpoint.name << ".(\" << message_id << \")\";"; #endif out() << " return nullptr;"; out() << " }"; + out() << " if (stream.handle_read_failure()) {"; +#ifdef GENERATE_DEBUG_CODE + out() << " sout() << \"Failed to read the message\";"; +#endif + out() << " return nullptr;"; + out() << " }"; + out() << " return message;"; out() << " }"; out(); out() << " virtual OwnPtr handle(const IPC::Message& message) override";