1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-28 22:41:34 +00:00

Merge branch 'moreFiniteFreezes' into 'master'

Protect more bindings from non-finite numbers

See merge request OpenMW/openmw!4704
This commit is contained in:
psi29a 2025-06-05 11:31:39 +00:00
commit 093b562f58
3 changed files with 38 additions and 3 deletions

View file

@ -5,6 +5,7 @@
#include <components/lua/asyncpackage.hpp>
#include <components/lua/luastate.hpp>
#include <components/lua/utilpackage.hpp>
#include <components/misc/finitenumbers.hpp>
#include <components/misc/resourcehelpers.hpp>
#include <components/settings/values.hpp>
@ -99,6 +100,8 @@ namespace MWLua
sol::table initAnimationPackage(const Context& context)
{
using FiniteFloat = Misc::FiniteFloat;
auto view = context.sol();
auto mechanics = MWBase::Environment::get().getMechanicsManager();
auto world = MWBase::Environment::get().getWorld();
@ -197,7 +200,7 @@ namespace MWLua
return speed;
return sol::nullopt;
};
api["setSpeed"] = [](const sol::object& object, std::string groupname, float speed) {
api["setSpeed"] = [](const sol::object& object, std::string groupname, const FiniteFloat speed) {
getMutableAnimationOrThrow(ObjectVariant(object))->adjustSpeedMult(groupname, speed);
};
api["getActiveGroup"] = [](const sol::object& object, MWRender::BoneGroup boneGroup) -> std::string_view {

View file

@ -10,6 +10,7 @@
#include <components/esm3/loadskil.hpp>
#include <components/esm3/loadweap.hpp>
#include <components/lua/luastate.hpp>
#include <components/misc/finitenumbers.hpp>
#include "../mwbase/environment.hpp"
#include "../mwbase/statemanager.hpp"
@ -56,10 +57,12 @@ namespace MWLua
static void addWorldTimeBindings(sol::table& api, const Context& context)
{
using FiniteFloat = Misc::FiniteFloat;
MWWorld::DateTimeManager* timeManager = MWBase::Environment::get().getWorld()->getTimeManager();
api["setGameTimeScale"] = [timeManager](double scale) { timeManager->setGameTimeScale(scale); };
api["setSimulationTimeScale"] = [context, timeManager](float scale) {
api["setGameTimeScale"] = [timeManager](const FiniteFloat scale) { timeManager->setGameTimeScale(scale); };
api["setSimulationTimeScale"] = [context, timeManager](const FiniteFloat scale) {
context.mLuaManager->addAction([scale, timeManager] { timeManager->setSimulationTimeScale(scale); });
};

View file

@ -8,6 +8,18 @@
namespace Misc
{
struct FiniteDouble
{
double mValue;
FiniteDouble(double v)
{
if (!std::isfinite(v))
throw std::invalid_argument("Value must be a finite number");
mValue = v;
}
operator double() const { return mValue; }
};
struct FiniteFloat
{
float mValue;
@ -23,8 +35,25 @@ namespace Misc
namespace sol
{
using FiniteDouble = Misc::FiniteDouble;
using FiniteFloat = Misc::FiniteFloat;
template <typename Handler>
bool sol_lua_check(
sol::types<FiniteDouble>, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking)
{
bool success = sol::stack::check<double>(L, lua_absindex(L, index), handler);
tracking.use(1);
return success;
}
static FiniteDouble sol_lua_get(sol::types<FiniteDouble>, lua_State* L, int index, sol::stack::record& tracking)
{
double val = sol::stack::get<double>(L, lua_absindex(L, index));
tracking.use(1);
return FiniteDouble(val);
}
template <typename Handler>
bool sol_lua_check(
sol::types<FiniteFloat>, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking)