aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2022-10-05 08:41:26 +0000
committerAleksander Morgado <aleksandermj@chromium.org>2022-10-05 09:06:22 +0000
commitbfba265009610e84af4f8e4b1b3f05ec3a2d56bc (patch)
treea2b2720b4ee3c52ac9cbf2d9d4715a1d753d714c
parent4628056a3e9ab908463ef826a8fe18366265c7f2 (diff)
libmm-glib,common-helpers: don't assume new_from_unix_utc() always succeeds
The g_date_time_new_from_unix_utc() method in glib2 may fail if the given timestamp is too far into the future. The value is supposed to be seconds since unix time origin, but internally it will be converted into usecs, so any value longer than G_MAXINT64 / USEC_PER_SECOND isn't allowed. This is currently used in the CLI, and we're anyway ignoring the error returned in that case, but at least it won't crash if it ever happens.
-rw-r--r--cli/mmcli-output.c4
-rw-r--r--libmm-glib/mm-common-helpers.c9
-rw-r--r--libmm-glib/mm-common-helpers.h21
-rw-r--r--libmm-glib/tests/test-common-helpers.c9
4 files changed, 29 insertions, 14 deletions
diff --git a/cli/mmcli-output.c b/cli/mmcli-output.c
index 1bb17f82..ef1c7cb3 100644
--- a/cli/mmcli-output.c
+++ b/cli/mmcli-output.c
@@ -621,11 +621,11 @@ mmcli_output_signal_quality (MMModemState state,
/* (Custom) Bearer start date output */
void
-mmcli_output_start_date (guint64 value)
+mmcli_output_start_date (guint64 value)
{
/* Merge value and recent flag in a single item in human output */
if (selected_type == MMC_OUTPUT_TYPE_HUMAN) {
- output_item_new_take_single (MMC_F_BEARER_STATS_START_DATE, mm_new_iso8601_time_from_unix_time (value));
+ output_item_new_take_single (MMC_F_BEARER_STATS_START_DATE, mm_new_iso8601_time_from_unix_time (value, NULL));
return;
}
diff --git a/libmm-glib/mm-common-helpers.c b/libmm-glib/mm-common-helpers.c
index 085177b7..0dff0e8c 100644
--- a/libmm-glib/mm-common-helpers.c
+++ b/libmm-glib/mm-common-helpers.c
@@ -1752,11 +1752,18 @@ date_time_format_iso8601 (GDateTime *dt)
}
gchar *
-mm_new_iso8601_time_from_unix_time (guint64 timestamp)
+mm_new_iso8601_time_from_unix_time (guint64 timestamp,
+ GError **error)
{
g_autoptr(GDateTime) dt = NULL;
dt = g_date_time_new_from_unix_utc ((gint64)timestamp);
+ if (!dt) {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS,
+ "Invalid unix time: %" G_GUINT64_FORMAT,
+ timestamp);
+ return NULL;
+ }
return date_time_format_iso8601 (dt);
}
diff --git a/libmm-glib/mm-common-helpers.h b/libmm-glib/mm-common-helpers.h
index 490f882d..a92d5b58 100644
--- a/libmm-glib/mm-common-helpers.h
+++ b/libmm-glib/mm-common-helpers.h
@@ -208,16 +208,17 @@ gboolean mm_get_double_from_match_info (GMatchInfo *match_info,
gchar *mm_get_string_unquoted_from_match_info (GMatchInfo *match_info,
guint32 match_index);
-gchar *mm_new_iso8601_time_from_unix_time (guint64 timestamp);
-gchar *mm_new_iso8601_time (guint year,
- guint month,
- guint day,
- guint hour,
- guint minute,
- guint second,
- gboolean have_offset,
- gint offset_minutes,
- GError **error);
+gchar *mm_new_iso8601_time_from_unix_time (guint64 timestamp,
+ GError **error);
+gchar *mm_new_iso8601_time (guint year,
+ guint month,
+ guint day,
+ guint hour,
+ guint minute,
+ guint second,
+ gboolean have_offset,
+ gint offset_minutes,
+ GError **error);
/******************************************************************************/
/* Type checkers and conversion utilities */
diff --git a/libmm-glib/tests/test-common-helpers.c b/libmm-glib/tests/test-common-helpers.c
index a1a2e61e..fff37a82 100644
--- a/libmm-glib/tests/test-common-helpers.c
+++ b/libmm-glib/tests/test-common-helpers.c
@@ -604,7 +604,8 @@ date_time_iso8601 (void)
gchar *date = NULL;
GError *error = NULL;
- date = mm_new_iso8601_time_from_unix_time (1634307342);
+ date = mm_new_iso8601_time_from_unix_time (1634307342, &error);
+ g_assert_no_error (error);
g_assert_cmpstr (date, ==, "2021-10-15T14:15:42Z");
g_free (date);
@@ -636,6 +637,12 @@ date_time_iso8601 (void)
g_assert_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS);
g_assert_null (date);
g_clear_error (&error);
+
+ /* Too far into the future */
+ date = mm_new_iso8601_time_from_unix_time (G_MAXINT64, &error);
+ g_assert_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS);
+ g_assert_null (date);
+ g_clear_error (&error);
}
/**************************************************************/