Skip to content

Commit

Permalink
Merge branch 'fix_findpath_use_after_free' into 'master'
Browse files Browse the repository at this point in the history
Fix findPath returning a raw vector

Closes #8238

See merge request OpenMW/openmw!4470
  • Loading branch information
Capostrophic committed Dec 3, 2024
2 parents c454675 + 30e6821 commit b285e2f
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 10 deletions.
14 changes: 8 additions & 6 deletions apps/openmw/mwlua/nearbybindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ namespace MWLua
| DetourNavigator::Flag_swim | DetourNavigator::Flag_openDoor | DetourNavigator::Flag_usePathgrid;

api["findPath"]
= [](const osg::Vec3f& source, const osg::Vec3f& destination, const sol::optional<sol::table>& options) {
= [lua](const osg::Vec3f& source, const osg::Vec3f& destination, const sol::optional<sol::table>& options) {
DetourNavigator::AgentBounds agentBounds = defaultAgentBounds;
DetourNavigator::Flags includeFlags = defaultIncludeFlags;
DetourNavigator::AreaCosts areaCosts{};
Expand Down Expand Up @@ -259,13 +259,15 @@ namespace MWLua
destinationTolerance = *v;
}

std::vector<osg::Vec3f> result;
std::vector<osg::Vec3f> path;

const DetourNavigator::Status status = DetourNavigator::findPath(
*MWBase::Environment::get().getWorld()->getNavigator(), agentBounds, source, destination,
includeFlags, areaCosts, destinationTolerance, std::back_inserter(result));
const DetourNavigator::Status status
= DetourNavigator::findPath(*MWBase::Environment::get().getWorld()->getNavigator(), agentBounds,
source, destination, includeFlags, areaCosts, destinationTolerance, std::back_inserter(path));

return std::make_tuple(status, std::move(result));
sol::table result(lua, sol::create);
LuaUtil::copyVectorToTable(path, result);
return std::make_tuple(status, result);
};

api["findRandomPointAroundCircle"] = [](const osg::Vec3f& position, float maxRadius,
Expand Down
6 changes: 6 additions & 0 deletions components/lua/luastate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,12 @@ namespace LuaUtil
}
sol::table getMutableFromReadOnly(const sol::userdata&);

template <class T>
void copyVectorToTable(const std::vector<T>& v, sol::table& out)
{
for (const T& t : v)
out.add(t);
}
}

#endif // COMPONENTS_LUA_LUASTATE_H
4 changes: 2 additions & 2 deletions scripts/data/integration_tests/test_lua_api/player.lua
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,8 @@ testing.registerLocalTest('findPath',
}
local status, path = nearby.findPath(src, dst, options)
testing.expectEqual(status, nearby.FIND_PATH_STATUS.Success, 'Status')
testing.expectLessOrEqual((path[path:size()] - dst):length(), 1,
'Last path point ' .. testing.formatActualExpected(path[path:size()], dst))
testing.expectLessOrEqual((path[#path] - dst):length(), 1,
'Last path point ' .. testing.formatActualExpected(path[#path], dst))
end)

testing.registerLocalTest('findRandomPointAroundCircle',
Expand Down
1 change: 1 addition & 0 deletions scripts/data/morrowind_tests/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
test_workdir/*
4 changes: 2 additions & 2 deletions scripts/data/morrowind_tests/player.lua
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ testing.registerLocalTest('Guard in Imperial Prison Ship should find path (#7241
}
local status, path = nearby.findPath(src, dst, options)
testing.expectEqual(status, nearby.FIND_PATH_STATUS.Success, 'Status')
testing.expectLessOrEqual((util.vector2(path[path:size()].x, path[path:size()].y) - util.vector2(dst.x, dst.y)):length(), 1, 'Last path point x, y')
testing.expectLessOrEqual(path[path:size()].z - dst.z, 20, 'Last path point z')
testing.expectLessOrEqual((util.vector2(path[#path].x, path[#path].y) - util.vector2(dst.x, dst.y)):length(), 1, 'Last path point x, y')
testing.expectLessOrEqual(path[#path].z - dst.z, 20, 'Last path point z')
if agentBounds.shapeType == nearby.COLLISION_SHAPE_TYPE.Aabb then
testing.expectThat(path, testing.elementsAreArray({
testing.closeToVector(util.vector3(34.29737091064453125, 806.3817138671875, 112.76610565185546875), 1e-1),
Expand Down

0 comments on commit b285e2f

Please sign in to comment.