From 5112d9139dfdd58f80230d30514e3e5d58735839 Mon Sep 17 00:00:00 2001 From: Arthur Sonzogni Date: Wed, 10 Jan 2024 22:08:57 +0100 Subject: [PATCH] Button: invoke `on_click` at the end. (#807) Some users might destroy `this`, which would result in UAF. In the future, we should consider alternatives like posting a task to the main loop, or rely on users for this. Fixed:https://github.com/ArthurSonzogni/FTXUI/issues/804 --- src/ftxui/component/button.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ftxui/component/button.cpp b/src/ftxui/component/button.cpp index c983f31f..f16dcf44 100644 --- a/src/ftxui/component/button.cpp +++ b/src/ftxui/component/button.cpp @@ -98,10 +98,13 @@ class ButtonBase : public ComponentBase, public ButtonOption { } void OnClick() { - on_click(); animation_background_ = 0.5F; // NOLINT animation_foreground_ = 0.5F; // NOLINT SetAnimationTarget(1.F); // NOLINT + + // TODO(arthursonzogni): Consider posting the task to the main loop, instead + // of invoking it immediately. + on_click(); // May delete this. } bool OnEvent(Event event) override { @@ -110,7 +113,7 @@ class ButtonBase : public ComponentBase, public ButtonOption { } if (event == Event::Return) { - OnClick(); + OnClick(); // May delete this. return true; } return false; @@ -127,7 +130,7 @@ class ButtonBase : public ComponentBase, public ButtonOption { if (event.mouse().button == Mouse::Left && event.mouse().motion == Mouse::Pressed) { TakeFocus(); - OnClick(); + OnClick(); // May delete this. return true; }