summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2019-11-12 11:39:42 +0100
committerBastien Nocera <hadess@hadess.net>2019-11-12 13:11:26 +0100
commit541958955d0b1ce485944695821ef0c5ace9f364 (patch)
tree9d3db1672a4a32029a45134d705a93f332d57b8a
parent019cb6a7d0fe45c9569b58ce90a1ad9aeb7968d1 (diff)
downloadtotem-pl-parser-541958955d0b1ce485944695821ef0c5ace9f364.tar.gz
plparser: Remove use of Y2038 unsafe GTimeVal
Use GDateTime instead. g_date_time_new_from_iso8601() was added in glib 2.56, so bump the requirements. Note that this also changes one of the tests, as GDateTime does not support leap seconds as the old GTimeVal code used to do. See https://gitlab.gnome.org/GNOME/glib/issues/1938
-rw-r--r--meson.build2
-rw-r--r--plparse/tests/parser.c2
-rw-r--r--plparse/totem-pl-parser.c21
3 files changed, 11 insertions, 14 deletions
diff --git a/meson.build b/meson.build
index 50956b3..115726b 100644
--- a/meson.build
+++ b/meson.build
@@ -30,7 +30,7 @@ plparse_soversion = plparse_lt_current - plparse_lt_age
plparse_libversion = '@0@.@1@.@2@'.format(plparse_soversion, plparse_lt_age, plparse_lt_revision)
# Requirements
-glib_req = '>= 2.36.0'
+glib_req = '>= 2.56.0'
gio_req = '>= 2.24.0'
quvi_req = '>= 0.9.1'
archive_req = '>= 3.0'
diff --git a/plparse/tests/parser.c b/plparse/tests/parser.c
index 4488a55..17d79c6 100644
--- a/plparse/tests/parser.c
+++ b/plparse/tests/parser.c
@@ -135,7 +135,7 @@ test_date (void)
/* Atom */
g_assert_cmpuint (totem_pl_parser_parse_date ("2003-12-13T18:30:02Z", verbose), ==, 1071340202);
- g_assert_cmpuint (totem_pl_parser_parse_date ("1990-12-31T15:59:60-08:00", verbose), ==, 662688000);
+ g_assert_cmpuint (totem_pl_parser_parse_date ("1990-12-31T15:59:59-08:00", verbose), ==, 662687999);
}
#define READ_CHUNK_SIZE 8192
diff --git a/plparse/totem-pl-parser.c b/plparse/totem-pl-parser.c
index 49dd406..f4ad288 100644
--- a/plparse/totem-pl-parser.c
+++ b/plparse/totem-pl-parser.c
@@ -2361,27 +2361,24 @@ totem_pl_parser_parse_duration (const char *duration, gboolean debug)
guint64
totem_pl_parser_parse_date (const char *date_str, gboolean debug)
{
- GTimeVal val;
+ g_autoptr(GDateTime) date = NULL;
g_return_val_if_fail (date_str != NULL, -1);
- memset (&val, 0, sizeof(val));
/* Try to parse as an ISO8601/RFC3339 date */
- if (g_time_val_from_iso8601 (date_str, &val) != FALSE) {
+ date = g_date_time_new_from_iso8601 (date_str, NULL);
+ if (date != NULL) {
D(g_message ("Parsed duration '%s' using the ISO8601 parser", date_str));
- return val.tv_sec;
+ return g_date_time_to_unix (date);
}
D(g_message ("Failed to parse duration '%s' using the ISO8601 parser", date_str));
/* Fall back to RFC 2822 date parsing */
- {
- g_autoptr(GDateTime) date = NULL;
- date = g_mime_utils_header_decode_date (date_str);
- if (!date || !g_date_time_to_timeval (date, &val)) {
- D(g_message ("Failed to parse duration '%s' using the RFC 2822 parser", date_str));
- return -1;
- }
- return val.tv_sec;
+ date = g_mime_utils_header_decode_date (date_str);
+ if (!date) {
+ D(g_message ("Failed to parse duration '%s' using the RFC 2822 parser", date_str));
+ return -1;
}
+ return g_date_time_to_unix (date);
}
#endif /* !TOTEM_PL_PARSER_MINI */