Re-order checks for colons in UTC offset

This commit is contained in:
Nobuyoshi Nakada 2022-11-15 09:01:29 +09:00
parent b7d591643a
commit 5c3dba83fa
No known key found for this signature in database
GPG Key ID: 7CD2805BFA3770C6

18
time.c
View File

@ -2118,6 +2118,7 @@ utc_offset_arg(VALUE arg)
if (s[0] >= 'A' && s[0] <= 'I') {
n = (int)s[0] - 'A' + 1;
}
/* No 'J' zone */
else if (s[0] >= 'K' && s[0] <= 'M') {
n = (int)s[0] - 'A';
}
@ -2134,30 +2135,29 @@ utc_offset_arg(VALUE arg)
return UTC_ZONE;
}
break; /* +HH */
case 7: /* +HHMMSS */
sec = s+5;
/* fallthrough */
case 5: /* +HHMM */
min = s+3;
break;
case 6: /* +HH:MM */
min = s+4;
break;
case 7: /* +HHMMSS */
sec = s+5;
min = s+3;
break;
case 9: /* +HH:MM:SS */
if (s[6] != ':') goto invalid_utc_offset;
sec = s+7;
/* fallthrough */
case 6: /* +HH:MM */
if (s[3] != ':') goto invalid_utc_offset;
min = s+4;
break;
default:
goto invalid_utc_offset;
}
if (sec) {
if (sec == s+7 && *(sec-1) != ':') goto invalid_utc_offset;
if (!ISDIGIT(sec[0]) || !ISDIGIT(sec[1])) goto invalid_utc_offset;
n += (sec[0] * 10 + sec[1] - '0' * 11);
ASSUME(min);
}
if (min) {
if (min == s+4 && *(min-1) != ':') goto invalid_utc_offset;
if (!ISDIGIT(min[0]) || !ISDIGIT(min[1])) goto invalid_utc_offset;
if (min[0] > '5') goto invalid_utc_offset;
n += (min[0] * 10 + min[1] - '0' * 11) * 60;