[Bf-blender-cvs] [75520894c72] master: Fix T78636: Crash displaying many aligned buttons

Campbell Barton noreply at git.blender.org
Thu Jul 16 08:39:17 CEST 2020


Commit: 75520894c72ae8ee96cda7ed8cf8ac642c4f31ab
Author: Campbell Barton
Date:   Thu Jul 16 16:32:55 2020 +1000
Branches: master
https://developer.blender.org/rB75520894c72ae8ee96cda7ed8cf8ac642c4f31ab

Fix T78636: Crash displaying many aligned buttons

Displaying user preferences search crashed on macOS when the search
contained a common character such as 'E'.
This caused alignment to 'alloca' too much memory.

Replace with a heap allocation fallback.

===================================================================

M	source/blender/editors/interface/interface_align.c

===================================================================

diff --git a/source/blender/editors/interface/interface_align.c b/source/blender/editors/interface/interface_align.c
index 59436276277..8edae5d8740 100644
--- a/source/blender/editors/interface/interface_align.c
+++ b/source/blender/editors/interface/interface_align.c
@@ -31,6 +31,8 @@
 
 #include "interface_intern.h"
 
+#include "MEM_guardedalloc.h"
+
 #ifdef USE_UIBUT_SPATIAL_ALIGN
 
 /**
@@ -416,7 +418,16 @@ void ui_block_align_calc(uiBlock *block, const ARegion *region)
     return;
   }
 
-  butal_array = alloca(sizeof(*butal_array) * (size_t)num_buttons);
+  /* Note that this is typically less than ~20, and almost always under ~100.
+   * Even so, we can't ensure this value won't exceed available stack memory.
+   * Fallback to allocation instead of using #alloca, see: T78636. */
+  ButAlign butal_array_buf[256];
+  if (num_buttons <= ARRAY_SIZE(butal_array_buf)) {
+    butal_array = butal_array_buf;
+  }
+  else {
+    butal_array = MEM_mallocN(sizeof(*butal_array) * num_buttons, __func__);
+  }
   memset(butal_array, 0, sizeof(*butal_array) * (size_t)num_buttons);
 
   /* Second loop: we initialize our ButAlign data for each button. */
@@ -515,6 +526,9 @@ void ui_block_align_calc(uiBlock *block, const ARegion *region)
       }
     }
   }
+  if (butal_array_buf != butal_array) {
+    MEM_freeN(butal_array);
+  }
 }
 
 #  undef SIDE_TO_UI_BUT_ALIGN



More information about the Bf-blender-cvs mailing list