diff options
| author | Paul Eggert | 2025-01-26 22:15:49 -0800 |
|---|---|---|
| committer | Paul Eggert | 2025-01-26 23:05:52 -0800 |
| commit | 6ff06ff738ead96d7b4cb59eda15a1c72e2b5776 (patch) | |
| tree | 1efedcaacd877b77f08de6f334b33a9ac607fe11 /src | |
| parent | 17a8bf53f390718756e397cc0b31c1ef2c7de5f0 (diff) | |
| download | emacs-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.c | 15 | ||||
| -rw-r--r-- | src/xmenu.c | 6 |
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 | ||