[GTK] Crashes in WebCore::PasteboardHelper::fillSelectionData when source file of...
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Jul 2017 07:02:25 +0000 (07:02 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Jul 2017 07:02:25 +0000 (07:02 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174161

Reviewed by Michael Catanzaro.

It seems selection data could contain an empty string, in which case gtk_selection_data_get_data() returns a
valid pointer, but gtk_selection_data_get_length() returns 0. When this happens we end up trying to split an
empty string resulting in an empty vector, but we unconditionally access the first element of the vector.

* platform/gtk/PasteboardHelper.cpp:
(WebCore::selectionDataToUTF8String): Return a null string in case selection data length is 0.
(WebCore::PasteboardHelper::fillSelectionData): Return early if selection data length is 0, instead of checking
the selection data pointer.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@219385 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/gtk/PasteboardHelper.cpp

index 44f2be0..cc36660 100644 (file)
@@ -1,3 +1,19 @@
+2017-07-12  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Crashes in WebCore::PasteboardHelper::fillSelectionData when source file of drag is unavailable
+        https://bugs.webkit.org/show_bug.cgi?id=174161
+
+        Reviewed by Michael Catanzaro.
+
+        It seems selection data could contain an empty string, in which case gtk_selection_data_get_data() returns a
+        valid pointer, but gtk_selection_data_get_length() returns 0. When this happens we end up trying to split an
+        empty string resulting in an empty vector, but we unconditionally access the first element of the vector.
+
+        * platform/gtk/PasteboardHelper.cpp:
+        (WebCore::selectionDataToUTF8String): Return a null string in case selection data length is 0.
+        (WebCore::PasteboardHelper::fillSelectionData): Return early if selection data length is 0, instead of checking
+        the selection data pointer.
+
 2017-07-11  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK][WPE] Enable FILE_LOCK and implement lockFile and unlockFile
index 67b7c7c..eeb7cf7 100644 (file)
@@ -85,6 +85,9 @@ GtkTargetList* PasteboardHelper::targetList() const
 
 static String selectionDataToUTF8String(GtkSelectionData* data)
 {
+    if (!gtk_selection_data_get_length(data))
+        return String();
+
     // g_strndup guards against selection data that is not null-terminated.
     GUniquePtr<gchar> markupString(g_strndup(reinterpret_cast<const char*>(gtk_selection_data_get_data(data)), gtk_selection_data_get_length(data)));
     return String::fromUTF8(markupString.get());
@@ -206,7 +209,7 @@ void PasteboardHelper::fillSelectionData(const SelectionData& selection, unsigne
 
 void PasteboardHelper::fillSelectionData(GtkSelectionData* data, unsigned /* info */, SelectionData& selection)
 {
-    if (!gtk_selection_data_get_data(data))
+    if (!gtk_selection_data_get_length(data))
         return;
 
     GdkAtom target = gtk_selection_data_get_target(data);