From 76f151ff375f2985026f4d5d738c8e2c769a1bce Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Mon, 18 Aug 2014 15:13:46 +0200 Subject: Correctly parse all types of iCal durations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This was supposed to be fixed in 6ca2535 (ical.c: Simplify and fix ical_durtime2long(), 2014-07-28) but some cases were not covered. Reported-by: HÃ¥kan Jerning Signed-off-by: Lukas Fleischer --- src/ical.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'src/ical.c') diff --git a/src/ical.c b/src/ical.c index 16281e6..d6ea90a 100644 --- a/src/ical.c +++ b/src/ical.c @@ -510,6 +510,7 @@ static long ical_datetime2long(char *datestr, ical_vevent_e * type) static long ical_durtime2long(char *timestr) { char *p; + int bytes_read; unsigned hour = 0, min = 0, sec = 0; if ((p = strchr(timestr, 'T')) == NULL) @@ -517,16 +518,24 @@ static long ical_durtime2long(char *timestr) p++; if (strchr(p, 'H')) { - if (sscanf(p, "%uH%uM%uS", &hour, &min, &sec) != 3) + if (sscanf(p, "%uH%n", &hour, &bytes_read) != 1) return 0; - } else if (strchr(p, 'M')) { - if (sscanf(p, "%uM%uS", &min, &sec) != 2) + p += bytes_read; + } + if (strchr(p, 'M')) { + if (sscanf(p, "%uM%n", &min, &bytes_read) != 1) return 0; - } else if (strchr(p, 'S')) { - if (sscanf(p, "%uS", &sec) != 1) + p += bytes_read; + } + if (strchr(p, 'S')) { + if (sscanf(p, "%uM%n", &sec, &bytes_read) != 1) return 0; + p += bytes_read; } + if (hour == 0 && min == 0 && sec == 0) + return 0; + return hour * HOURINSEC + min * MININSEC + sec; } -- cgit v1.2.3