Skip to content

Commit 8b5a9f6

Browse files
[GTK][Wayland] Crash when gdk_keymap_get_entries_for_keyval returns TRUE but n_keys=0
https://bugs.webkit.org/show_bug.cgi?id=176154 Reviewed by Carlos Alberto Lopez Perez. Source/WebKit: In Wayland gdk_keymap_get_entries_for_keyval() can return TRUE with n_keys=0. We have several places in WebKit where we just check the return value of gdk_keymap_get_entries_for_keyval() and then use the returned array to get the first position assuming it has at least one item. This has always worked in X11 because the GDK X11 backend does the right thing, but it's crashing in Wayland now. It should be fixed in GTK+ but in the meantime it's easy to workaround by also checking n_keys > 0. * UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp: (WebKit::doKeyStrokeEvent): Tools: Also check the n_keys > 0 when using gdk_keymap_get_entries_for_keyval(). * TestWebKitAPI/Tests/WebKit/gtk/InputMethodFilter.cpp: (TestWebKitAPI::TestInputMethodFilter::sendKeyEventToFilter): * TestWebKitAPI/Tests/WebKitGtk/TestPrinting.cpp: Remove duplicated code and use WebViewTest::keyStroke instead. * TestWebKitAPI/glib/WebKitGLib/gtk/WebViewTestGtk.cpp: (WebViewTest::keyStroke): * TestWebKitAPI/gtk/PlatformWebViewGtk.cpp: (TestWebKitAPI::doKeyStroke): * WebKitTestRunner/gtk/EventSenderProxyGtk.cpp: (WTR::EventSenderProxy::keyDown): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@221419 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 103d5fc commit 8b5a9f6

File tree

8 files changed

+45
-36
lines changed

8 files changed

+45
-36
lines changed

Source/WebKit/ChangeLog

+16
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
2017-08-31 Carlos Garcia Campos <[email protected]>
2+
3+
[GTK][Wayland] Crash when gdk_keymap_get_entries_for_keyval returns TRUE but n_keys=0
4+
https://bugs.webkit.org/show_bug.cgi?id=176154
5+
6+
Reviewed by Carlos Alberto Lopez Perez.
7+
8+
In Wayland gdk_keymap_get_entries_for_keyval() can return TRUE with n_keys=0. We have several places in WebKit
9+
where we just check the return value of gdk_keymap_get_entries_for_keyval() and then use the returned array to
10+
get the first position assuming it has at least one item. This has always worked in X11 because the GDK X11
11+
backend does the right thing, but it's crashing in Wayland now. It should be fixed in GTK+ but in the meantime
12+
it's easy to workaround by also checking n_keys > 0.
13+
14+
* UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp:
15+
(WebKit::doKeyStrokeEvent):
16+
117
2017-08-30 Dan Bernstein <[email protected]>
218

319
[iOS] REGRESSION (r218144) -[WKContentView targetForAction:withSender:] returns the content view for actions implemented only by the WKWebView, causing a crash

Source/WebKit/UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ static void doKeyStrokeEvent(GdkEventType type, GtkWidget* widget, unsigned keyV
145145
// When synthesizing an event, an invalid hardware_keycode value can cause it to be badly processed by GTK+.
146146
GUniqueOutPtr<GdkKeymapKey> keys;
147147
int keysCount;
148-
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount))
148+
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount) && keysCount)
149149
event->key.hardware_keycode = keys.get()[0].keycode;
150150

151151
gtk_main_do_event(event.get());

Tools/ChangeLog

+19
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,22 @@
1+
2017-08-31 Carlos Garcia Campos <[email protected]>
2+
3+
[GTK][Wayland] Crash when gdk_keymap_get_entries_for_keyval returns TRUE but n_keys=0
4+
https://bugs.webkit.org/show_bug.cgi?id=176154
5+
6+
Reviewed by Carlos Alberto Lopez Perez.
7+
8+
Also check the n_keys > 0 when using gdk_keymap_get_entries_for_keyval().
9+
10+
* TestWebKitAPI/Tests/WebKit/gtk/InputMethodFilter.cpp:
11+
(TestWebKitAPI::TestInputMethodFilter::sendKeyEventToFilter):
12+
* TestWebKitAPI/Tests/WebKitGtk/TestPrinting.cpp: Remove duplicated code and use WebViewTest::keyStroke instead.
13+
* TestWebKitAPI/glib/WebKitGLib/gtk/WebViewTestGtk.cpp:
14+
(WebViewTest::keyStroke):
15+
* TestWebKitAPI/gtk/PlatformWebViewGtk.cpp:
16+
(TestWebKitAPI::doKeyStroke):
17+
* WebKitTestRunner/gtk/EventSenderProxyGtk.cpp:
18+
(WTR::EventSenderProxy::keyDown):
19+
120
2017-08-31 Carlos Garcia Campos <[email protected]>
221

322
Unreviewed. Fix GTK+ test /webkit2/WebKitAutomationSession/request-session.

