summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Morph2021-04-28 11:32:44 -0400
committerGravatar Morph2021-04-28 12:34:28 -0400
commit0af182baa2f35d91b8dfaf0b5a8fef06b77dd03a (patch)
treee38c0517595bffd75e5b3df06084fce8531c48f1 /src
parentMerge pull request #6250 from lioncash/loader-shadow (diff)
downloadyuzu-0af182baa2f35d91b8dfaf0b5a8fef06b77dd03a.tar.gz
yuzu-0af182baa2f35d91b8dfaf0b5a8fef06b77dd03a.tar.xz
yuzu-0af182baa2f35d91b8dfaf0b5a8fef06b77dd03a.zip
applets/web: Fix a use-after-free when passing in the URL string
The URL string was being deleted before being used, leading to a use-after-free occurring when it is used afterwards. Fix this by taking the string by const ref to extend its lifetime, ensuring it doesn't get deleted before use.
Diffstat (limited to 'src')
-rw-r--r--src/core/frontend/applets/web_browser.cpp4
-rw-r--r--src/core/frontend/applets/web_browser.h9
-rw-r--r--src/yuzu/applets/web_browser.cpp19
-rw-r--r--src/yuzu/applets/web_browser.h11
-rw-r--r--src/yuzu/main.cpp8
-rw-r--r--src/yuzu/main.h2
6 files changed, 28 insertions, 25 deletions
diff --git a/src/core/frontend/applets/web_browser.cpp b/src/core/frontend/applets/web_browser.cpp
index 50db6a654..be4736f47 100644
--- a/src/core/frontend/applets/web_browser.cpp
+++ b/src/core/frontend/applets/web_browser.cpp
@@ -12,7 +12,7 @@ WebBrowserApplet::~WebBrowserApplet() = default;
12DefaultWebBrowserApplet::~DefaultWebBrowserApplet() = default; 12DefaultWebBrowserApplet::~DefaultWebBrowserApplet() = default;
13 13
14void DefaultWebBrowserApplet::OpenLocalWebPage( 14void DefaultWebBrowserApplet::OpenLocalWebPage(
15 std::string_view local_url, std::function<void()> extract_romfs_callback, 15 const std::string& local_url, std::function<void()> extract_romfs_callback,
16 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const { 16 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const {
17 LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to open local web page at {}", 17 LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to open local web page at {}",
18 local_url); 18 local_url);
@@ -21,7 +21,7 @@ void DefaultWebBrowserApplet::OpenLocalWebPage(
21} 21}
22 22
23void DefaultWebBrowserApplet::OpenExternalWebPage( 23void DefaultWebBrowserApplet::OpenExternalWebPage(
24 std::string_view external_url, 24 const std::string& external_url,
25 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const { 25 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const {
26 LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to open external web page at {}", 26 LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to open external web page at {}",
27 external_url); 27 external_url);
diff --git a/src/core/frontend/applets/web_browser.h b/src/core/frontend/applets/web_browser.h
index 1c5ef19a9..d7bd44c27 100644
--- a/src/core/frontend/applets/web_browser.h
+++ b/src/core/frontend/applets/web_browser.h
@@ -16,11 +16,11 @@ public:
16 virtual ~WebBrowserApplet(); 16 virtual ~WebBrowserApplet();
17 17
18 virtual void OpenLocalWebPage( 18 virtual void OpenLocalWebPage(
19 std::string_view local_url, std::function<void()> extract_romfs_callback, 19 const std::string& local_url, std::function<void()> extract_romfs_callback,
20 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const = 0; 20 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const = 0;
21 21
22 virtual void OpenExternalWebPage( 22 virtual void OpenExternalWebPage(
23 std::string_view external_url, 23 const std::string& external_url,
24 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const = 0; 24 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback) const = 0;
25}; 25};
26 26
@@ -28,11 +28,12 @@ class DefaultWebBrowserApplet final : public WebBrowserApplet {
28public: 28public:
29 ~DefaultWebBrowserApplet() override; 29 ~DefaultWebBrowserApplet() override;
30 30
31 void OpenLocalWebPage(std::string_view local_url, std::function<void()> extract_romfs_callback, 31 void OpenLocalWebPage(const std::string& local_url,
32 std::function<void()> extract_romfs_callback,
32 std::function<void(Service::AM::Applets::WebExitReason, std::string)> 33 std::function<void(Service::AM::Applets::WebExitReason, std::string)>
33 callback) const override; 34 callback) const override;
34 35
35 void OpenExternalWebPage(std::string_view external_url, 36 void OpenExternalWebPage(const std::string& external_url,
36 std::function<void(Service::AM::Applets::WebExitReason, std::string)> 37 std::function<void(Service::AM::Applets::WebExitReason, std::string)>
37 callback) const override; 38 callback) const override;
38}; 39};
diff --git a/src/yuzu/applets/web_browser.cpp b/src/yuzu/applets/web_browser.cpp
index e482ba029..93e3a4f6f 100644
--- a/src/yuzu/applets/web_browser.cpp
+++ b/src/yuzu/applets/web_browser.cpp
@@ -102,8 +102,8 @@ QtNXWebEngineView::~QtNXWebEngineView() {
102 StopInputThread(); 102 StopInputThread();
103} 103}
104 104
105void QtNXWebEngineView::LoadLocalWebPage(std::string_view main_url, 105void QtNXWebEngineView::LoadLocalWebPage(const std::string& main_url,
106 std::string_view additional_args) { 106 const std::string& additional_args) {
107 is_local = true; 107 is_local = true;
108 108
109 LoadExtractedFonts(); 109 LoadExtractedFonts();
@@ -113,12 +113,12 @@ void QtNXWebEngineView::LoadLocalWebPage(std::string_view main_url,
113 SetLastURL("http://localhost/"); 113 SetLastURL("http://localhost/");
114 StartInputThread(); 114 StartInputThread();
115 115
116 load(QUrl(QUrl::fromLocalFile(QString::fromStdString(std::string(main_url))).toString() + 116 load(QUrl(QUrl::fromLocalFile(QString::fromStdString(main_url)).toString() +
117 QString::fromStdString(std::string(additional_args)))); 117 QString::fromStdString(additional_args)));
118} 118}
119 119
120void QtNXWebEngineView::LoadExternalWebPage(std::string_view main_url, 120void QtNXWebEngineView::LoadExternalWebPage(const std::string& main_url,
121 std::string_view additional_args) { 121 const std::string& additional_args) {
122 is_local = false; 122 is_local = false;
123 123
124 SetUserAgent(UserAgent::WebApplet); 124 SetUserAgent(UserAgent::WebApplet);
@@ -127,8 +127,7 @@ void QtNXWebEngineView::LoadExternalWebPage(std::string_view main_url,
127 SetLastURL("http://localhost/"); 127 SetLastURL("http://localhost/");
128 StartInputThread(); 128 StartInputThread();
129 129
130 load(QUrl(QString::fromStdString(std::string(main_url)) + 130 load(QUrl(QString::fromStdString(main_url) + QString::fromStdString(additional_args)));
131 QString::fromStdString(std::string(additional_args))));
132} 131}
133 132
134void QtNXWebEngineView::SetUserAgent(UserAgent user_agent) { 133void QtNXWebEngineView::SetUserAgent(UserAgent user_agent) {
@@ -375,7 +374,7 @@ QtWebBrowser::QtWebBrowser(GMainWindow& main_window) {
375QtWebBrowser::~QtWebBrowser() = default; 374QtWebBrowser::~QtWebBrowser() = default;
376 375
377void QtWebBrowser::OpenLocalWebPage( 376void QtWebBrowser::OpenLocalWebPage(
378 std::string_view local_url, std::function<void()> extract_romfs_callback_, 377 const std::string& local_url, std::function<void()> extract_romfs_callback_,
379 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback_) const { 378 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback_) const {
380 extract_romfs_callback = std::move(extract_romfs_callback_); 379 extract_romfs_callback = std::move(extract_romfs_callback_);
381 callback = std::move(callback_); 380 callback = std::move(callback_);
@@ -390,7 +389,7 @@ void QtWebBrowser::OpenLocalWebPage(
390} 389}
391 390
392void QtWebBrowser::OpenExternalWebPage( 391void QtWebBrowser::OpenExternalWebPage(
393 std::string_view external_url, 392 const std::string& external_url,
394 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback_) const { 393 std::function<void(Service::AM::Applets::WebExitReason, std::string)> callback_) const {
395 callback = std::move(callback_); 394 callback = std::move(callback_);
396 395
diff --git a/src/yuzu/applets/web_browser.h b/src/yuzu/applets/web_browser.h
index 47f960d69..7ad07409f 100644
--- a/src/yuzu/applets/web_browser.h
+++ b/src/yuzu/applets/web_browser.h
@@ -58,7 +58,7 @@ public:
58 * @param main_url The url to the file. 58 * @param main_url The url to the file.
59 * @param additional_args Additional arguments appended to the main url. 59 * @param additional_args Additional arguments appended to the main url.
60 */ 60 */
61 void LoadLocalWebPage(std::string_view main_url, std::string_view additional_args); 61 void LoadLocalWebPage(const std::string& main_url, const std::string& additional_args);
62 62
63 /** 63 /**
64 * Loads an external website. Cannot be used to load local urls. 64 * Loads an external website. Cannot be used to load local urls.
@@ -66,7 +66,7 @@ public:
66 * @param main_url The url to the website. 66 * @param main_url The url to the website.
67 * @param additional_args Additional arguments appended to the main url. 67 * @param additional_args Additional arguments appended to the main url.
68 */ 68 */
69 void LoadExternalWebPage(std::string_view main_url, std::string_view additional_args); 69 void LoadExternalWebPage(const std::string& main_url, const std::string& additional_args);
70 70
71 /** 71 /**
72 * Sets the background color of the web page. 72 * Sets the background color of the web page.
@@ -193,16 +193,17 @@ public:
193 explicit QtWebBrowser(GMainWindow& parent); 193 explicit QtWebBrowser(GMainWindow& parent);
194 ~QtWebBrowser() override; 194 ~QtWebBrowser() override;
195 195
196 void OpenLocalWebPage(std::string_view local_url, std::function<void()> extract_romfs_callback_, 196 void OpenLocalWebPage(const std::string& local_url,
197 std::function<void()> extract_romfs_callback_,
197 std::function<void(Service::AM::Applets::WebExitReason, std::string)> 198 std::function<void(Service::AM::Applets::WebExitReason, std::string)>
198 callback_) const override; 199 callback_) const override;
199 200
200 void OpenExternalWebPage(std::string_view external_url, 201 void OpenExternalWebPage(const std::string& external_url,
201 std::function<void(Service::AM::Applets::WebExitReason, std::string)> 202 std::function<void(Service::AM::Applets::WebExitReason, std::string)>
202 callback_) const override; 203 callback_) const override;
203 204
204signals: 205signals:
205 void MainWindowOpenWebPage(std::string_view main_url, std::string_view additional_args, 206 void MainWindowOpenWebPage(const std::string& main_url, const std::string& additional_args,
206 bool is_local) const; 207 bool is_local) const;
207 208
208private: 209private:
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 5f6cdc0c6..2fd38a851 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -574,8 +574,8 @@ void GMainWindow::SoftwareKeyboardExit() {
574 software_keyboard = nullptr; 574 software_keyboard = nullptr;
575} 575}
576 576
577void GMainWindow::WebBrowserOpenWebPage(std::string_view main_url, std::string_view additional_args, 577void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
578 bool is_local) { 578 const std::string& additional_args, bool is_local) {
579#ifdef YUZU_USE_QT_WEB_ENGINE 579#ifdef YUZU_USE_QT_WEB_ENGINE
580 580
581 if (disable_web_applet) { 581 if (disable_web_applet) {
@@ -596,13 +596,15 @@ void GMainWindow::WebBrowserOpenWebPage(std::string_view main_url, std::string_v
596 loading_progress.setRange(0, 3); 596 loading_progress.setRange(0, 3);
597 loading_progress.setValue(0); 597 loading_progress.setValue(0);
598 598
599 if (is_local && !Common::FS::Exists(std::string(main_url))) { 599 if (is_local && !Common::FS::Exists(main_url)) {
600 loading_progress.show(); 600 loading_progress.show();
601 601
602 auto future = QtConcurrent::run([this] { emit WebBrowserExtractOfflineRomFS(); }); 602 auto future = QtConcurrent::run([this] { emit WebBrowserExtractOfflineRomFS(); });
603 603
604 while (!future.isFinished()) { 604 while (!future.isFinished()) {
605 QCoreApplication::processEvents(); 605 QCoreApplication::processEvents();
606
607 std::this_thread::sleep_for(std::chrono::milliseconds(1));
606 } 608 }
607 } 609 }
608 610
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index 7f1e50a5b..98a608fce 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -159,7 +159,7 @@ public slots:
159 void SoftwareKeyboardExit(); 159 void SoftwareKeyboardExit();
160 void ErrorDisplayDisplayError(QString error_code, QString error_text); 160 void ErrorDisplayDisplayError(QString error_code, QString error_text);
161 void ProfileSelectorSelectProfile(); 161 void ProfileSelectorSelectProfile();
162 void WebBrowserOpenWebPage(std::string_view main_url, std::string_view additional_args, 162 void WebBrowserOpenWebPage(const std::string& main_url, const std::string& additional_args,
163 bool is_local); 163 bool is_local);
164 void OnAppFocusStateChanged(Qt::ApplicationState state); 164 void OnAppFocusStateChanged(Qt::ApplicationState state);
165 165