Title: [195166] trunk/Source/WebKit2
Revision
195166
Author
[email protected]
Date
2016-01-16 01:36:44 -0800 (Sat, 16 Jan 2016)

Log Message

[GTK] GVariant runtime critical errors when encoding session data
https://bugs.webkit.org/show_bug.cgi?id=153130

Reviewed by Michael Catanzaro.

It happens when the FrameState has children, because the recursive
serialization is wrong. Also fix serialization of
documentSequenceNumber and itemSequenceNumber that are gint64, not
guint64.

* UIProcess/API/gtk/WebKitWebViewSessionState.cpp:
(encodeFrameState): Let the caller open/init the given
builder. Use a new builder to encode child states recursively.
(encodePageState): Do the builder open/close for the FrameState encoding.
(decodeFrameState): Get the variant of every child.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (195165 => 195166)


--- trunk/Source/WebKit2/ChangeLog	2016-01-16 08:49:18 UTC (rev 195165)
+++ trunk/Source/WebKit2/ChangeLog	2016-01-16 09:36:44 UTC (rev 195166)
@@ -1,3 +1,21 @@
+2016-01-16  Carlos Garcia Campos  <[email protected]>
+
+        [GTK] GVariant runtime critical errors when encoding session data
+        https://bugs.webkit.org/show_bug.cgi?id=153130
+
+        Reviewed by Michael Catanzaro.
+
+        It happens when the FrameState has children, because the recursive
+        serialization is wrong. Also fix serialization of
+        documentSequenceNumber and itemSequenceNumber that are gint64, not
+        guint64.
+
+        * UIProcess/API/gtk/WebKitWebViewSessionState.cpp:
+        (encodeFrameState): Let the caller open/init the given
+        builder. Use a new builder to encode child states recursively.
+        (encodePageState): Do the builder open/close for the FrameState encoding.
+        (decodeFrameState): Get the variant of every child.
+
 2016-01-15  Michael Catanzaro  <[email protected]>
 
         Fix internal Windows build

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewSessionState.cpp (195165 => 195166)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewSessionState.cpp	2016-01-16 08:49:18 UTC (rev 195165)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewSessionState.cpp	2016-01-16 09:36:44 UTC (rev 195166)
@@ -44,8 +44,8 @@
 #define HTTP_BODY_ELEMENT_FORMAT_STRING_V1 "(uay&sxmxmd&s)"
 #define HTTP_BODY_TYPE_STRING_V1 "m(sa" HTTP_BODY_ELEMENT_TYPE_STRING_V1 ")"
 #define HTTP_BODY_FORMAT_STRING_V1 "m(&sa" HTTP_BODY_ELEMENT_TYPE_STRING_V1 ")"
-#define FRAME_STATE_TYPE_STRING_V1  "(ssssasmaytt(ii)d" HTTP_BODY_TYPE_STRING_V1 "av)"
-#define FRAME_STATE_FORMAT_STRING_V1  "(&s&s&s&sasmaytt(ii)d@" HTTP_BODY_TYPE_STRING_V1 "av)"
+#define FRAME_STATE_TYPE_STRING_V1  "(ssssasmayxx(ii)d" HTTP_BODY_TYPE_STRING_V1 "av)"
+#define FRAME_STATE_FORMAT_STRING_V1  "(&s&s&s&sasmayxx(ii)d@" HTTP_BODY_TYPE_STRING_V1 "av)"
 #define BACK_FORWARD_LIST_ITEM_TYPE_STRING_V1  "(ts" FRAME_STATE_TYPE_STRING_V1 "u)"
 #define BACK_FORWARD_LIST_ITEM_FORMAT_STRING_V1  "(t&s@" FRAME_STATE_TYPE_STRING_V1 "u)"
 #define SESSION_STATE_TYPE_STRING_V1  "(qa" BACK_FORWARD_LIST_ITEM_TYPE_STRING_V1 "mu)"
@@ -150,7 +150,6 @@
 
 static inline void encodeFrameState(GVariantBuilder* sessionBuilder, const FrameState& frameState)
 {
-    g_variant_builder_open(sessionBuilder, G_VARIANT_TYPE(FRAME_STATE_TYPE_STRING_V1));
     g_variant_builder_add(sessionBuilder, "s", frameState.urlString.utf8().data());
     g_variant_builder_add(sessionBuilder, "s", frameState.originalURLString.utf8().data());
     g_variant_builder_add(sessionBuilder, "s", frameState.referrer.utf8().data());
@@ -169,8 +168,8 @@
         g_variant_builder_close(sessionBuilder);
         g_variant_builder_close(sessionBuilder);
     }
-    g_variant_builder_add(sessionBuilder, "t", frameState.documentSequenceNumber);
-    g_variant_builder_add(sessionBuilder, "t", frameState.itemSequenceNumber);
+    g_variant_builder_add(sessionBuilder, "x", frameState.documentSequenceNumber);
+    g_variant_builder_add(sessionBuilder, "x", frameState.itemSequenceNumber);
     g_variant_builder_add(sessionBuilder, "(ii)", frameState.scrollPosition.x(), frameState.scrollPosition.y());
     g_variant_builder_add(sessionBuilder, "d", frameState.pageScaleFactor);
     if (!frameState.httpBody)
@@ -181,16 +180,21 @@
         g_variant_builder_close(sessionBuilder);
     }
     g_variant_builder_open(sessionBuilder, G_VARIANT_TYPE("av"));
-    for (const auto& child : frameState.children)
-        encodeFrameState(sessionBuilder, child);
+    for (const auto& child : frameState.children) {
+        GVariantBuilder frameStateBuilder;
+        g_variant_builder_init(&frameStateBuilder, G_VARIANT_TYPE(FRAME_STATE_TYPE_STRING_V1));
+        encodeFrameState(&frameStateBuilder, child);
+        g_variant_builder_add(sessionBuilder, "v", g_variant_builder_end(&frameStateBuilder));
+    }
     g_variant_builder_close(sessionBuilder);
-    g_variant_builder_close(sessionBuilder);
 }
 
 static inline void encodePageState(GVariantBuilder* sessionBuilder, const PageState& pageState)
 {
     g_variant_builder_add(sessionBuilder, "s", pageState.title.utf8().data());
+    g_variant_builder_open(sessionBuilder, G_VARIANT_TYPE(FRAME_STATE_TYPE_STRING_V1));
     encodeFrameState(sessionBuilder, pageState.mainFrameState);
+    g_variant_builder_close(sessionBuilder);
     g_variant_builder_add(sessionBuilder, "u", toExternalURLsPolicy(pageState.shouldOpenExternalURLsPolicy));
 }
 
@@ -278,8 +282,8 @@
     const char* target;
     GUniqueOutPtr<GVariantIter> documentStateIter;
     GUniqueOutPtr<GVariantIter> stateObjectDataIter;
-    guint64 documentSequenceNumber;
-    guint64 itemSequenceNumber;
+    gint64 documentSequenceNumber;
+    gint64 itemSequenceNumber;
     gint32 scrollPositionX, scrollPositionY;
     gdouble pageScaleFactor;
     GVariant* httpBodyVariant;
@@ -318,7 +322,8 @@
     g_variant_unref(httpBodyVariant);
     while (GRefPtr<GVariant> child = adoptGRef(g_variant_iter_next_value(childrenIter.get()))) {
         FrameState childFrameState;
-        decodeFrameState(child.get(), childFrameState);
+        GRefPtr<GVariant> childVariant = adoptGRef(g_variant_get_variant(child.get()));
+        decodeFrameState(childVariant.get(), childFrameState);
         frameState.children.append(WTFMove(childFrameState));
     }
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to