Skip to content

Commit 093b562

Browse files
committed
Merge branch 'moreFiniteFreezes' into 'master'
Protect more bindings from non-finite numbers See merge request OpenMW/openmw!4704
2 parents cf25882 + 0d96d71 commit 093b562

File tree

3 files changed

+38
-3
lines changed

3 files changed

+38
-3
lines changed

apps/openmw/mwlua/animationbindings.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <components/lua/asyncpackage.hpp>
66
#include <components/lua/luastate.hpp>
77
#include <components/lua/utilpackage.hpp>
8+
#include <components/misc/finitenumbers.hpp>
89
#include <components/misc/resourcehelpers.hpp>
910
#include <components/settings/values.hpp>
1011

@@ -99,6 +100,8 @@ namespace MWLua
99100

100101
sol::table initAnimationPackage(const Context& context)
101102
{
103+
using FiniteFloat = Misc::FiniteFloat;
104+
102105
auto view = context.sol();
103106
auto mechanics = MWBase::Environment::get().getMechanicsManager();
104107
auto world = MWBase::Environment::get().getWorld();
@@ -197,7 +200,7 @@ namespace MWLua
197200
return speed;
198201
return sol::nullopt;
199202
};
200-
api["setSpeed"] = [](const sol::object& object, std::string groupname, float speed) {
203+
api["setSpeed"] = [](const sol::object& object, std::string groupname, const FiniteFloat speed) {
201204
getMutableAnimationOrThrow(ObjectVariant(object))->adjustSpeedMult(groupname, speed);
202205
};
203206
api["getActiveGroup"] = [](const sol::object& object, MWRender::BoneGroup boneGroup) -> std::string_view {

apps/openmw/mwlua/worldbindings.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <components/esm3/loadskil.hpp>
1111
#include <components/esm3/loadweap.hpp>
1212
#include <components/lua/luastate.hpp>
13+
#include <components/misc/finitenumbers.hpp>
1314

1415
#include "../mwbase/environment.hpp"
1516
#include "../mwbase/statemanager.hpp"
@@ -56,10 +57,12 @@ namespace MWLua
5657

5758
static void addWorldTimeBindings(sol::table& api, const Context& context)
5859
{
60+
using FiniteFloat = Misc::FiniteFloat;
61+
5962
MWWorld::DateTimeManager* timeManager = MWBase::Environment::get().getWorld()->getTimeManager();
6063

61-
api["setGameTimeScale"] = [timeManager](double scale) { timeManager->setGameTimeScale(scale); };
62-
api["setSimulationTimeScale"] = [context, timeManager](float scale) {
64+
api["setGameTimeScale"] = [timeManager](const FiniteFloat scale) { timeManager->setGameTimeScale(scale); };
65+
api["setSimulationTimeScale"] = [context, timeManager](const FiniteFloat scale) {
6366
context.mLuaManager->addAction([scale, timeManager] { timeManager->setSimulationTimeScale(scale); });
6467
};
6568

components/misc/finitenumbers.hpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@
88

99
namespace Misc
1010
{
11+
struct FiniteDouble
12+
{
13+
double mValue;
14+
FiniteDouble(double v)
15+
{
16+
if (!std::isfinite(v))
17+
throw std::invalid_argument("Value must be a finite number");
18+
mValue = v;
19+
}
20+
operator double() const { return mValue; }
21+
};
22+
1123
struct FiniteFloat
1224
{
1325
float mValue;
@@ -23,8 +35,25 @@ namespace Misc
2335

2436
namespace sol
2537
{
38+
using FiniteDouble = Misc::FiniteDouble;
2639
using FiniteFloat = Misc::FiniteFloat;
2740

41+
template <typename Handler>
42+
bool sol_lua_check(
43+
sol::types<FiniteDouble>, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking)
44+
{
45+
bool success = sol::stack::check<double>(L, lua_absindex(L, index), handler);
46+
tracking.use(1);
47+
return success;
48+
}
49+
50+
static FiniteDouble sol_lua_get(sol::types<FiniteDouble>, lua_State* L, int index, sol::stack::record& tracking)
51+
{
52+
double val = sol::stack::get<double>(L, lua_absindex(L, index));
53+
tracking.use(1);
54+
return FiniteDouble(val);
55+
}
56+
2857
template <typename Handler>
2958
bool sol_lua_check(
3059
sol::types<FiniteFloat>, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking)

0 commit comments

Comments
 (0)