瀏覽代碼

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.
Sergey Bugaev 5 年之前
父節點
當前提交
bb19eb8f23
共有 1 個文件被更改,包括 24 次插入3 次删除
  1. 24 3
      DevTools/IPCCompiler/main.cpp

+ 24 - 3
DevTools/IPCCompiler/main.cpp

@@ -393,19 +393,33 @@ int main(int argc, char** argv)
         out() << "        BufferStream stream(const_cast<ByteBuffer&>(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<IPC::Message> 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<IPC::Message> handle(const IPC::Message& message) override";