- 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()