Title: [277014] trunk
Revision
277014
Author
[email protected]
Date
2021-05-05 06:24:52 -0700 (Wed, 05 May 2021)

Log Message

[SOUP] Wrong cookie timestamp in case of long expire time
https://bugs.webkit.org/show_bug.cgi?id=225389

Reviewed by Adrian Perez de Castro.

Source/WebCore:

There's an overflow when converting the dates in both libsoup2 and libsoup3, but for two different reasons. In
the case of libsoup2 we are using an int for the conversion of milliseconds to seconds which is not enough. In
the case of libsoup3 we are passing the value in milliseconds to g_date_time_new_from_unix_utc() that expects
seconds.

* platform/network/soup/CookieSoup.cpp:
(WebCore::msToSoupDate): Use int64_t instead of int for the cast.
(WebCore::Cookie::toSoupCookie const): Convert the value to seconds.

Tools:

Add a test case.

* TestWebKitAPI/Tests/WebKitGLib/TestCookieManager.cpp:
(testCookieManagerLongExpires):
(beforeAll):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (277013 => 277014)


--- trunk/Source/WebCore/ChangeLog	2021-05-05 13:14:26 UTC (rev 277013)
+++ trunk/Source/WebCore/ChangeLog	2021-05-05 13:24:52 UTC (rev 277014)
@@ -1,3 +1,19 @@
+2021-05-05  Carlos Garcia Campos  <[email protected]>
+
+        [SOUP] Wrong cookie timestamp in case of long expire time
+        https://bugs.webkit.org/show_bug.cgi?id=225389
+
+        Reviewed by Adrian Perez de Castro.
+
+        There's an overflow when converting the dates in both libsoup2 and libsoup3, but for two different reasons. In
+        the case of libsoup2 we are using an int for the conversion of milliseconds to seconds which is not enough. In
+        the case of libsoup3 we are passing the value in milliseconds to g_date_time_new_from_unix_utc() that expects
+        seconds.
+
+        * platform/network/soup/CookieSoup.cpp:
+        (WebCore::msToSoupDate): Use int64_t instead of int for the cast.
+        (WebCore::Cookie::toSoupCookie const): Convert the value to seconds.
+
 2021-05-05  Ryosuke Niwa  <[email protected]>
 
         Use WeakHashSet instead of HashSet of raw pointes in Document and SVGDocumentExtensions

Modified: trunk/Source/WebCore/platform/network/soup/CookieSoup.cpp (277013 => 277014)


--- trunk/Source/WebCore/platform/network/soup/CookieSoup.cpp	2021-05-05 13:14:26 UTC (rev 277013)
+++ trunk/Source/WebCore/platform/network/soup/CookieSoup.cpp	2021-05-05 13:24:52 UTC (rev 277014)
@@ -93,7 +93,7 @@
 
     // monthFromDayInYear() returns a value in the [0,11] range, while soup_date_new() expects
     // a value in the [1,12] range, meaning we have to manually adjust the month value.
-    return soup_date_new(year, monthFromDayInYear(dayOfYear, leapYear) + 1, dayInMonthFromDayInYear(dayOfYear, leapYear), msToHours(ms), msToMinutes(ms), static_cast<int>(ms / 1000) % 60);
+    return soup_date_new(year, monthFromDayInYear(dayOfYear, leapYear) + 1, dayInMonthFromDayInYear(dayOfYear, leapYear), msToHours(ms), msToMinutes(ms), static_cast<int64_t>(ms / 1000) % 60);
 }
 #endif
 
@@ -117,7 +117,7 @@
         soup_cookie_set_expires(soupCookie, date);
         soup_date_free(date);
 #else
-        GRefPtr<GDateTime> date = adoptGRef(g_date_time_new_from_unix_utc(*expires));
+        GRefPtr<GDateTime> date = adoptGRef(g_date_time_new_from_unix_utc(*expires / 1000.));
         soup_cookie_set_expires(soupCookie, date.get());
 #endif
     }

