From dc5fc0e163421f5a01c3cdaab23ca2ea1eb3fae2 Mon Sep 17 00:00:00 2001
From: Milan Crha <mcrha@redhat.com>
Date: Wed, 4 Oct 2017 11:48:48 +0200
Subject: [PATCH 1/2] Use icaltime_is_utc() instead of icaltimetype::is_utc

The structure member is going to be removed from libical in the next release
and the function is available for a long time, thus it's safe to replace
the usage in the code.

(cherry picked from commit f607f8628a28440374579531bc78848dfe0c782e)
---
 src/calendar/backends/contacts/e-cal-backend-contacts.c | 1 -
 src/calendar/libecal/e-cal-component.c                  | 8 ++++----
 src/calendar/libecal/e-cal-recur.c                      | 8 ++++----
 src/calendar/libecal/e-cal-time-util.c                  | 3 +--
 4 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/src/calendar/backends/contacts/e-cal-backend-contacts.c b/src/calendar/backends/contacts/e-cal-backend-contacts.c
index d2b570885..cf2c62062 100644
--- a/src/calendar/backends/contacts/e-cal-backend-contacts.c
+++ b/src/calendar/backends/contacts/e-cal-backend-contacts.c
@@ -699,7 +699,6 @@ cdate_to_icaltime (EContactDate *cdate)
 	ret.month = cdate->month;
 	ret.day = cdate->day;
 	ret.is_date = TRUE;
-	ret.is_utc = FALSE;
 	ret.zone = NULL;
 	ret.is_daylight = FALSE;
 
diff --git a/src/calendar/libecal/e-cal-component.c b/src/calendar/libecal/e-cal-component.c
index 65b530d1e..6d8a9814d 100644
--- a/src/calendar/libecal/e-cal-component.c
+++ b/src/calendar/libecal/e-cal-component.c
@@ -2522,7 +2522,7 @@ get_datetime (struct datetime *datetime,
 	 * This makes the timezone code simpler. */
 	if (datetime->tzid_param)
 		dt->tzid = g_strdup (icalparameter_get_tzid (datetime->tzid_param));
-	else if (dt->value && dt->value->is_utc)
+	else if (dt->value && icaltime_is_utc (*dt->value))
 		dt->tzid = g_strdup ("UTC");
 	else
 		dt->tzid = NULL;
@@ -2559,9 +2559,9 @@ set_datetime (ECalComponent *comp,
 
 	/* If the TZID is set to "UTC", we set the is_utc flag. */
 	if (dt->tzid && !strcmp (dt->tzid, "UTC"))
-		dt->value->is_utc = 1;
-	else
-		dt->value->is_utc = 0;
+		dt->value->zone = icaltimezone_get_utc_timezone ();
+	else if (dt->value->zone == icaltimezone_get_utc_timezone ())
+		dt->value->zone = NULL;
 
 	if (datetime->prop) {
 		/* make sure no VALUE property is left if not needed */
diff --git a/src/calendar/libecal/e-cal-recur.c b/src/calendar/libecal/e-cal-recur.c
index 535d56c14..cad588c4d 100644
--- a/src/calendar/libecal/e-cal-recur.c
+++ b/src/calendar/libecal/e-cal-recur.c
@@ -195,7 +195,7 @@ ensure_timezone (icalcomponent *comp,
 	   a different icalcomponent and cause use-after-free. */
 	tt->zone = NULL;
 
-	if (tt->is_utc)
+	if (icaltime_is_utc (*tt))
 		return TRUE;
 
 	tt->zone = default_timezone;
@@ -435,7 +435,7 @@ e_cal_recur_generate_instances_sync (icalcomponent *comp,
 				rrule.until.minute = 0;
 				rrule.until.second = 0;
 
-				if (!rrule.until.zone && !rrule.until.is_utc)
+				if (!rrule.until.zone && !icaltime_is_utc (rrule.until))
 					rrule.until.zone = dtstart.zone;
 			}
 
@@ -542,7 +542,7 @@ e_cal_recur_generate_instances_sync (icalcomponent *comp,
 				exrule.until.minute = 0;
 				exrule.until.second = 0;
 
-				if (!exrule.until.zone && !exrule.until.is_utc)
+				if (!exrule.until.zone && !icaltime_is_utc (exrule.until))
 					exrule.until.zone = dtstart.zone;
 			}
 
@@ -586,7 +586,7 @@ e_cal_recur_generate_instances_sync (icalcomponent *comp,
 			if (!success)
 				break;
 
-			if (!exdate.zone && !exdate.is_utc)
+			if (!exdate.zone && !icaltime_is_utc (exdate))
 				exdate.zone = dtstart.zone;
 
 			if (intersects_interval (&exdate, NULL, duration_days, duration_seconds, &interval_start, &interval_end)) {
diff --git a/src/calendar/libecal/e-cal-time-util.c b/src/calendar/libecal/e-cal-time-util.c
index 7bcbc8ba1..914761cb0 100644
--- a/src/calendar/libecal/e-cal-time-util.c
+++ b/src/calendar/libecal/e-cal-time-util.c
@@ -763,9 +763,8 @@ tm_to_icaltimetype (struct tm *tm,
 
 	itt.day = tm->tm_mday;
 	itt.month = tm->tm_mon + 1;
-	itt.year = tm->tm_year+ 1900;
+	itt.year = tm->tm_year + 1900;
 
-	itt.is_utc = 0;
 	itt.is_date = is_date;
 
 	return itt;
-- 
2.15.1


From fccd77cf4620ca76c4fd2bf7721e3fb7eaf55ec6 Mon Sep 17 00:00:00 2001
From: Milan Crha <mcrha@redhat.com>
Date: Thu, 5 Oct 2017 13:50:08 +0200
Subject: [PATCH 2/2] e-cal-recur.c:ensure_timezone(): Unset icaltimetype::zone
 only if not UTC

With a removal of icaltimetype::is_utc the icaltimetype::zone is used
to determine whether it's UTC or not. That means that the icaltimetype::zone
can be unset only if it's not the built-in UTC time zone.

(cherry picked from commit 1f39ade8db00091d6fa4c752ccb70361ef0e8abc)
---
 src/calendar/libecal/e-cal-recur.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/calendar/libecal/e-cal-recur.c b/src/calendar/libecal/e-cal-recur.c
index cad588c4d..fc14fb15c 100644
--- a/src/calendar/libecal/e-cal-recur.c
+++ b/src/calendar/libecal/e-cal-recur.c
@@ -193,7 +193,8 @@ ensure_timezone (icalcomponent *comp,
 
 	/* Do not trust the 'zone' set on the structure, as it can come from
 	   a different icalcomponent and cause use-after-free. */
-	tt->zone = NULL;
+	if (tt->zone != icaltimezone_get_utc_timezone ())
+		tt->zone = NULL;
 
 	if (icaltime_is_utc (*tt))
 		return TRUE;
-- 
2.15.1