浏览代码

IPCCompiler: Don't loop endlessly on nameless parameters

Previously, given a malformed IPC call declaration, where a parameter
does not have a name, the IPCCompiler would spin endlessly while
consuming more and more memory.

This is because it parses the parameter type incorrectly
(it consumes superfluous characters into the parameter type).

An example for such malformed declaration is:
tokens_info_result(Vector<GUI::AutocompleteProvider::TokenInfo>) =|

As a temporary fix, this adds VERIFY calls that would fail if we're at
EOF when parsing parameter names.

A real solution would be to parse C++ parameter types correctly.
LibCpp's Parser could be used for this task.
Itamar 3 年之前
父节点
当前提交
1aa8f73ddb
共有 1 个文件被更改,包括 7 次插入0 次删除
  1. 7 0
      Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp

+ 7 - 0
Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp

@@ -111,6 +111,10 @@ int main(int argc, char** argv)
     auto parse_parameter = [&](Vector<Parameter>& storage) {
         for (;;) {
             Parameter parameter;
+            if (lexer.is_eof()) {
+                warnln("EOF when parsing parameter");
+                VERIFY_NOT_REACHED();
+            }
             consume_whitespace();
             if (lexer.peek() == ')')
                 break;
@@ -128,7 +132,10 @@ int main(int argc, char** argv)
                     consume_whitespace();
                 }
             }
+            // FIXME: This is not entirely correct. Types can have spaces, for example `HashMap<int, String>`.
+            //        Maybe we should use LibCpp::Parser for parsing types.
             parameter.type = lexer.consume_until([](char ch) { return isspace(ch); });
+            VERIFY(!lexer.is_eof());
             consume_whitespace();
             parameter.name = lexer.consume_until([](char ch) { return isspace(ch) || ch == ',' || ch == ')'; });
             consume_whitespace();