dosbox-x: Fix segfault at startup

Signed-off-by: Andreas Müller <schnitzeltony@gmail.com>
This commit is contained in:
Andreas Müller
2020-10-21 22:33:30 +02:00
parent 2be950e1c8
commit 368ee22a59
2 changed files with 50 additions and 0 deletions

View File

@@ -22,6 +22,7 @@ SRC_URI = " \
git://github.com/joncampbell123/dosbox-x.git \
file://0001-use-pkgconfig-to-find-sdl2.patch \
file://0002-Enable-unaligned-memory-based-on-recipe-s-suggestion.patch \
file://0003-menu-Fix-segfaults-during-menu-creation-in-some-envi.patch \
file://dosbox-x.desktop \
"
SRCREV = "0f1435e18d06ac955f26211541a9556bac759ae2"

View File

@@ -0,0 +1,49 @@
From 2379a88528a627c9f67655202eaa021627fc619f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@gmail.com>
Date: Wed, 21 Oct 2020 22:06:50 +0200
Subject: [PATCH] menu: Fix segfaults during menu-creation in some environments
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Yocto/Openembedded builds of dosbox-x for armv7 (Raspi4/32Bit/GCC10) segfaultet
at startup. Remote debug sessions showed that mainMenu.get_item was called
before separator_get so that vector separators was not yet prepared.
To get around, ensure separator_get is called before continuing.
Upstream-Status: Submitted[https://github.com/joncampbell123/dosbox-x/pull/1960]
Signed-off-by: Andreas Müller <schnitzeltony@gmail.com>
---
src/gui/menu.cpp | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/gui/menu.cpp b/src/gui/menu.cpp
index 30e62239f..1a76a3ce4 100644
--- a/src/gui/menu.cpp
+++ b/src/gui/menu.cpp
@@ -1272,12 +1272,18 @@ void ConstructSubMenu(DOSBoxMenu::item_handle_t item_id, const char * const * li
* array lookup, this is not very inefficient at all. */
if (!strcmp(ref,"--")) {
+ /* separator is allocated on the fly by separator_get and we cannot
+ * rely that parameters are expanded from right to left
+ * -> we must get separator handle first */
+ DOSBoxMenu::item_handle_t separator_handle = separator_get(DOSBoxMenu::separator_type_id);
mainMenu.displaylist_append(
- mainMenu.get_item(item_id).display_list, separator_get(DOSBoxMenu::separator_type_id));
+ mainMenu.get_item(item_id).display_list, separator_handle);
}
else if (!strcmp(ref,"||")) {
+ /* dito */
+ DOSBoxMenu::item_handle_t separator_handle = separator_get(DOSBoxMenu::vseparator_type_id);
mainMenu.displaylist_append(
- mainMenu.get_item(item_id).display_list, separator_get(DOSBoxMenu::vseparator_type_id));
+ mainMenu.get_item(item_id).display_list, separator_handle);
}
else if (mainMenu.item_exists(ref)) {
mainMenu.displaylist_append(
--
2.26.2