aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2025-01-26 22:15:49 -0800
committerPaul Eggert2025-01-26 23:05:52 -0800
commit6ff06ff738ead96d7b4cb59eda15a1c72e2b5776 (patch)
tree1efedcaacd877b77f08de6f334b33a9ac607fe11 /src
parent17a8bf53f390718756e397cc0b31c1ef2c7de5f0 (diff)
downloademacs-6ff06ff738ead96d7b4cb59eda15a1c72e2b5776.tar.gz
emacs-6ff06ff738ead96d7b4cb59eda15a1c72e2b5776.zip
Beware large stack growth in pgtk_menu_show
* src/pgtkmenu.c (pgtk_menu_show): USE_SAFE_ALLOCA instead of alloca. Problem found with --enable-gcc-warnings.
Diffstat (limited to 'src')
-rw-r--r--src/pgtkmenu.c15
-rw-r--r--src/xmenu.c6
2 files changed, 10 insertions, 11 deletions
diff --git a/src/pgtkmenu.c b/src/pgtkmenu.c
index a2e09b6cb58..54e1c3739cf 100644
--- a/src/pgtkmenu.c
+++ b/src/pgtkmenu.c
@@ -596,14 +596,10 @@ pgtk_menu_show (struct frame *f, int x, int y, int menuflags,
596{ 596{
597 int i; 597 int i;
598 widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0; 598 widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0;
599 widget_value **submenu_stack 599 widget_value **submenu_stack;
600 = alloca (menu_items_used * sizeof *submenu_stack); 600 Lisp_Object *subprefix_stack;
601 Lisp_Object *subprefix_stack
602 = alloca (menu_items_used * sizeof *subprefix_stack);
603 int submenu_depth = 0; 601 int submenu_depth = 0;
604 602
605 specpdl_ref specpdl_count = SPECPDL_INDEX ();
606
607 eassert (FRAME_PGTK_P (f)); 603 eassert (FRAME_PGTK_P (f));
608 604
609 *error_name = NULL; 605 *error_name = NULL;
@@ -614,6 +610,11 @@ pgtk_menu_show (struct frame *f, int x, int y, int menuflags,
614 return Qnil; 610 return Qnil;
615 } 611 }
616 612
613 USE_SAFE_ALLOCA;
614 SAFE_NALLOCA (submenu_stack, 1, menu_items_used);
615 SAFE_NALLOCA (subprefix_stack, 1, menu_items_used);
616 specpdl_ref specpdl_count = SPECPDL_INDEX ();
617
617 block_input (); 618 block_input ();
618 619
619 /* Create a tree of widget_value objects 620 /* Create a tree of widget_value objects
@@ -830,6 +831,7 @@ pgtk_menu_show (struct frame *f, int x, int y, int menuflags,
830 entry = Fcons (subprefix_stack[j], entry); 831 entry = Fcons (subprefix_stack[j], entry);
831 } 832 }
832 unblock_input (); 833 unblock_input ();
834 SAFE_FREE ();
833 return entry; 835 return entry;
834 } 836 }
835 i += MENU_ITEMS_ITEM_LENGTH; 837 i += MENU_ITEMS_ITEM_LENGTH;
@@ -844,6 +846,7 @@ pgtk_menu_show (struct frame *f, int x, int y, int menuflags,
844 } 846 }
845 847
846 unblock_input (); 848 unblock_input ();
849 SAFE_FREE ();
847 return Qnil; 850 return Qnil;
848} 851}
849 852
diff --git a/src/xmenu.c b/src/xmenu.c
index ce5cdbcfc0b..f95c50b1833 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -1898,14 +1898,10 @@ x_menu_show (struct frame *f, int x, int y, int menuflags,
1898 widget_value **submenu_stack; 1898 widget_value **submenu_stack;
1899 Lisp_Object *subprefix_stack; 1899 Lisp_Object *subprefix_stack;
1900 int submenu_depth = 0; 1900 int submenu_depth = 0;
1901 specpdl_ref specpdl_count;
1902
1903 USE_SAFE_ALLOCA; 1901 USE_SAFE_ALLOCA;
1904
1905 SAFE_NALLOCA (submenu_stack, 1, menu_items_used); 1902 SAFE_NALLOCA (submenu_stack, 1, menu_items_used);
1906 SAFE_NALLOCA (subprefix_stack, 1, menu_items_used); 1903 SAFE_NALLOCA (subprefix_stack, 1, menu_items_used);
1907 1904 specpdl_ref specpdl_count = SPECPDL_INDEX ();
1908 specpdl_count = SPECPDL_INDEX ();
1909 1905
1910 eassert (FRAME_X_P (f)); 1906 eassert (FRAME_X_P (f));
1911 1907