Skip to content

Commit 514481e

Browse files
committed
Tile event handler : read the event data only if the event is a "value changed event". LVGL sends many other event and some of them do not set the event data (global static variable) to a valid address, which may cause an invalid read. I noticed that when porting this class on RISC-V platform (BL602).
1 parent 7b75ca5 commit 514481e

2 files changed

Lines changed: 11 additions & 9 deletions

File tree

src/displayapp/screens/Tile.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@ using namespace Pinetime::Applications::Screens;
66

77
namespace {
88
static void lv_update_task(struct _lv_task_t* task) {
9-
auto user_data = static_cast<Tile*>(task->user_data);
9+
auto* user_data = static_cast<Tile*>(task->user_data);
1010
user_data->UpdateScreen();
1111
}
1212

1313
static void event_handler(lv_obj_t* obj, lv_event_t event) {
14+
if (event != LV_EVENT_VALUE_CHANGED) return;
15+
1416
Tile* screen = static_cast<Tile*>(obj->user_data);
15-
uint32_t* eventDataPtr = (uint32_t*) lv_event_get_data();
17+
auto* eventDataPtr = (uint32_t*) lv_event_get_data();
1618
uint32_t eventData = *eventDataPtr;
17-
screen->OnObjectEvent(obj, event, eventData);
19+
screen->OnValueChangedEvent(obj, eventData);
1820
}
1921
}
2022

@@ -124,9 +126,9 @@ bool Tile::Refresh() {
124126
return running;
125127
}
126128

127-
void Tile::OnObjectEvent(lv_obj_t* obj, lv_event_t event, uint32_t buttonId) {
128-
if (event == LV_EVENT_VALUE_CHANGED) {
129-
app->StartApp(apps[buttonId], DisplayApp::FullRefreshDirections::Up);
130-
running = false;
131-
}
129+
void Tile::OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId) {
130+
if(obj != btnm1) return;
131+
132+
app->StartApp(apps[buttonId], DisplayApp::FullRefreshDirections::Up);
133+
running = false;
132134
}

src/displayapp/screens/Tile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace Pinetime {
3232

3333
bool Refresh() override;
3434
void UpdateScreen();
35-
void OnObjectEvent(lv_obj_t* obj, lv_event_t event, uint32_t buttonId);
35+
void OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId);
3636

3737
private:
3838
Pinetime::Controllers::Battery& batteryController;

0 commit comments

Comments
 (0)