aternosorg / codex-minecraft

PHP library to read, parse, print and analyse Minecraft log files.
https://packagist.org/packages/aternos/codex-minecraft
MIT License
30 stars 8 forks source link

Codex Minecraft does not detect Forge 1.16.5 log as client log, because it is too long and the Regexes are inefficient #87

Open pavog opened 1 week ago

pavog commented 1 week ago

I have a quite long client log of Forge 1.16.5 with many mods. Unfortunately, this log is not recognized as a client log, but as a server log instead.

I found out that the problem is that the regular expression used to identify it as a Forge client log is inefficient.

From ForgeClientLog.php#L22:

/^\[[^\]]+\] \[main\/INFO\]( \[[^\]]+\])?: ModLauncher running: .*--fml.forgeVersion.*(\n.*)*\n\[[^\]]+\] \[main\/INFO\]( \[[^\]]+\])?: Launching target \'(fml|forge)client\' with arguments.*$/m

The problematic part here is *(\n.*)*. When you run the regex over the linked log, it does not work because the result of preg_match($this->pattern, $this->getLogContent()) in SinglePatternDetector->detect() is false.

When you run this minimal code example:

$content = file_get_contents("test.log");
$pattern = '/^\[[^\]]+\] \[main\/INFO\]( \[[^\]]+\])?: ModLauncher running: .*--fml.forgeVersion.*(\n.*)*\n\[[^\]]+\] \[main\/INFO\]( \[[^\]]+\])?: Launching target \'(fml|forge)client\' with arguments.*$/m';

$result = preg_match($pattern, $content);
var_dump($result);

echo "Error: " . preg_last_error() . "\n";
echo "Message: " . preg_last_error_msg() . "\n";

You will get this output:

bool(false)
Error: 6
Message: JIT stack limit exhausted
matthi4s commented 1 week ago

Ja fix halt