From 398969df19cd9017b5abe55bc4de1b4ce811b608 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Wed, 4 Aug 2021 10:11:33 +0200 Subject: [PATCH] [keyboard] Fix nullptr access while trying to find a suitable full screen window --- .../thirdparty/libopenui/src/keyboard_base.h | 23 ++++++++----------- radio/src/thirdparty/libopenui/src/window.h | 6 +++-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/radio/src/thirdparty/libopenui/src/keyboard_base.h b/radio/src/thirdparty/libopenui/src/keyboard_base.h index bd7376ee6..fb6859eb8 100644 --- a/radio/src/thirdparty/libopenui/src/keyboard_base.h +++ b/radio/src/thirdparty/libopenui/src/keyboard_base.h @@ -53,11 +53,15 @@ class Keyboard: public FormWindow activeKeyboard = this; attach(MainWindow::instance()); fieldContainer = getFieldContainer(newField); - fieldContainer->setHeight(LCD_H - height() - fieldContainer->top()); - fieldContainer->scrollTo(newField); - invalidate(); - newField->setEditMode(true); - field = newField; + if (fieldContainer) { + fieldContainer->setHeight(LCD_H - height() - fieldContainer->top()); + fieldContainer->scrollTo(newField); + invalidate(); + newField->setEditMode(true); + field = newField; + } else { + clearField(); + } } void clearField() @@ -75,14 +79,7 @@ class Keyboard: public FormWindow Window * getFieldContainer(FormField * field) { - Window * parent = field; - while (true) { - Window * tmp = parent->getParent(); - if ((tmp->getWindowFlags() & OPAQUE) && tmp->width() == LCD_W && tmp->height() == LCD_H) { - return parent; - } - parent = tmp; - } + return field->getFullScreenWindow(); } }; diff --git a/radio/src/thirdparty/libopenui/src/window.h b/radio/src/thirdparty/libopenui/src/window.h index 0afe516f1..a3cbbb964 100644 --- a/radio/src/thirdparty/libopenui/src/window.h +++ b/radio/src/thirdparty/libopenui/src/window.h @@ -107,9 +107,11 @@ class Window return window == this || (parent && parent->isChild(window)); } - Window * getFullScreenWindow() + Window *getFullScreenWindow() { - return (width() == LCD_W && height() == LCD_H) ? this : parent->getFullScreenWindow(); + if (width() == LCD_W && height() == LCD_H) return this; + if (parent) return parent->getFullScreenWindow(); + return nullptr; } WindowFlags getWindowFlags() const