[Commits] [SCM] claws branch, master, updated. 3.14.0-10-g0a69220

ticho at claws-mail.org ticho at claws-mail.org
Thu Aug 18 15:11:51 CEST 2016


The branch, master has been updated
       via  0a692203078cd322d6ab2f96917233209a13a59c (commit)
      from  33282d05ca0f3162229f1c2ca00a488791d1d7bf (commit)

Summary of changes:
 src/plugins/vcalendar/libical/libical/icaltime.c |   94 +++++++++++++++++++++-
 1 file changed, 90 insertions(+), 4 deletions(-)


- Log -----------------------------------------------------------------
commit 0a692203078cd322d6ab2f96917233209a13a59c
Author: Andrej Kacian <ticho at claws-mail.org>
Date:   Thu Aug 18 15:07:40 2016 +0200

    Use GDateTime instead of mktime() in vcalendar's libical.
    
    On several places, libical relies on mktime()'s undefined
    behavior for dates before the Epoch - on Linux, it returns
    minus number of seconds *until* epoch for such dates.
    
    On Windows, mktime() returns -1, which leads to code around
    it crashing, since there are almost no error checks in libical.
    
    We circumvent this by doing the needed conversions via glib's
    GDateTime instead where needed.

diff --git a/src/plugins/vcalendar/libical/libical/icaltime.c b/src/plugins/vcalendar/libical/libical/icaltime.c
index 8e127ce..3ca3d9d 100644
--- a/src/plugins/vcalendar/libical/libical/icaltime.c
+++ b/src/plugins/vcalendar/libical/libical/icaltime.c
@@ -161,8 +161,37 @@ void unset_tz(struct set_tz_save savetz)
 
 time_t icaltime_as_timet(struct icaltimetype tt)
 {
+	time_t t;
+
+#ifdef G_OS_WIN32
+	GTimeZone *zone;
+	GDateTime *dt;
+
+	if (tt.is_utc == 1)
+		zone = g_time_zone_new_utc();
+	else
+		zone = g_time_zone_new_local();
+
+	dt = g_date_time_new(
+				zone,
+				tt.year,
+				tt.month,
+				tt.day,
+				tt.hour,
+				tt.minute,
+				tt.second);
+
+	/* Got to return something... */
+	if (dt == NULL)
+		return 0;
+
+	t = g_date_time_to_unix(dt);
+
+	g_date_time_unref(dt);
+	g_time_zone_unref(zone);
+
+#else
     struct tm stm;
-    time_t t;
 
     memset(&stm,0,sizeof( struct tm));
 
@@ -185,9 +214,9 @@ time_t icaltime_as_timet(struct icaltimetype tt)
     } else {
 	t = mktime(&stm);
     }
+#endif
 
     return t;
-
 }
 
 char* icaltime_as_ical_string(struct icaltimetype tt)
@@ -283,6 +312,7 @@ int icaltime_utc_offset(struct icaltimetype ictt, const char* tzid)
 
 struct icaltimetype icaltime_normalize(struct icaltimetype tt)
 {
+#ifndef G_OS_WIN32
     struct tm stm, buft;
     time_t tut;
 
@@ -307,7 +337,7 @@ struct icaltimetype icaltime_normalize(struct icaltimetype tt)
     tt.day = stm.tm_mday;
     tt.month = stm.tm_mon +1;
     tt.year = stm.tm_year+1900;
-
+#endif
     return tt;
 }
 
@@ -486,6 +516,35 @@ short icaltime_week_number(struct icaltimetype ictt)
 
 
 short icaltime_day_of_year(struct icaltimetype t){
+#ifdef G_OS_WIN32
+	GTimeZone *zone;
+	GDateTime *dt;
+
+	if (t.is_utc == 1)
+		zone = g_time_zone_new_utc();
+	else
+		zone = g_time_zone_new_local();
+
+	dt = g_date_time_new(
+				zone,
+				t.year,
+				t.month,
+				t.day,
+				t.hour,
+				t.minute,
+				t.second);
+
+	/* Got to return something... */
+	if (dt == NULL)
+		return 1;
+
+	gint doy = g_date_time_get_day_of_year(dt);
+	g_date_time_unref(dt);
+	g_time_zone_unref(zone);
+
+	return doy;
+
+#else
     time_t tt = icaltime_as_timet(t);
     struct tm *stm, buft;
 
@@ -496,12 +555,38 @@ short icaltime_day_of_year(struct icaltimetype t){
     }
 
     return stm->tm_yday+1;
-    
+#endif
 }
 
 /* Jan 1 is day #1, not 0 */
 struct icaltimetype icaltime_from_day_of_year(short doy,  short year)
 {
+#ifdef G_OS_WIN32
+	GDateTime *dt = g_date_time_new_utc(
+			year,
+			1,
+			1,
+			0,
+			0,
+			0);
+	GDateTime *dtd = g_date_time_add_days(dt, doy);
+
+	g_date_time_unref(dt);
+	struct icaltimetype t = icaltime_null_time();
+
+	t.year = g_date_time_get_year(dtd);
+	t.month = g_date_time_get_month(dtd);
+	t.day = g_date_time_get_day_of_month(dtd);
+	t.hour = g_date_time_get_hour(dtd);
+	t.minute = g_date_time_get_minute(dtd);
+	t.second = g_date_time_get_second(dtd);
+	t.is_utc = 1;
+	t.is_date = 1;
+	g_date_time_unref(dtd);
+
+	return t;
+
+#else
     struct tm stm; 
     time_t tt;
     struct set_tz_save old_tz = set_tz("UTC");
@@ -521,6 +606,7 @@ struct icaltimetype icaltime_from_day_of_year(short doy,  short year)
     tt += doy *60*60*24;
 
     return icaltime_from_timet(tt, 1);
+#endif
 }
 
 struct icaltimetype icaltime_null_time()

-----------------------------------------------------------------------


hooks/post-receive
-- 
Claws Mail


More information about the Commits mailing list