From 6ca2535f5e35147b469fb4a9bde9148eed4aa01e Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Mon, 28 Jul 2014 11:54:03 +0200 Subject: ical.c: Simplify and fix ical_durtime2long() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Correctly parse all types of durations. Before this change, durations without an hour or minute component were not parsed properly. Reported-by: HÃ¥kan Jerning Signed-off-by: Lukas Fleischer --- src/ical.c | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/ical.c b/src/ical.c index d953b0e..dda642a 100644 --- a/src/ical.c +++ b/src/ical.c @@ -488,30 +488,25 @@ static long ical_datetime2long(char *datestr, ical_vevent_e * type) static long ical_durtime2long(char *timestr) { - long timelong; char *p; + unsigned hour = 0, min = 0, sec = 0; - if ((p = strchr(timestr, 'T')) == NULL) { - timelong = 0; - } else { - int nbmatch; - struct { - unsigned hour, min, sec; - } time; + if ((p = strchr(timestr, 'T')) == NULL) + return 0; - p++; - memset(&time, 0, sizeof time); - nbmatch = - sscanf(p, "%uH%uM%uS", &time.hour, &time.min, - &time.sec); - if (nbmatch < 1 || nbmatch > 3) - timelong = 0; - else - timelong = - time.hour * HOURINSEC + time.min * MININSEC + - time.sec; + p++; + if (strchr(p, 'H')) { + if (sscanf(p, "%uH%uM%uS", &hour, &min, &sec) != 3) + return 0; + } else if (strchr(p, 'M')) { + if (sscanf(p, "%uM%uS", &min, &sec) != 2) + return 0; + } else if (strchr(p, 'S')) { + if (sscanf(p, "%uS", &sec) != 1) + return 0; } - return timelong; + + return hour * HOURINSEC + min * MININSEC + sec; } /* -- cgit v1.2.3