Modified: trunk/Tools/ChangeLog (277013 => 277014)


--- trunk/Tools/ChangeLog	2021-05-05 13:14:26 UTC (rev 277013)
+++ trunk/Tools/ChangeLog	2021-05-05 13:24:52 UTC (rev 277014)
@@ -1,3 +1,16 @@
+2021-05-05  Carlos Garcia Campos  <[email protected]>
+
+        [SOUP] Wrong cookie timestamp in case of long expire time
+        https://bugs.webkit.org/show_bug.cgi?id=225389
+
+        Reviewed by Adrian Perez de Castro.
+
+        Add a test case.
+
+        * TestWebKitAPI/Tests/WebKitGLib/TestCookieManager.cpp:
+        (testCookieManagerLongExpires):
+        (beforeAll):
+
 2021-05-04  Jiewen Tan  <[email protected]>
 
         PCM: Find a way to validate source_secret_token and source_secret_token_signature

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestCookieManager.cpp (277013 => 277014)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestCookieManager.cpp	2021-05-05 13:14:26 UTC (rev 277013)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestCookieManager.cpp	2021-05-05 13:24:52 UTC (rev 277014)
@@ -706,7 +706,34 @@
     g_main_loop_run(test->m_mainLoop);
 }
 
+static void testCookieManagerLongExpires(CookieManagerTest* test, gconstpointer)
+{
+    g_unlink(test->m_cookiesTextFile.get());
+    g_unlink(test->m_cookiesSQLiteFile.get());
+
+    GRefPtr<GDateTime> now = adoptGRef(g_date_time_new_now_utc());
+    GRefPtr<GDateTime> expires = adoptGRef(g_date_time_add_years(now.get(), 35));
+    GUniquePtr<char> line(g_strdup_printf("#HttpOnly_localhost\tFALSE\t/\tFALSE\t%ld\tprov\t123\tNone", g_date_time_to_unix(expires.get())));
+    test->m_cookiesTextFile.reset(g_build_filename(Test::dataDirectory(), "cookies.txt", nullptr));
+    g_file_set_contents(test->m_cookiesTextFile.get(), line.get(), -1, nullptr);
+    test->setPersistentStorage(WEBKIT_COOKIE_PERSISTENT_STORAGE_TEXT);
+
+    GList* cookies = test->getCookies("http://localhost/");
+    g_assert_cmpint(g_list_length(cookies), ==, 1);
+    SoupCookie* cookie = static_cast<SoupCookie*>(cookies->data);
+    auto* cookiesExpires = soup_cookie_get_expires(cookie);
+    g_assert_nonnull(cookiesExpires);
 #if USE(SOUP2)
+    g_assert_cmpint(g_date_time_to_unix(expires.get()), ==, soup_date_to_time_t(cookiesExpires));
+#else
+    g_assert_cmpint(g_date_time_to_unix(expires.get()), ==, g_date_time_to_unix(cookiesExpires));
+#endif
+
+    test->deleteAllCookies();
+    g_assert_cmpint(g_strv_length(test->getDomains()), ==, 0);
+}
+
+#if USE(SOUP2)
 static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
 #else
 static void serverCallback(SoupServer* server, SoupServerMessage* message, const char* path, GHashTable*, gpointer)
@@ -748,6 +775,7 @@
     CookiePersistentStorageTest::add("WebKitCookieManager", "persistent-storage", testCookieManagerPersistentStorage);
     CookieManagerTest::add("WebKitCookieManager", "persistent-storage-delete-all", testCookieManagerPersistentStorageDeleteAll);
     CookieManagerTest::add("WebKitCookieManager", "ephemeral", testCookieManagerEphemeral);
+    CookieManagerTest::add("WebKitCookieManager", "long-expires", testCookieManagerLongExpires);
 }
 
 void afterAll()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to