From b0652d95f2e824c3ed5a4fcacaab907d0b5de3ba Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 9 May 2016 08:50:18 +0200 Subject: [PATCH] Check return value of gmtime_r() When it returns NULL, the output variable is not set. --- src/libical/icaltime.c | 3 ++- src/libical/icaltimezone.c | 4 +++- src/libicalvcal/icalvcal.c | 5 ++++- src/test/timezones.c | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/libical/icaltime.c b/src/libical/icaltime.c index c0ad168..2921903 100644 --- a/src/libical/icaltime.c +++ b/src/libical/icaltime.c @@ -236,7 +236,8 @@ struct icaltimetype icaltime_from_timet_with_zone(const time_t tm, const int is_ utc_zone = icaltimezone_get_utc_timezone(); /* Convert the time_t to a struct tm in UTC time. We can trust gmtime for this. */ - gmtime_r(&tm, &t); + if (!gmtime_r(&tm, &t)) + return is_date ? icaltime_null_date () : icaltime_null_time (); tt.year = t.tm_year + 1900; tt.month = t.tm_mon + 1; diff --git a/src/libical/icaltimezone.c b/src/libical/icaltimezone.c index 65c6441..b180d32 100644 --- a/src/libical/icaltimezone.c +++ b/src/libical/icaltimezone.c @@ -1363,7 +1363,9 @@ static int get_offset(icaltimezone *zone) int offset; const time_t now = time(NULL); - gmtime_r(&now, &local); + if (!gmtime_r(&now, &local)) + return 0; + tt = tm_to_icaltimetype(&local); offset = icaltimezone_get_utc_offset(zone, &tt, NULL); diff --git a/src/libicalvcal/icalvcal.c b/src/libicalvcal/icalvcal.c index 325a6d5..c6f428c 100644 --- a/src/libicalvcal/icalvcal.c +++ b/src/libicalvcal/icalvcal.c @@ -134,7 +134,10 @@ static void convert_floating_time_to_utc(struct icaltimetype *itt) t = mktime(&tmp_tm); /* Now convert back to a struct tm, but with a UTC time. */ - gmtime_r(&t, &utc_tm); + if (!gmtime_r(&t, &utc_tm)) { + *itt = itt->is_date ? icaltime_null_date () : icaltime_null_time (); + return; + } /* Now put it back into the icaltime. */ itt->year = utc_tm.tm_year + 1900; diff --git a/src/test/timezones.c b/src/test/timezones.c index b936242..3648307 100644 --- a/src/test/timezones.c +++ b/src/test/timezones.c @@ -106,7 +106,9 @@ int main() if (verbose || curr_failed != failed) { struct tm utc_tm; - gmtime_r(&curr_time, &utc_tm); + if (!gmtime_r(&curr_time, &utc_tm)) + memset(&utc_tm, 0, sizeof(utc_tm)); + printf( "%s: day %03d: %s: %04d-%02d-%02d %02d:%02d:%02d UTC = " "libc %04d-%02d-%02d %02d:%02d:%02d dst %d", -- 2.5.0