mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Fix find_nodes_in_area misbehaving with out-of-map coordinates (#11770)
This ensures that no overflows (side-effects) happen within the find_nodes_in_area function by limiting coordinates like done in the map generation code.
This commit is contained in:
parent
b9051386ae
commit
87ab97da2a
2 changed files with 33 additions and 16 deletions
|
@ -880,6 +880,21 @@ int ModApiEnvMod::l_find_node_near(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void checkArea(v3s16 &minp, v3s16 &maxp)
|
||||
{
|
||||
auto volume = VoxelArea(minp, maxp).getVolume();
|
||||
// Volume limit equal to 8 default mapchunks, (80 * 2) ^ 3 = 4,096,000
|
||||
if (volume > 4096000) {
|
||||
throw LuaError("Area volume exceeds allowed value of 4096000");
|
||||
}
|
||||
|
||||
// Clamp to map range to avoid problems
|
||||
#define CLAMP(arg) core::clamp(arg, (s16)-MAX_MAP_GENERATION_LIMIT, (s16)MAX_MAP_GENERATION_LIMIT)
|
||||
minp = v3s16(CLAMP(minp.X), CLAMP(minp.Y), CLAMP(minp.Z));
|
||||
maxp = v3s16(CLAMP(maxp.X), CLAMP(maxp.Y), CLAMP(maxp.Z));
|
||||
#undef CLAMP
|
||||
}
|
||||
|
||||
// find_nodes_in_area(minp, maxp, nodenames, [grouped])
|
||||
int ModApiEnvMod::l_find_nodes_in_area(lua_State *L)
|
||||
{
|
||||
|
@ -899,13 +914,7 @@ int ModApiEnvMod::l_find_nodes_in_area(lua_State *L)
|
|||
}
|
||||
#endif
|
||||
|
||||
v3s16 cube = maxp - minp + 1;
|
||||
// Volume limit equal to 8 default mapchunks, (80 * 2) ^ 3 = 4,096,000
|
||||
if ((u64)cube.X * (u64)cube.Y * (u64)cube.Z > 4096000) {
|
||||
luaL_error(L, "find_nodes_in_area(): area volume"
|
||||
" exceeds allowed value of 4096000");
|
||||
return 0;
|
||||
}
|
||||
checkArea(minp, maxp);
|
||||
|
||||
std::vector<content_t> filter;
|
||||
collectNodeIds(L, 3, ndef, filter);
|
||||
|
@ -1010,13 +1019,7 @@ int ModApiEnvMod::l_find_nodes_in_area_under_air(lua_State *L)
|
|||
}
|
||||
#endif
|
||||
|
||||
v3s16 cube = maxp - minp + 1;
|
||||
// Volume limit equal to 8 default mapchunks, (80 * 2) ^ 3 = 4,096,000
|
||||
if ((u64)cube.X * (u64)cube.Y * (u64)cube.Z > 4096000) {
|
||||
luaL_error(L, "find_nodes_in_area_under_air(): area volume"
|
||||
" exceeds allowed value of 4096000");
|
||||
return 0;
|
||||
}
|
||||
checkArea(minp, maxp);
|
||||
|
||||
std::vector<content_t> filter;
|
||||
collectNodeIds(L, 3, ndef, filter);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue