From 048b1aaec8d5cd4ce6e6a5a9b8091608d0af81a6 Mon Sep 17 00:00:00 2001 From: Alan Third Date: Tue, 5 Jan 2021 21:43:12 +0000 Subject: [PATCH] Prevent stack overflow in GNUstep menu code * src/nsmenu.m (ns_update_menubar): Always do a deep update for GNUstep. ([EmacsMenu menuNeedsUpdate:]): Don't update the menu as it should always have had a deep update. --- src/nsmenu.m | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/nsmenu.m b/src/nsmenu.m index 9b56958100a..8086f56854e 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -145,6 +145,10 @@ ns_update_menubar (struct frame *f, bool deep_p) t = -(1000*tb.time+tb.millitm); #endif +#ifdef NS_IMPL_GNUSTEP + deep_p = 1; /* See comment in menuNeedsUpdate. */ +#endif + if (deep_p) { /* Make a widget-value tree representing the entire menu trees. */ @@ -433,21 +437,22 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) } -/* Delegate method called when a submenu is being opened: run a 'deep' call - to set_frame_menubar. */ - -/* TODO: GNUstep calls this method when the menu is still being built - which throws it into an infinite loop. One possible solution is to - use menuWillOpen instead, but the Apple docs explicitly warn - against changing the contents of the menu in it. I don't know what - the right thing to do for GNUstep is. */ +/* Delegate method called when a submenu is being opened: run a 'deep' + call to ns_update_menubar. */ - (void)menuNeedsUpdate: (NSMenu *)menu { if (!FRAME_LIVE_P (SELECTED_FRAME ())) return; +#ifdef NS_IMPL_COCOA +/* TODO: GNUstep calls this method when the menu is still being built + which results in a recursive stack overflow. One possible solution + is to use menuWillOpen instead, but the Apple docs explicitly warn + against changing the contents of the menu in it. I don't know what + the right thing to do for GNUstep is. */ if (needsUpdate) ns_update_menubar (SELECTED_FRAME (), true); +#endif } -- 2.39.5