summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Scott <nathans@redhat.com>2022-07-25 17:16:36 +1000
committerBenBE <BenBE@geshi.org>2022-07-26 08:14:45 +0200
commitccbd490e9bbf17ac5a6d5e4131ba9ae648fe396b (patch)
tree8904a12a15627fdcf66c1febe5f2e9a5c70020df
parentf3e70ab389879db5b250bab29f14acb543bfd11f (diff)
Reset ss and ssIndex Settings fields after screen removal
In the situation where the currently displayed screen is removed we could end up with an invalid ss pointer (and associated index) in the global Settings structure. Any subsequent access to these fields would make an invalid pointer dereference. Fixes: #1053
-rw-r--r--ScreensPanel.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/ScreensPanel.c b/ScreensPanel.c
index 785c3878..3d55546c 100644
--- a/ScreensPanel.c
+++ b/ScreensPanel.c
@@ -132,7 +132,7 @@ static void startRenaming(Panel* super) {
Panel_setCursorToSelection(super);
}
-static void rebuildSettingsArray(Panel* super) {
+static void rebuildSettingsArray(Panel* super, int selected) {
ScreensPanel* const this = (ScreensPanel*) super;
int n = Panel_size(super);
@@ -144,6 +144,13 @@ static void rebuildSettingsArray(Panel* super) {
this->settings->screens[i] = item->ss;
}
this->settings->nScreens = n;
+ /* ensure selection is in valid range */
+ if (selected > n - 1)
+ selected = n - 1;
+ else if (selected < 0)
+ selected = 0;
+ this->settings->ssIndex = selected;
+ this->settings->ss = this->settings->screens[selected];
}
static void addNewScreen(Panel* super) {
@@ -242,9 +249,8 @@ static HandlerResult ScreensPanel_eventHandlerNormal(Panel* super, int ch) {
case KEY_F(9):
//case KEY_DC:
{
- if (Panel_size(super) > 1) {
+ if (Panel_size(super) > 1)
Panel_remove(super, selected);
- }
shouldRebuildArray = true;
result = HANDLED;
break;
@@ -264,7 +270,7 @@ static HandlerResult ScreensPanel_eventHandlerNormal(Panel* super, int ch) {
result = HANDLED;
}
if (shouldRebuildArray)
- rebuildSettingsArray(super);
+ rebuildSettingsArray(super, selected);
if (result == HANDLED)
ScreensPanel_update(super);
return result;

© 2014-2024 Faster IT GmbH | imprint | privacy policy