-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
89 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
--TEST-- | ||
Test that LightArray handles invalid coordinates appropriately | ||
--DESCRIPTION-- | ||
We don't want to throw exceptions in hot paths, so we truncate invalid coordinates to 4 bits. | ||
This intentionally produces overflow behaviour, as the least impactful way to avoid memory corruption issues. | ||
--EXTENSIONS-- | ||
chunkutils2 | ||
--FILE-- | ||
<?php | ||
|
||
namespace pocketmine\world\format; | ||
|
||
$p = LightArray::fill(0); | ||
|
||
$p->set(0, 0, 0, 15); | ||
|
||
var_dump($p->get(0, 0, 0)); | ||
var_dump($p->get(16, 16, 16)); | ||
var_dump($p->get(32, 32, 32)); | ||
|
||
$p->set(16, 16, 16, 8); | ||
var_dump($p->get(0, 0, 0)); | ||
|
||
?> | ||
--EXPECT-- | ||
int(15) | ||
int(15) | ||
int(15) | ||
int(8) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
--TEST-- | ||
Test PalettedBlockArray::get() and set() overflow behaviour on invalid coordinates | ||
--DESCRIPTION-- | ||
To avoid throwing costly exceptions in hot paths, we truncate invalid coordinates to 4 bits, so they will overflow. | ||
We can't do nothing about it because it would allow invalid coordinates to cause memory corruption. | ||
This is the least impactful solution. | ||
--EXTENSIONS-- | ||
chunkutils2 | ||
--FILE-- | ||
<?php | ||
|
||
namespace pocketmine\world\format; | ||
|
||
$p = new PalettedBlockArray(1); | ||
$p->set(0, 0, 0, 2); | ||
|
||
var_dump($p->get(0, 0, 0)); | ||
var_dump($p->get(16, 16, 16)); | ||
var_dump($p->get(32, 32, 32)); | ||
|
||
$p->set(16, 16, 16, 3); | ||
var_dump($p->get(0, 0, 0)); | ||
?> | ||
--EXPECT-- | ||
int(2) | ||
int(2) | ||
int(2) | ||
int(3) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
--TEST-- | ||
Test that validating palette offsets works correctly in PalettedBlockArray::fromData() | ||
--DESCRIPTION-- | ||
In certain cases (when the palette is not full) it's possible for offsets in the array to point at indices in the palette which aren't set. | ||
For example, a 3 bpb palette can hold up to 8 unique blocks, but if only 7 are used, an `8` appearing in the offset table is bogus and should be reported as corruption. | ||
This test verifies some known valid and invalid cases to ensure that corruption is detected only where expected. | ||
--EXTENSIONS-- | ||
chunkutils2 | ||
--FILE-- | ||
<?php | ||
|
||
namespace pocketmine\world\format; | ||
|
||
$samples = [ | ||
[ | ||
3, | ||
base64_decode('AAAAEQIAAAAAEAkAAAAAAJEAAAAAAERCAAAAQEAkAAAAAABRAgAAAAAQCQAAAAAAkQAAAAAARMIAAADAQCQAAAAAABECAAAAABAJAAAAAACRAAAAAABEAgAAAABAJAAAAAAAEQIAAAAAEAkAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAAAAQCQAAAAAAkQAAAAAARAIAAAAAQCQAAAAAABECAAAAABAJAAAAAECRAAAAAABEggAAAABAJABAAAAAEQIAAAAAEAkAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAAAAQCQAAAAAAkQAAAAAARAIAAAAAQCQAAAAAABECAAAAABAJAAAAAACRAAAAAABEAgAAAABAJAAAAAAAEQIAAAAAEAkAAAAAQJEAAAAAAESCAAAAAEAkAEAAAAARAgAAAAAQCQAAAAAAkQAAAAAARAIAAAAAQCQAAAAAABECAAAAABAJAAAAAACRAAAAAABEAgAAAABAJAAAAAAAEQIAAAAAEAkAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAAAAQCQAAAABAkQAAAAAARIIAAAAAQCQAQAAAABECAAAAABAJAAAAAACRAAAAAABEAgAAAABAJAAAAAAAEQIAAAAAEAkAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAAAAQCQAAAAAAkQAAAAAARAIAAAAAQCQAAAAAABECAAAAABAJAAAAAACRAABAAABEAgAAAEBAJABAAAAAUQIAAAAAEAlAAAAAAJEAAAAAAEQCAAAAAEAkAAAAAABRAgAAQAAQCUAAAAAAkQAAQAAAREIAAAAAQCQAQAAAABECAAAAABAJQAAAAACRAAAAAABEQgAAAEBAJABAAAAAUQIAAEAAEAlAAAAAQJEAAAAAAERCAAAAAEAkAAAAAAARAgAAAAAQCQAAAABAkQAAQAAAREIAAAAAQCQAQAAAABECAABAABAJAAAAAACRAAAAAABEAgAAAABAJABAAAAAUQIAAEAAEAkAAAAAQJEAAEAAAERCAAAAAEAkAEAAAAARAgAAAAAQCUAAAAAAkQAAQAAAREIAAABAQCQAQAAAAFECAAAAABAJQAAAAACRAAAAAABEQgAAAABAJAAAAAAAUQIAAEAAEAlAAAAAQJEAAEAAAERCAAAAQEAkAEAAAAARAgAAQAAQCQAAAAAAkQAAQAAARAIAAAAAQCQAQAAAAFECAABAABAJQAAAAECRAABAAABEAgAAAEBAJAAAAAAAEQIAAEAAEAkAAAAAAJEAAEAAAERCAAAAQEAkAEAAAABRAgAAQAAQCUAAAAAAkQAAQAAARAIAAAAAQCQAAAAAABECAAAAABAJQAAAAECRAABAAABEAgAAAEBAJABAAAAAUQIAAEAAEAlAAAAAAJEAAEAAAEQCAAAAAEAkAEAAAAARAgAAQAAQCUAAAABAkQAAQAAAREIAAAAAQCQAQAAAABECAAAAABAJAAAAAACRAAAAAABEQgAAAEBAJABAAAAAEQIAAEAAEAkAAAAAQJEAAAAAAEQCAAAAAEAkAAAAAAARAgAAQAAQCUAAAABAkQAAAAAAREIAAABAQCQAQAAAAFECAAAAABAJQAAAAADACAAAAAAAYwAAAAAAMAIAAAAAQCMAAEAAAIxAAAAAQMAIAEAAAABjAAAAQAAwAkAAAAAAIwAAQAAAjEAAAAAAwAgAQAAAACMAAAAAADACQAAAAAAjAABAAACMQAAAAEDACABAAAAAYwAAAEAAMAJAAAAAQCMAAEAAAIwAAAAAQMAIAAAAAAAjAAAAQAAwAgAAAABAIwAAQAAAjEAAAABAwAgAQAAAAGMAAABAADACAAAAAEAjAAAAAACMAAAAAADACAAAAAAAIwAAAEAAMAJAAAAAQCMAAAAAAIwAAAAAQMAIAEAAAAAjAAAAQAAwAgAAAAAAIwAAQAAAjAAAAABAwAgAQAAAAGMAAAAAADACQAAAAAAjAAAAAACMQAAAAADACAAAAAAAYwAAAAAAMAJAAAAAQCMAAEAAAIxAAAAAAMAIAEAAAAAjAAAAAAAwAkAAAAAAIwAAAAAAjEAAAAAAwAgAQAAAAGMAAABAADACQAAAAAAjAABAAACMAAAAAADACABAAAAAIwAAAAAAMAJAAAAAACMAbGU=', true), | ||
[0, 1, 2, 3, 4] | ||
] | ||
]; | ||
|
||
foreach($samples as $k => $values){ | ||
try{ | ||
PalettedBlockArray::fromData($values[0], $values[1], $values[2]); | ||
echo "$k not corrupted\n"; | ||
}catch(\Exception $e){ | ||
echo "$k " . $e->getMessage() . "\n"; | ||
} | ||
} | ||
?> | ||
--EXPECT-- | ||
0 not corrupted |