Tools/TestWebKitAPI/Tests/WebKit/gtk/InputMethodFilter.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class TestInputMethodFilter : public InputMethodFilter {
6767

6868
GUniqueOutPtr<GdkKeymapKey> keys;
6969
gint nKeys;
70-
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeyValue, &keys.outPtr(), &nKeys))
70+
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeyValue, &keys.outPtr(), &nKeys) && nKeys)
7171
event->key.hardware_keycode = keys.get()[0].keycode;
7272

7373
filterKeyEvent(&event->key);

Tools/TestWebKitAPI/Tests/WebKitGtk/TestPrinting.cpp

+5-31
Original file line numberDiff line numberDiff line change
@@ -365,32 +365,6 @@ class PrintCustomWidgetTest: public WebViewTest {
365365
g_main_loop_quit(m_mainLoop);
366366
}
367367

368-
void sendKeyEvent(unsigned gdkKeyValue, GdkEventType type, unsigned modifiers)
369-
{
370-
GdkEvent* event = gdk_event_new(type);
371-
event->key.keyval = gdkKeyValue;
372-
event->key.state = modifiers;
373-
event->key.window = gtk_widget_get_window(GTK_WIDGET(m_webView));
374-
event->key.time = GDK_CURRENT_TIME;
375-
g_object_ref(event->key.window);
376-
gdk_event_set_device(event, gdk_device_manager_get_client_pointer(gdk_display_get_device_manager(gdk_display_get_default())));
377-
378-
GUniqueOutPtr<GdkKeymapKey> keys;
379-
gint nKeys;
380-
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeyValue, &keys.outPtr(), &nKeys))
381-
event->key.hardware_keycode = keys.get()[0].keycode;
382-
383-
gtk_main_do_event(event);
384-
385-
gdk_event_free(event);
386-
}
387-
388-
void sendKeyPressAndReleaseEvent(unsigned gdkKeyValue, unsigned modifiers = 0)
389-
{
390-
sendKeyEvent(gdkKeyValue, GDK_KEY_PRESS, modifiers);
391-
sendKeyEvent(gdkKeyValue, GDK_KEY_RELEASE, modifiers);
392-
}
393-
394368
void createWebKitPrintOperation()
395369
{
396370
m_printOperation = adoptGRef(webkit_print_operation_new(m_webView));
@@ -410,23 +384,23 @@ class PrintCustomWidgetTest: public WebViewTest {
410384
void startPrinting()
411385
{
412386
// To start printing it is enough to press the Return key
413-
sendKeyPressAndReleaseEvent(GDK_KEY_Return);
387+
keyStroke(GDK_KEY_Return);
414388
}
415389

416390
void jumpToFirstPrinter()
417391
{
418392
// Initially the GtkNotebook has focus, so we just need to press the Tab
419393
// key to jump to the first printer
420-
sendKeyPressAndReleaseEvent(GDK_KEY_Tab);
394+
keyStroke(GDK_KEY_Tab);
421395
}
422396

423397
void jumpToCustomWidget()
424398
{
425399
// Jump back to the GtkNotebook
426-
sendKeyPressAndReleaseEvent(GDK_KEY_Tab, GDK_SHIFT_MASK);
400+
keyStroke(GDK_KEY_Tab, GDK_SHIFT_MASK);
427401
// Custom widget is on the third tab
428-
sendKeyPressAndReleaseEvent(GDK_KEY_Right);
429-
sendKeyPressAndReleaseEvent(GDK_KEY_Right);
402+
keyStroke(GDK_KEY_Right);
403+
keyStroke(GDK_KEY_Right);
430404
}
431405

432406
void openDialogMoveThroughItAndWaitUntilClosed()

Tools/TestWebKitAPI/glib/WebKitGLib/gtk/WebViewTestGtk.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ void WebViewTest::keyStroke(unsigned keyVal, unsigned keyModifiers)
148148
// When synthesizing an event, an invalid hardware_keycode value can cause it to be badly processed by GTK+.
149149
GUniqueOutPtr<GdkKeymapKey> keys;
150150
int keysCount;
151-
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount))
151+
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount) && keysCount)
152152
event->key.hardware_keycode = keys.get()[0].keycode;
153153

154154
gtk_main_do_event(event.get());

Tools/TestWebKitAPI/gtk/PlatformWebViewGtk.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ static void doKeyStroke(GtkWidget* viewWidget, unsigned int keyVal)
9595
// When synthesizing an event, an invalid hardware_keycode value can cause it to be badly processed by GTK+.
9696
GUniqueOutPtr<GdkKeymapKey> keys;
9797
int keysCount;
98-
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount))
98+
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), keyVal, &keys.outPtr(), &keysCount) && keysCount)
9999
event->key.hardware_keycode = keys.get()[0].keycode;
100100

101101
gtk_main_do_event(event.get());

Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ void EventSenderProxy::keyDown(WKStringRef keyRef, WKEventModifiers wkModifiers,
315315

316316
GUniqueOutPtr<GdkKeymapKey> keys;
317317
gint nKeys;
318-
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeySym, &keys.outPtr(), &nKeys))
318+
if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), gdkKeySym, &keys.outPtr(), &nKeys) && nKeys)
319319
pressEvent->key.hardware_keycode = keys.get()[0].keycode;
320320

321321
GdkEvent* releaseEvent = gdk_event_copy(pressEvent);

0 commit comments

Comments
 (0)