From 818da65ae678c608d4d2c8166100b18eea66b6d8 Mon Sep 17 00:00:00 2001 From: arthurtilly <32559225+arthurtilly@users.noreply.github.com> Date: Fri, 20 Jan 2023 19:06:06 +1300 Subject: [PATCH] Fix huge stack allocation in surface loading functions (#569) --- src/engine/surface_load.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index b1201c14..aca97f52 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -675,12 +675,12 @@ static void get_optimal_coll_dist(struct Object *obj) { } #endif +static TerrainData sVertexData[600]; + /** * Transform an object's vertices, reload them, and render the object. */ void load_object_collision_model(void) { - TerrainData vertexData[600]; - TerrainData *collisionData = o->collisionData; f32 marioDist = o->oDistanceToMario; @@ -709,11 +709,11 @@ void load_object_collision_model(void) { && !(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) ) { collisionData++; - transform_object_vertices(&collisionData, vertexData); + transform_object_vertices(&collisionData, sVertexData); // TERRAIN_LOAD_CONTINUE acts as an "end" to the terrain data. while (*collisionData != TERRAIN_LOAD_CONTINUE) { - load_object_surfaces(&collisionData, vertexData, TRUE); + load_object_surfaces(&collisionData, sVertexData, TRUE); } } COND_BIT((marioDist < o->oDrawingDistance), o->header.gfx.node.flags, GRAPH_RENDER_ACTIVE); @@ -723,7 +723,6 @@ void load_object_collision_model(void) { * Transform an object's vertices and add them to the static surface pool. */ void load_object_static_model(void) { - TerrainData vertexData[600]; TerrainData *collisionData = o->collisionData; u32 surfacePoolData; @@ -734,11 +733,11 @@ void load_object_static_model(void) { gSurfacesAllocated = gNumStaticSurfaces; collisionData++; - transform_object_vertices(&collisionData, vertexData); + transform_object_vertices(&collisionData, sVertexData); // TERRAIN_LOAD_CONTINUE acts as an "end" to the terrain data. while (*collisionData != TERRAIN_LOAD_CONTINUE) { - load_object_surfaces(&collisionData, vertexData, FALSE); + load_object_surfaces(&collisionData, sVertexData, FALSE); } surfacePoolData = (uintptr_t)gCurrStaticSurfacePoolEnd - (uintptr_t)gCurrStaticSurfacePool;