summaryrefslogtreecommitdiff
path: root/src/script/lua_api/l_env.cpp
diff options
context:
space:
mode:
authorCraig Robbins <kde.psych@gmail.com>2014-08-07 15:39:12 +1000
committerRealBadAngel <maciej.kasatkin@o2.pl>2014-08-23 06:40:27 +0200
commitf33d31693ed2ab7d2a29320181b6aba2c12f76d3 (patch)
treeb440bfeb24c4beddd5a73ea7ab4f9c4452733a39 /src/script/lua_api/l_env.cpp
parent996ea60642c5d78fc915573af0641d78bc7e2d49 (diff)
downloadminetest-f33d31693ed2ab7d2a29320181b6aba2c12f76d3.tar.gz
minetest-f33d31693ed2ab7d2a29320181b6aba2c12f76d3.tar.bz2
minetest-f33d31693ed2ab7d2a29320181b6aba2c12f76d3.zip
Fix seg fault if popping from empty stack (L-system trees)
See: https://github.com/minetest/minetest/issues/1525 Background Wuzzy2: If you attempt to spawn a L-system tree with minetest.spawn_tree, you can make Minetest crash if it is attempted to pop an empty stack. ShadowNinja: This shouldn't cause a segmentation fault, but it should throw a Lua error Commit Description This commit throws a Lua error instead of causing a segmentation fault. The server will still "crash" but will include a Lua backtrace. L-Systems fix randomness Unless a random seed is provided (via Lua treedef) seed the PRNG with a different seed for each tree Resolves: https://github.com/minetest/minetest/issues/1469 Fix l-system crash when treedef random_level not set by Lua
Diffstat (limited to 'src/script/lua_api/l_env.cpp')
-rw-r--r--src/script/lua_api/l_env.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp
index e6ca846d8..deeb5966f 100644
--- a/src/script/lua_api/l_env.cpp
+++ b/src/script/lua_api/l_env.cpp
@@ -747,7 +747,8 @@ int ModApiEnvMod::l_spawn_tree(lua_State *L)
}
getintfield(L, 2, "angle", tree_def.angle);
getintfield(L, 2, "iterations", tree_def.iterations);
- getintfield(L, 2, "random_level", tree_def.iterations_random_level);
+ if (!getintfield(L, 2, "random_level", tree_def.iterations_random_level))
+ tree_def.iterations_random_level = 0;
getstringfield(L, 2, "trunk_type", tree_def.trunk_type);
getboolfield(L, 2, "thin_branches", tree_def.thin_branches);
tree_def.fruit_chance=0;
@@ -757,11 +758,20 @@ int ModApiEnvMod::l_spawn_tree(lua_State *L)
tree_def.fruitnode=ndef->getId(fruit);
getintfield(L, 2, "fruit_chance",tree_def.fruit_chance);
}
- getintfield(L, 2, "seed", tree_def.seed);
+ tree_def.explicit_seed = getintfield(L, 2, "seed", tree_def.seed);
}
else
return 0;
- treegen::spawn_ltree (env, p0, ndef, tree_def);
+
+ treegen::error e;
+ if ((e = treegen::spawn_ltree (env, p0, ndef, tree_def)) != treegen::SUCCESS) {
+ if (e == treegen::UNBALANCED_BRACKETS) {
+ luaL_error(L, "spawn_tree(): closing ']' has no matching opening bracket");
+ } else {
+ luaL_error(L, "spawn_tree(): unknown error");
+ }
+ }
+
return 1;
}