Explorar o código

Run: Fix bug where it would crash because uninitialized main widget

The set_main_widget<T>() function only calls the construct and not
`try_create()` that the GMLCompiler generates so all calls to
`find_descendant_of_type_named()` would result in null
pointers that would resolve in a crash.
Bastiaan van der Plaat hai 1 ano
pai
achega
582bf1eaf3

+ 7 - 2
Userland/Applications/Run/RunWindow.cpp

@@ -26,6 +26,8 @@
 #include <sys/wait.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <unistd.h>
 
 
+namespace Run {
+
 RunWindow::RunWindow()
 RunWindow::RunWindow()
     : m_path_history()
     : m_path_history()
     , m_path_history_model(GUI::ItemListModel<ByteString>::create(m_path_history))
     , m_path_history_model(GUI::ItemListModel<ByteString>::create(m_path_history))
@@ -41,7 +43,8 @@ RunWindow::RunWindow()
     set_resizable(false);
     set_resizable(false);
     set_minimizable(false);
     set_minimizable(false);
 
 
-    auto main_widget = set_main_widget<Run::MainWidget>();
+    auto main_widget = MUST(Run::MainWidget::try_create());
+    set_main_widget(main_widget);
 
 
     m_icon_image_widget = *main_widget->find_descendant_of_type_named<GUI::ImageWidget>("icon");
     m_icon_image_widget = *main_widget->find_descendant_of_type_named<GUI::ImageWidget>("icon");
     m_icon_image_widget->set_bitmap(app_icon.bitmap_for_size(32));
     m_icon_image_widget->set_bitmap(app_icon.bitmap_for_size(32));
@@ -62,7 +65,7 @@ RunWindow::RunWindow()
         close();
         close();
     };
     };
 
 
-    m_browse_button = *find_descendant_of_type_named<GUI::DialogButton>("browse_button");
+    m_browse_button = *main_widget->find_descendant_of_type_named<GUI::DialogButton>("browse_button");
     m_browse_button->on_click = [this](auto) {
     m_browse_button->on_click = [this](auto) {
         Optional<ByteString> path = GUI::FilePicker::get_open_filepath(this, {}, Core::StandardPaths::home_directory(), false, GUI::Dialog::ScreenPosition::Center);
         Optional<ByteString> path = GUI::FilePicker::get_open_filepath(this, {}, Core::StandardPaths::home_directory(), false, GUI::Dialog::ScreenPosition::Center);
         if (path.has_value())
         if (path.has_value())
@@ -189,3 +192,5 @@ ErrorOr<void> RunWindow::save_history()
 
 
     return {};
     return {};
 }
 }
+
+}

+ 4 - 0
Userland/Applications/Run/RunWindow.h

@@ -13,6 +13,8 @@
 #include <LibGUI/ItemListModel.h>
 #include <LibGUI/ItemListModel.h>
 #include <LibGUI/Window.h>
 #include <LibGUI/Window.h>
 
 
+namespace Run {
+
 class RunWindow final : public GUI::Window {
 class RunWindow final : public GUI::Window {
     C_OBJECT(RunWindow)
     C_OBJECT(RunWindow)
 public:
 public:
@@ -40,3 +42,5 @@ private:
     RefPtr<GUI::Button> m_browse_button;
     RefPtr<GUI::Button> m_browse_button;
     RefPtr<GUI::ComboBox> m_path_combo_box;
     RefPtr<GUI::ComboBox> m_path_combo_box;
 };
 };
+
+}

+ 1 - 1
Userland/Applications/Run/main.cpp

@@ -15,7 +15,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     TRY(Core::System::pledge("stdio recvfd sendfd thread cpath rpath wpath unix proc exec"));
     TRY(Core::System::pledge("stdio recvfd sendfd thread cpath rpath wpath unix proc exec"));
 
 
     auto app = TRY(GUI::Application::create(arguments));
     auto app = TRY(GUI::Application::create(arguments));
-    auto window = TRY(RunWindow::try_create());
+    auto window = TRY(Run::RunWindow::try_create());
 
 
     constexpr int margin = 16;
     constexpr int margin = 16;
     window->move_to(margin, GUI::Desktop::the().rect().bottom() - 1 - GUI::Desktop::the().taskbar_height() - margin - window->height());
     window->move_to(margin, GUI::Desktop::the().rect().bottom() - 1 - GUI::Desktop::the().taskbar_height() - margin - window->height());