From ad3acfc847e9d54f07a0684c19181d5f4c28fee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Mon, 5 Oct 2020 18:27:55 +0200 Subject: [PATCH] Handle Panel_getSelected() returning NULL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Found by compiling with LTO: ColumnsPanel.c: In function ‘ColumnsPanel_eventHandler’: ColumnsPanel.c:46:59: error: potential null pointer dereference [-Werror=null-dereference] 46 | ((ListItem*)Panel_getSelected(super))->moving = this->moving; | ^ AvailableColumnsPanel.c: In function ‘AvailableColumnsPanel_eventHandler’: AvailableColumnsPanel.c:31:8: error: potential null pointer dereference [-Werror=null-dereference] 31 | int key = ((ListItem*) Panel_getSelected(super))->key; | ^ AvailableMetersPanel.c: In function ‘AvailableMetersPanel_eventHandler’: AvailableMetersPanel.c:40:24: error: potential null pointer dereference [-Werror=null-dereference] 40 | int param = selected->key & 0xff; | ^ linux/IOPriorityPanel.c: In function ‘IOPriorityPanel_getIOPriority’: linux/IOPriorityPanel.c:37:11: error: potential null pointer dereference [-Werror=null-dereference] 37 | return (IOPriority) ( ((ListItem*) Panel_getSelected(this))->key ); | ^ --- AvailableColumnsPanel.c | 6 +++++- AvailableMetersPanel.c | 5 ++++- ColumnsPanel.c | 4 +++- linux/IOPriorityPanel.c | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/AvailableColumnsPanel.c b/AvailableColumnsPanel.c index e605ae52..fd247af0 100644 --- a/AvailableColumnsPanel.c +++ b/AvailableColumnsPanel.c @@ -28,7 +28,6 @@ static void AvailableColumnsPanel_delete(Object* object) { static HandlerResult AvailableColumnsPanel_eventHandler(Panel* super, int ch) { AvailableColumnsPanel* this = (AvailableColumnsPanel*) super; - int key = ((ListItem*) Panel_getSelected(super))->key; HandlerResult result = IGNORED; switch(ch) { @@ -36,6 +35,11 @@ static HandlerResult AvailableColumnsPanel_eventHandler(Panel* super, int ch) { case KEY_ENTER: case KEY_F(5): { + const ListItem* selected = (ListItem*) Panel_getSelected(super); + if (!selected) + break; + + int key = selected->key; int at = Panel_getSelectedIndex(this->columns); Panel_insert(this->columns, at, (Object*) ListItem_new(Process_fields[key].name, key)); Panel_setSelected(this->columns, at+1); diff --git a/AvailableMetersPanel.c b/AvailableMetersPanel.c index 604a6891..f5e59218 100644 --- a/AvailableMetersPanel.c +++ b/AvailableMetersPanel.c @@ -36,7 +36,10 @@ static HandlerResult AvailableMetersPanel_eventHandler(Panel* super, int ch) { AvailableMetersPanel* this = (AvailableMetersPanel*) super; Header* header = this->header; - ListItem* selected = (ListItem*) Panel_getSelected(super); + const ListItem* selected = (ListItem*) Panel_getSelected(super); + if (!selected) + return IGNORED; + int param = selected->key & 0xff; int type = selected->key >> 16; HandlerResult result = IGNORED; diff --git a/ColumnsPanel.c b/ColumnsPanel.c index d7132e18..8328d15e 100644 --- a/ColumnsPanel.c +++ b/ColumnsPanel.c @@ -43,7 +43,9 @@ static HandlerResult ColumnsPanel_eventHandler(Panel* super, int ch) { if (selected < size - 1) { this->moving = !(this->moving); Panel_setSelectionColor(super, this->moving ? CRT_colors[PANEL_SELECTION_FOLLOW] : CRT_colors[PANEL_SELECTION_FOCUS]); - ((ListItem*)Panel_getSelected(super))->moving = this->moving; + ListItem* selectedItem = (ListItem*) Panel_getSelected(super); + if (selectedItem) + selectedItem->moving = this->moving; result = HANDLED; } break; diff --git a/linux/IOPriorityPanel.c b/linux/IOPriorityPanel.c index b3b1a37b..a12b8065 100644 --- a/linux/IOPriorityPanel.c +++ b/linux/IOPriorityPanel.c @@ -34,5 +34,6 @@ Panel* IOPriorityPanel_new(IOPriority currPrio) { } IOPriority IOPriorityPanel_getIOPriority(Panel* this) { - return (IOPriority) ( ((ListItem*) Panel_getSelected(this))->key ); + const ListItem* selected = (ListItem*) Panel_getSelected(this); + return selected ? selected->key : IOPriority_None; }