mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-10-31 23:06:43 +08:00 
			
		
		
		
	Merge pull request #6257 from Morph1984/fix-use-after-free-webapplet
applets/web: Fix a use-after-free when passing in the URL string
This commit is contained in:
		
						commit
						fa3ffff8de
					
				| @ -12,7 +12,7 @@ WebBrowserApplet::~WebBrowserApplet() = default; | ||||
| DefaultWebBrowserApplet::~DefaultWebBrowserApplet() = default; | ||||
| 
 | ||||
| void DefaultWebBrowserApplet::OpenLocalWebPage( | ||||
|     std::string_view local_url, std::function<void()> extract_romfs_callback, | ||||
|     const std::string& local_url, std::function<void()> extract_romfs_callback, | ||||
|     std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const { | ||||
|     LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to open local web page at {}", | ||||
|                 local_url); | ||||
| @ -21,7 +21,7 @@ void DefaultWebBrowserApplet::OpenLocalWebPage( | ||||
| } | ||||
| 
 | ||||
| void DefaultWebBrowserApplet::OpenExternalWebPage( | ||||
|     std::string_view external_url, | ||||
|     const std::string& external_url, | ||||
|     std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const { | ||||
|     LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to open external web page at {}", | ||||
|                 external_url); | ||||
|  | ||||
| @ -16,11 +16,11 @@ public: | ||||
|     virtual ~WebBrowserApplet(); | ||||
| 
 | ||||
|     virtual void OpenLocalWebPage( | ||||
|         std::string_view local_url, std::function<void()> extract_romfs_callback, | ||||
|         const std::string& local_url, std::function<void()> extract_romfs_callback, | ||||
|         std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const = 0; | ||||
| 
 | ||||
|     virtual void OpenExternalWebPage( | ||||
|         std::string_view external_url, | ||||
|         const std::string& external_url, | ||||
|         std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const = 0; | ||||
| }; | ||||
| 
 | ||||
| @ -28,11 +28,12 @@ class DefaultWebBrowserApplet final : public WebBrowserApplet { | ||||
| public: | ||||
|     ~DefaultWebBrowserApplet() override; | ||||
| 
 | ||||
|     void OpenLocalWebPage(std::string_view local_url, std::function<void()> extract_romfs_callback, | ||||
|     void OpenLocalWebPage(const std::string& local_url, | ||||
|                           std::function<void()> extract_romfs_callback, | ||||
|                           std::function<void(Service::AM::Applets::WebExitReason, std::string)> | ||||
|                               callback) const override; | ||||
| 
 | ||||
|     void OpenExternalWebPage(std::string_view external_url, | ||||
|     void OpenExternalWebPage(const std::string& external_url, | ||||
|                              std::function<void(Service::AM::Applets::WebExitReason, std::string)> | ||||
|                                  callback) const override; | ||||
| }; | ||||
|  | ||||
| @ -102,8 +102,8 @@ QtNXWebEngineView::~QtNXWebEngineView() { | ||||
|     StopInputThread(); | ||||
| } | ||||
| 
 | ||||
| void QtNXWebEngineView::LoadLocalWebPage(std::string_view main_url, | ||||
|                                          std::string_view additional_args) { | ||||
| void QtNXWebEngineView::LoadLocalWebPage(const std::string& main_url, | ||||
|                                          const std::string& additional_args) { | ||||
|     is_local = true; | ||||
| 
 | ||||
|     LoadExtractedFonts(); | ||||
| @ -113,12 +113,12 @@ void QtNXWebEngineView::LoadLocalWebPage(std::string_view main_url, | ||||
|     SetLastURL("http://localhost/"); | ||||
|     StartInputThread(); | ||||
| 
 | ||||
|     load(QUrl(QUrl::fromLocalFile(QString::fromStdString(std::string(main_url))).toString() + | ||||
|               QString::fromStdString(std::string(additional_args)))); | ||||
|     load(QUrl(QUrl::fromLocalFile(QString::fromStdString(main_url)).toString() + | ||||
|               QString::fromStdString(additional_args))); | ||||
| } | ||||
| 
 | ||||
| void QtNXWebEngineView::LoadExternalWebPage(std::string_view main_url, | ||||
|                                             std::string_view additional_args) { | ||||
| void QtNXWebEngineView::LoadExternalWebPage(const std::string& main_url, | ||||
|                                             const std::string& additional_args) { | ||||
|     is_local = false; | ||||
| 
 | ||||
|     SetUserAgent(UserAgent::WebApplet); | ||||
| @ -127,8 +127,7 @@ void QtNXWebEngineView::LoadExternalWebPage(std::string_view main_url, | ||||
|     SetLastURL("http://localhost/"); | ||||
|     StartInputThread(); | ||||
| 
 | ||||
|     load(QUrl(QString::fromStdString(std::string(main_url)) + | ||||
|               QString::fromStdString(std::string(additional_args)))); | ||||
|     load(QUrl(QString::fromStdString(main_url) + QString::fromStdString(additional_args))); | ||||
| } | ||||
| 
 | ||||
| void QtNXWebEngineView::SetUserAgent(UserAgent user_agent) { | ||||
| @ -375,7 +374,7 @@ QtWebBrowser::QtWebBrowser(GMainWindow& main_window) { | ||||
| QtWebBrowser::~QtWebBrowser() = default; | ||||
| 
 | ||||
| void QtWebBrowser::OpenLocalWebPage( | ||||
|     std::string_view local_url, std::function<void()> extract_romfs_callback_, | ||||
|     const std::string& local_url, std::function<void()> extract_romfs_callback_, | ||||
|     std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback_) const { | ||||
|     extract_romfs_callback = std::move(extract_romfs_callback_); | ||||
|     callback = std::move(callback_); | ||||
| @ -390,7 +389,7 @@ void QtWebBrowser::OpenLocalWebPage( | ||||
| } | ||||
| 
 | ||||
| void QtWebBrowser::OpenExternalWebPage( | ||||
|     std::string_view external_url, | ||||
|     const std::string& external_url, | ||||
|     std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback_) const { | ||||
|     callback = std::move(callback_); | ||||
| 
 | ||||
|  | ||||
| @ -58,7 +58,7 @@ public: | ||||
|      * @param main_url The url to the file. | ||||
|      * @param additional_args Additional arguments appended to the main url. | ||||
|      */ | ||||
|     void LoadLocalWebPage(std::string_view main_url, std::string_view additional_args); | ||||
|     void LoadLocalWebPage(const std::string& main_url, const std::string& additional_args); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Loads an external website. Cannot be used to load local urls. | ||||
| @ -66,7 +66,7 @@ public: | ||||
|      * @param main_url The url to the website. | ||||
|      * @param additional_args Additional arguments appended to the main url. | ||||
|      */ | ||||
|     void LoadExternalWebPage(std::string_view main_url, std::string_view additional_args); | ||||
|     void LoadExternalWebPage(const std::string& main_url, const std::string& additional_args); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Sets the background color of the web page. | ||||
| @ -193,16 +193,17 @@ public: | ||||
|     explicit QtWebBrowser(GMainWindow& parent); | ||||
|     ~QtWebBrowser() override; | ||||
| 
 | ||||
|     void OpenLocalWebPage(std::string_view local_url, std::function<void()> extract_romfs_callback_, | ||||
|     void OpenLocalWebPage(const std::string& local_url, | ||||
|                           std::function<void()> extract_romfs_callback_, | ||||
|                           std::function<void(Service::AM::Applets::WebExitReason, std::string)> | ||||
|                               callback_) const override; | ||||
| 
 | ||||
|     void OpenExternalWebPage(std::string_view external_url, | ||||
|     void OpenExternalWebPage(const std::string& external_url, | ||||
|                              std::function<void(Service::AM::Applets::WebExitReason, std::string)> | ||||
|                                  callback_) const override; | ||||
| 
 | ||||
| signals: | ||||
|     void MainWindowOpenWebPage(std::string_view main_url, std::string_view additional_args, | ||||
|     void MainWindowOpenWebPage(const std::string& main_url, const std::string& additional_args, | ||||
|                                bool is_local) const; | ||||
| 
 | ||||
| private: | ||||
|  | ||||
| @ -574,8 +574,8 @@ void GMainWindow::SoftwareKeyboardExit() { | ||||
|     software_keyboard = nullptr; | ||||
| } | ||||
| 
 | ||||
| void GMainWindow::WebBrowserOpenWebPage(std::string_view main_url, std::string_view additional_args, | ||||
|                                         bool is_local) { | ||||
| void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url, | ||||
|                                         const std::string& additional_args, bool is_local) { | ||||
| #ifdef YUZU_USE_QT_WEB_ENGINE | ||||
| 
 | ||||
|     if (disable_web_applet) { | ||||
| @ -596,13 +596,15 @@ void GMainWindow::WebBrowserOpenWebPage(std::string_view main_url, std::string_v | ||||
|         loading_progress.setRange(0, 3); | ||||
|         loading_progress.setValue(0); | ||||
| 
 | ||||
|         if (is_local && !Common::FS::Exists(std::string(main_url))) { | ||||
|         if (is_local && !Common::FS::Exists(main_url)) { | ||||
|             loading_progress.show(); | ||||
| 
 | ||||
|             auto future = QtConcurrent::run([this] { emit WebBrowserExtractOfflineRomFS(); }); | ||||
| 
 | ||||
|             while (!future.isFinished()) { | ||||
|                 QCoreApplication::processEvents(); | ||||
| 
 | ||||
|                 std::this_thread::sleep_for(std::chrono::milliseconds(1)); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | ||||
| @ -159,7 +159,7 @@ public slots: | ||||
|     void SoftwareKeyboardExit(); | ||||
|     void ErrorDisplayDisplayError(QString error_code, QString error_text); | ||||
|     void ProfileSelectorSelectProfile(); | ||||
|     void WebBrowserOpenWebPage(std::string_view main_url, std::string_view additional_args, | ||||
|     void WebBrowserOpenWebPage(const std::string& main_url, const std::string& additional_args, | ||||
|                                bool is_local); | ||||
|     void OnAppFocusStateChanged(Qt::ApplicationState state); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user