From 4300d57de780780087944b2df254c2c25c24df5e Mon Sep 17 00:00:00 2001 From: Dave-Allured Date: Wed, 14 Oct 2020 15:30:49 -0600 Subject: [PATCH] Fix time zone parser bug, github #1417 --- libdispatch/nctime.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/libdispatch/nctime.c b/libdispatch/nctime.c index fcae8a639d..857581b67a 100644 --- a/libdispatch/nctime.c +++ b/libdispatch/nctime.c @@ -317,25 +317,23 @@ cdParseRelunits(cdCalenType timetype, char* relunits, cdUnitTime* unit, cdCompTi char basetime_1[CD_MAX_CHARTIME]; char basetime_2[CD_MAX_CHARTIME]; char basetime[2 * CD_MAX_CHARTIME + 1]; - int nconv1, nconv2, nconv; + int nconv; - /* Parse the relunits */ - /* Allow ISO-8601 "T" date-time separator as well as blank separator */ - nconv1 = sscanf(relunits,"%s since %[^T]T%s",charunits,basetime_1,basetime_2); - if(nconv1==EOF || nconv1==0){ - cdError("Error on relative units conversion, string = %s\n",relunits); - return 1; + /* Parse the relunits. First parse assuming white space only. */ + nconv = sscanf(relunits,"%s since %s %s",charunits,basetime_1,basetime_2); + + /* Handle ISO-8601 "T" date-time separator in place of blank separator. */ + if (nconv!=EOF && nconv>=2) { + if (strchr (basetime_1, 'T') != NULL) { + nconv = sscanf(relunits,"%s since %[^T]T%s",charunits,basetime_1,basetime_2); + } } - nconv2 = sscanf(relunits,"%s since %s %s",charunits,basetime_1,basetime_2); - if(nconv2==EOF || nconv2==0){ + + if(nconv==EOF || nconv==0){ cdError("Error on relative units conversion, string = %s\n",relunits); return 1; } - if(nconv1 < nconv2) { - nconv = nconv2; - } else { - nconv = sscanf(relunits,"%s since %[^T]T%s",charunits,basetime_1,basetime_2); - } + /* Get the units */ cdTrim(charunits,CD_MAX_RELUNITS); if(!strncasecmp(charunits,"sec",3) || !strcasecmp(charunits,"s")){