Title: [272451] trunk
Revision
272451
Author
[email protected]
Date
2021-02-05 16:43:20 -0800 (Fri, 05 Feb 2021)

Log Message

REGRESSION(r272337): crash under WebCore::SpeechRecognizer::setInactive()
https://bugs.webkit.org/show_bug.cgi?id=221451

Patch by Sihui Liu <[email protected]> on 2021-02-05
Reviewed by Youenn Fablet.

Source/WebCore:

Stop sending final update in SpeechRecognizer's destructor and send it in prepareForDestruction() instead, so
that no update will be sent for a destroyed SpeechRecognizer.

API test: WebKit2.SpeechRecognitionWebProcessCrash.

* Modules/speech/SpeechRecognizer.cpp:
(WebCore::SpeechRecognizer::prepareForDestruction):
(WebCore::SpeechRecognizer::~SpeechRecognizer): Deleted.
* Modules/speech/SpeechRecognizer.h:

Source/WebKit:

* UIProcess/SpeechRecognitionServer.cpp:
(WebKit::SpeechRecognitionServer::handleRequest):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
(TestWebKitAPI::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (272450 => 272451)


--- trunk/Source/WebCore/ChangeLog	2021-02-06 00:16:20 UTC (rev 272450)
+++ trunk/Source/WebCore/ChangeLog	2021-02-06 00:43:20 UTC (rev 272451)
@@ -1,3 +1,20 @@
+2021-02-05  Sihui Liu  <[email protected]>
+
+        REGRESSION(r272337): crash under WebCore::SpeechRecognizer::setInactive()
+        https://bugs.webkit.org/show_bug.cgi?id=221451
+
+        Reviewed by Youenn Fablet.
+
+        Stop sending final update in SpeechRecognizer's destructor and send it in prepareForDestruction() instead, so 
+        that no update will be sent for a destroyed SpeechRecognizer.
+
+        API test: WebKit2.SpeechRecognitionWebProcessCrash.
+
+        * Modules/speech/SpeechRecognizer.cpp:
+        (WebCore::SpeechRecognizer::prepareForDestruction):
+        (WebCore::SpeechRecognizer::~SpeechRecognizer): Deleted.
+        * Modules/speech/SpeechRecognizer.h:
+
 2021-02-05  Ricky Mondello  <[email protected]>
 
         Allow Password AutoFill in more text field configurations

Modified: trunk/Source/WebCore/Modules/speech/SpeechRecognizer.cpp (272450 => 272451)


--- trunk/Source/WebCore/Modules/speech/SpeechRecognizer.cpp	2021-02-06 00:16:20 UTC (rev 272450)
+++ trunk/Source/WebCore/Modules/speech/SpeechRecognizer.cpp	2021-02-06 00:43:20 UTC (rev 272451)
@@ -42,12 +42,6 @@
 {
 }
 
-SpeechRecognizer::~SpeechRecognizer()
-{
-    if (m_state == State::Aborting || m_state == State::Stopping || m_state == State::Running)
-        m_delegateCallback(SpeechRecognitionUpdate::create(clientIdentifier(), SpeechRecognitionUpdateType::End));
-}
-
 void SpeechRecognizer::abort(Optional<SpeechRecognitionError>&& error)
 {
     if (m_state == State::Aborting || m_state == State::Inactive)
@@ -76,6 +70,16 @@
     return m_request->clientIdentifier();
 }
 
+void SpeechRecognizer::prepareForDestruction()
+{
+    if (m_state == State::Inactive)
+        return;
+
+    auto delegateCallback = std::exchange(m_delegateCallback, [](const SpeechRecognitionUpdate&) { });
+    delegateCallback(SpeechRecognitionUpdate::create(clientIdentifier(), SpeechRecognitionUpdateType::End));
+    m_state = State::Inactive;
+}
+
 #if ENABLE(MEDIA_STREAM)
 
 void SpeechRecognizer::start(Ref<RealtimeMediaSource>&& source, bool mockSpeechRecognitionEnabled)

Modified: trunk/Source/WebCore/Modules/speech/SpeechRecognizer.h (272450 => 272451)


--- trunk/Source/WebCore/Modules/speech/SpeechRecognizer.h	2021-02-06 00:16:20 UTC (rev 272450)
+++ trunk/Source/WebCore/Modules/speech/SpeechRecognizer.h	2021-02-06 00:43:20 UTC (rev 272451)
@@ -45,7 +45,6 @@
 public:
     using DelegateCallback = Function<void(const SpeechRecognitionUpdate&)>;
     WEBCORE_EXPORT explicit SpeechRecognizer(DelegateCallback&&, UniqueRef<SpeechRecognitionRequest>&&);
-    WEBCORE_EXPORT ~SpeechRecognizer();
 
 #if ENABLE(MEDIA_STREAM)
     WEBCORE_EXPORT void start(Ref<RealtimeMediaSource>&&, bool mockSpeechRecognitionEnabled);
@@ -52,6 +51,7 @@
 #endif
     WEBCORE_EXPORT void abort(Optional<SpeechRecognitionError>&& = WTF::nullopt);
     WEBCORE_EXPORT void stop();
+    WEBCORE_EXPORT void prepareForDestruction();
 
     WEBCORE_EXPORT SpeechRecognitionConnectionClientIdentifier clientIdentifier() const;
     SpeechRecognitionCaptureSource* source() { return m_source.get(); }

Modified: trunk/Source/WebKit/ChangeLog (272450 => 272451)


--- trunk/Source/WebKit/ChangeLog	2021-02-06 00:16:20 UTC (rev 272450)
+++ trunk/Source/WebKit/ChangeLog	2021-02-06 00:43:20 UTC (rev 272451)
@@ -1,3 +1,13 @@
+2021-02-05  Sihui Liu  <[email protected]>
+
+        REGRESSION(r272337): crash under WebCore::SpeechRecognizer::setInactive()
+        https://bugs.webkit.org/show_bug.cgi?id=221451
+
+        Reviewed by Youenn Fablet.
+
+        * UIProcess/SpeechRecognitionServer.cpp:
+        (WebKit::SpeechRecognitionServer::handleRequest):
+
 2021-02-05  Darin Adler  <[email protected]>
 
         Add missing null checks to decoding functions involving RetainPtr

Modified: trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp (272450 => 272451)


--- trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp	2021-02-06 00:16:20 UTC (rev 272450)
+++ trunk/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp	2021-02-06 00:43:20 UTC (rev 272451)
@@ -81,8 +81,10 @@
 
 void SpeechRecognitionServer::handleRequest(UniqueRef<WebCore::SpeechRecognitionRequest>&& request)
 {
-    if (m_recognizer)
+    if (m_recognizer) {
         m_recognizer->abort(WebCore::SpeechRecognitionError { WebCore::SpeechRecognitionErrorType::Aborted, "Another request is started"_s });
+        m_recognizer->prepareForDestruction();
+    }
 
     auto clientIdentifier = request->clientIdentifier();
     m_recognizer = makeUnique<WebCore::SpeechRecognizer>([this, weakThis = makeWeakPtr(this)](auto& update) {

Modified: trunk/Tools/ChangeLog (272450 => 272451)


--- trunk/Tools/ChangeLog	2021-02-06 00:16:20 UTC (rev 272450)
+++ trunk/Tools/ChangeLog	2021-02-06 00:43:20 UTC (rev 272451)
@@ -1,3 +1,13 @@
+2021-02-05  Sihui Liu  <[email protected]>
+
+        REGRESSION(r272337): crash under WebCore::SpeechRecognizer::setInactive()
+        https://bugs.webkit.org/show_bug.cgi?id=221451
+
+        Reviewed by Youenn Fablet.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm:
+        (TestWebKitAPI::TEST):
+
 2021-02-05  Eric Carlson  <[email protected]>
 
         [Mac] Connect MediaSession with MediaRemote and NowPlaying

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm (272450 => 272451)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm	2021-02-06 00:16:20 UTC (rev 272450)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SpeechRecognition.mm	2021-02-06 00:43:20 UTC (rev 272451)
@@ -305,4 +305,31 @@
 
 #endif
 
+TEST(WebKit2, SpeechRecognitionWebProcessCrash)
+{
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto handler = adoptNS([[SpeechRecognitionMessageHandler alloc] init]);
+    [[configuration userContentController] addScriptMessageHandler:handler.get() name:@"testHandler"];
+    auto preferences = [configuration preferences];
+    preferences._mockCaptureDevicesEnabled = YES;
+    preferences._speechRecognitionEnabled = YES;
+    auto delegate = adoptNS([[SpeechRecognitionUIDelegate alloc] init]);
+    shouldGrantPermissionRequest = true;
+
+    @autoreleasepool {
+        auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration.get()]);
+        [webView setUIDelegate:delegate.get()];
+
+        receivedScriptMessage = false;
+        [webView synchronouslyLoadTestPageNamed:@"speechrecognition-basic"];
+        [webView evaluateJavaScript:@"start();" completionHandler:nil];
+        TestWebKitAPI::Util::run(&receivedScriptMessage);
+        EXPECT_WK_STREQ(@"Start", [lastScriptMessage body]);
+
+        [webView _killWebContentProcess];
+    }
+
+    TestWebKitAPI::Util::sleep(0.5);
+}
+
 } // namespace TestWebKitAPI
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to