summaryrefslogtreecommitdiffstats
path: root/ScreensPanel.c
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 /ScreensPanel.c
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
Diffstat (limited to 'ScreensPanel.c')
-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