diff --git a/src/network/mcpe/protocol/LoginPacket.php b/src/network/mcpe/protocol/LoginPacket.php index 6ca62209a..5b5fc7594 100644 --- a/src/network/mcpe/protocol/LoginPacket.php +++ b/src/network/mcpe/protocol/LoginPacket.php @@ -33,7 +33,9 @@ use pocketmine\network\mcpe\protocol\types\login\JwtChain; use pocketmine\utils\BinaryDataException; use pocketmine\utils\BinaryStream; use function is_array; +use function is_object; use function json_decode; +use function json_last_error_msg; class LoginPacket extends DataPacket implements ServerboundPacket{ public const NETWORK_ID = ProtocolInfo::LOGIN_PACKET; @@ -69,6 +71,9 @@ class LoginPacket extends DataPacket implements ServerboundPacket{ $buffer = new BinaryStream($in->getString()); $chainDataJson = json_decode($buffer->get($buffer->getLInt())); + if(!is_object($chainDataJson)){ + throw new PacketDecodeException("Failed decoding chain data JSON: " . json_last_error_msg()); + } $mapper = new \JsonMapper; $mapper->bExceptionOnMissingData = true; $mapper->bExceptionOnUndefinedProperty = true; diff --git a/tests/phpunit/network/mcpe/protocol/LoginPacketTest.php b/tests/phpunit/network/mcpe/protocol/LoginPacketTest.php new file mode 100644 index 000000000..f5abc6fba --- /dev/null +++ b/tests/phpunit/network/mcpe/protocol/LoginPacketTest.php @@ -0,0 +1,48 @@ +putUnsignedVarInt(ProtocolInfo::LOGIN_PACKET); + $payload = '{"chain":[]'; //intentionally malformed + $stream->putInt(ProtocolInfo::CURRENT_PROTOCOL); + + $stream2 = new NetworkBinaryStream(); + $stream2->putLInt(strlen($payload)); + $stream2->put($payload); + $stream->putString($stream2->getBuffer()); + + $pk = PacketPool::getInstance()->getPacket($stream->getBuffer()); + + $this->expectException(PacketDecodeException::class); + $pk->decode(); //bang + } +}