summaryrefslogtreecommitdiff
path: root/Meta/Lagom
diff options
context:
space:
mode:
authorItamar <itamar8910@gmail.com>2022-01-29 11:19:16 +0200
committerAndreas Kling <kling@serenityos.org>2022-01-29 12:44:15 +0100
commit1aa8f73ddb605afb72726d3c00a0ff8d4736d269 (patch)
treef2a352814d72a9950f9996daa5b582d151f4298b /Meta/Lagom
parent308e54bc19615fb0fcb9ec71d6f02cca8c4b75d9 (diff)
downloadserenity-1aa8f73ddb605afb72726d3c00a0ff8d4736d269.zip
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.
Diffstat (limited to 'Meta/Lagom')
-rw-r--r--Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp b/Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp
index 78de3ca3ce..ae4528cc7d 100644
--- a/Meta/Lagom/Tools/CodeGenerators/IPCCompiler/main.cpp
+++ b/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();