diff options
author | Stanislav Malyshev <stas@php.net> | 2014-05-11 21:09:11 -0700 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2014-07-18 16:11:54 -0700 |
commit | 2326401fc197cb88141561d3d51eccd7ac59fede (patch) | |
tree | a7454637bb697d7e911b2b44b2a6c4206c91c457 | |
parent | 7f527897fe3e333f43bbed67741287d355ab4b2b (diff) | |
download | php-git-2326401fc197cb88141561d3d51eccd7ac59fede.tar.gz |
fix bug #67253: timelib_meridian_with_check out-of-bounds read
Conflicts:
ext/date/lib/parse_date.c
-rw-r--r-- | ext/date/lib/parse_date.c | 201 | ||||
-rw-r--r-- | ext/date/lib/parse_date.re | 5 | ||||
-rw-r--r-- | ext/date/lib/parse_iso_intervals.c | 2 | ||||
-rw-r--r-- | ext/date/tests/bug67253.phpt | 44 |
4 files changed, 151 insertions, 101 deletions
diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index a3364ef7f8..1d23c9b045 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Mon Dec 5 22:02:41 2011 */ +/* Generated by re2c 0.13.5 on Fri Jul 18 16:11:36 2014 */ #line 1 "ext/date/lib/parse_date.re" /* +----------------------------------------------------------------------+ @@ -403,9 +403,12 @@ static timelib_sll timelib_meridian_with_check(char **ptr, timelib_sll h) { timelib_sll retval = 0; - while (!strchr("AaPp", **ptr)) { + while (**ptr && !strchr("AaPp", **ptr)) { ++*ptr; } + if(!**ptr) { + return TIMELIB_UNSET; + } if (**ptr == 'a' || **ptr == 'A') { if (h == 12) { retval = -12; @@ -871,11 +874,11 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) std: s->tok = cursor; s->len = 0; -#line 997 "ext/date/lib/parse_date.re" +#line 1000 "ext/date/lib/parse_date.re" -#line 879 "ext/date/lib/parse_date.c" +#line 882 "ext/date/lib/parse_date.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -995,7 +998,7 @@ std: } yy2: YYDEBUG(2, *YYCURSOR); -#line 1082 "ext/date/lib/parse_date.re" +#line 1085 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("firstdayof | lastdayof"); TIMELIB_INIT; @@ -1011,7 +1014,7 @@ yy2: TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 1015 "ext/date/lib/parse_date.c" +#line 1018 "ext/date/lib/parse_date.c" yy3: YYDEBUG(3, *YYCURSOR); ++YYCURSOR; @@ -1034,7 +1037,7 @@ yy3: } yy4: YYDEBUG(4, *YYCURSOR); -#line 1676 "ext/date/lib/parse_date.re" +#line 1679 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("tzcorrection | tz"); @@ -1047,7 +1050,7 @@ yy4: TIMELIB_DEINIT; return TIMELIB_TIMEZONE; } -#line 1051 "ext/date/lib/parse_date.c" +#line 1054 "ext/date/lib/parse_date.c" yy5: YYDEBUG(5, *YYCURSOR); yych = *++YYCURSOR; @@ -1358,12 +1361,12 @@ yy12: if (yych <= '9') goto yy1385; yy13: YYDEBUG(13, *YYCURSOR); -#line 1771 "ext/date/lib/parse_date.re" +#line 1774 "ext/date/lib/parse_date.re" { add_error(s, "Unexpected character"); goto std; } -#line 1367 "ext/date/lib/parse_date.c" +#line 1370 "ext/date/lib/parse_date.c" yy14: YYDEBUG(14, *YYCURSOR); yych = *++YYCURSOR; @@ -2420,11 +2423,11 @@ yy49: if (yych <= '9') goto yy55; yy50: YYDEBUG(50, *YYCURSOR); -#line 1760 "ext/date/lib/parse_date.re" +#line 1763 "ext/date/lib/parse_date.re" { goto std; } -#line 2428 "ext/date/lib/parse_date.c" +#line 2431 "ext/date/lib/parse_date.c" yy51: YYDEBUG(51, *YYCURSOR); yych = *++YYCURSOR; @@ -2433,12 +2436,12 @@ yy52: YYDEBUG(52, *YYCURSOR); ++YYCURSOR; YYDEBUG(53, *YYCURSOR); -#line 1765 "ext/date/lib/parse_date.re" +#line 1768 "ext/date/lib/parse_date.re" { s->pos = cursor; s->line++; goto std; } -#line 2442 "ext/date/lib/parse_date.c" +#line 2445 "ext/date/lib/parse_date.c" yy54: YYDEBUG(54, *YYCURSOR); yych = *++YYCURSOR; @@ -2825,7 +2828,7 @@ yy72: if (yych == 's') goto yy74; yy73: YYDEBUG(73, *YYCURSOR); -#line 1744 "ext/date/lib/parse_date.re" +#line 1747 "ext/date/lib/parse_date.re" { timelib_ull i; DEBUG_OUTPUT("relative"); @@ -2840,7 +2843,7 @@ yy73: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 2844 "ext/date/lib/parse_date.c" +#line 2847 "ext/date/lib/parse_date.c" yy74: YYDEBUG(74, *YYCURSOR); yych = *++YYCURSOR; @@ -3602,7 +3605,7 @@ yy166: } yy167: YYDEBUG(167, *YYCURSOR); -#line 1607 "ext/date/lib/parse_date.re" +#line 1610 "ext/date/lib/parse_date.re" { const timelib_relunit* relunit; DEBUG_OUTPUT("daytext"); @@ -3619,7 +3622,7 @@ yy167: TIMELIB_DEINIT; return TIMELIB_WEEKDAY; } -#line 3623 "ext/date/lib/parse_date.c" +#line 3626 "ext/date/lib/parse_date.c" yy168: YYDEBUG(168, *YYCURSOR); yych = *++YYCURSOR; @@ -4139,7 +4142,7 @@ yy193: } yy194: YYDEBUG(194, *YYCURSOR); -#line 1666 "ext/date/lib/parse_date.re" +#line 1669 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("monthtext"); TIMELIB_INIT; @@ -4148,7 +4151,7 @@ yy194: TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4152 "ext/date/lib/parse_date.c" +#line 4155 "ext/date/lib/parse_date.c" yy195: YYDEBUG(195, *YYCURSOR); ++YYCURSOR; @@ -4199,7 +4202,7 @@ yy198: } yy199: YYDEBUG(199, *YYCURSOR); -#line 1412 "ext/date/lib/parse_date.re" +#line 1415 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datetextual | datenoyear"); @@ -4212,7 +4215,7 @@ yy199: TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4216 "ext/date/lib/parse_date.c" +#line 4219 "ext/date/lib/parse_date.c" yy200: YYDEBUG(200, *YYCURSOR); yyaccept = 6; @@ -4481,7 +4484,7 @@ yy222: } yy223: YYDEBUG(223, *YYCURSOR); -#line 1714 "ext/date/lib/parse_date.re" +#line 1717 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz"); @@ -4510,7 +4513,7 @@ yy223: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 4514 "ext/date/lib/parse_date.c" +#line 4517 "ext/date/lib/parse_date.c" yy224: YYDEBUG(224, *YYCURSOR); yyaccept = 7; @@ -5208,7 +5211,7 @@ yy278: YYDEBUG(278, *YYCURSOR); ++YYCURSOR; YYDEBUG(279, *YYCURSOR); -#line 1690 "ext/date/lib/parse_date.re" +#line 1693 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12"); TIMELIB_INIT; @@ -5231,7 +5234,7 @@ yy278: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 5235 "ext/date/lib/parse_date.c" +#line 5238 "ext/date/lib/parse_date.c" yy280: YYDEBUG(280, *YYCURSOR); yych = *++YYCURSOR; @@ -5409,7 +5412,7 @@ yy294: ++YYCURSOR; yy295: YYDEBUG(295, *YYCURSOR); -#line 1384 "ext/date/lib/parse_date.re" +#line 1387 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenoday"); @@ -5422,7 +5425,7 @@ yy295: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 5426 "ext/date/lib/parse_date.c" +#line 5429 "ext/date/lib/parse_date.c" yy296: YYDEBUG(296, *YYCURSOR); yych = *++YYCURSOR; @@ -6642,7 +6645,7 @@ yy362: if (yych <= '9') goto yy365; yy364: YYDEBUG(364, *YYCURSOR); -#line 1528 "ext/date/lib/parse_date.re" +#line 1531 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextshort"); @@ -6655,7 +6658,7 @@ yy364: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 6659 "ext/date/lib/parse_date.c" +#line 6662 "ext/date/lib/parse_date.c" yy365: YYDEBUG(365, *YYCURSOR); yych = *++YYCURSOR; @@ -7293,7 +7296,7 @@ yy392: } yy393: YYDEBUG(393, *YYCURSOR); -#line 1586 "ext/date/lib/parse_date.re" +#line 1589 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("ago"); TIMELIB_INIT; @@ -7313,7 +7316,7 @@ yy393: TIMELIB_DEINIT; return TIMELIB_AGO; } -#line 7317 "ext/date/lib/parse_date.c" +#line 7320 "ext/date/lib/parse_date.c" yy394: YYDEBUG(394, *YYCURSOR); yyaccept = 5; @@ -9063,7 +9066,7 @@ yy454: ++YYCURSOR; yy455: YYDEBUG(455, *YYCURSOR); -#line 1289 "ext/date/lib/parse_date.re" +#line 1292 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash"); TIMELIB_INIT; @@ -9074,7 +9077,7 @@ yy455: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 9078 "ext/date/lib/parse_date.c" +#line 9081 "ext/date/lib/parse_date.c" yy456: YYDEBUG(456, *YYCURSOR); yyaccept = 0; @@ -9634,7 +9637,7 @@ yy475: } yy476: YYDEBUG(476, *YYCURSOR); -#line 1426 "ext/date/lib/parse_date.re" +#line 1429 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenoyearrev"); TIMELIB_INIT; @@ -9645,7 +9648,7 @@ yy476: TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 9649 "ext/date/lib/parse_date.c" +#line 9652 "ext/date/lib/parse_date.c" yy477: YYDEBUG(477, *YYCURSOR); yyaccept = 10; @@ -9786,7 +9789,7 @@ yy488: YYDEBUG(488, *YYCURSOR); ++YYCURSOR; YYDEBUG(489, *YYCURSOR); -#line 1144 "ext/date/lib/parse_date.re" +#line 1147 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12"); TIMELIB_INIT; @@ -9802,7 +9805,7 @@ yy488: TIMELIB_DEINIT; return TIMELIB_TIME12; } -#line 9806 "ext/date/lib/parse_date.c" +#line 9809 "ext/date/lib/parse_date.c" yy490: YYDEBUG(490, *YYCURSOR); yyaccept = 11; @@ -9815,7 +9818,7 @@ yy490: } yy491: YYDEBUG(491, *YYCURSOR); -#line 1181 "ext/date/lib/parse_date.re" +#line 1184 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long"); @@ -9840,7 +9843,7 @@ yy491: TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 9844 "ext/date/lib/parse_date.c" +#line 9847 "ext/date/lib/parse_date.c" yy492: YYDEBUG(492, *YYCURSOR); yyaccept = 11; @@ -10150,7 +10153,7 @@ yy523: YYDEBUG(523, *YYCURSOR); ++YYCURSOR; YYDEBUG(524, *YYCURSOR); -#line 1161 "ext/date/lib/parse_date.re" +#line 1164 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("mssqltime"); TIMELIB_INIT; @@ -10169,7 +10172,7 @@ yy523: TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 10173 "ext/date/lib/parse_date.c" +#line 10176 "ext/date/lib/parse_date.c" yy525: YYDEBUG(525, *YYCURSOR); yyaccept = 11; @@ -10275,7 +10278,7 @@ yy534: if (yych <= '9') goto yy541; yy535: YYDEBUG(535, *YYCURSOR); -#line 1343 "ext/date/lib/parse_date.re" +#line 1346 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datefull"); @@ -10289,7 +10292,7 @@ yy535: TIMELIB_DEINIT; return TIMELIB_DATE_FULL; } -#line 10293 "ext/date/lib/parse_date.c" +#line 10296 "ext/date/lib/parse_date.c" yy536: YYDEBUG(536, *YYCURSOR); yych = *++YYCURSOR; @@ -11026,7 +11029,7 @@ yy605: YYDEBUG(606, *YYCURSOR); ++YYCURSOR; YYDEBUG(607, *YYCURSOR); -#line 1358 "ext/date/lib/parse_date.re" +#line 1361 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pointed date YYYY"); TIMELIB_INIT; @@ -11037,7 +11040,7 @@ yy605: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 11041 "ext/date/lib/parse_date.c" +#line 11044 "ext/date/lib/parse_date.c" yy608: YYDEBUG(608, *YYCURSOR); yyaccept = 11; @@ -11073,7 +11076,7 @@ yy611: if (yych <= '9') goto yy605; yy612: YYDEBUG(612, *YYCURSOR); -#line 1370 "ext/date/lib/parse_date.re" +#line 1373 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pointed date YY"); @@ -11086,7 +11089,7 @@ yy612: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 11090 "ext/date/lib/parse_date.c" +#line 11093 "ext/date/lib/parse_date.c" yy613: YYDEBUG(613, *YYCURSOR); yyaccept = 11; @@ -11727,7 +11730,7 @@ yy656: } yy657: YYDEBUG(657, *YYCURSOR); -#line 1329 "ext/date/lib/parse_date.re" +#line 1332 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshort"); @@ -11740,7 +11743,7 @@ yy657: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 11744 "ext/date/lib/parse_date.c" +#line 11747 "ext/date/lib/parse_date.c" yy658: YYDEBUG(658, *YYCURSOR); yyaccept = 13; @@ -11846,7 +11849,7 @@ yy666: } yy667: YYDEBUG(667, *YYCURSOR); -#line 1273 "ext/date/lib/parse_date.re" +#line 1276 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("americanshort | american"); @@ -11861,7 +11864,7 @@ yy667: TIMELIB_DEINIT; return TIMELIB_AMERICAN; } -#line 11865 "ext/date/lib/parse_date.c" +#line 11868 "ext/date/lib/parse_date.c" yy668: YYDEBUG(668, *YYCURSOR); yyaccept = 14; @@ -12094,7 +12097,7 @@ yy700: if (yych <= ':') goto yy704; yy701: YYDEBUG(701, *YYCURSOR); -#line 1556 "ext/date/lib/parse_date.re" +#line 1559 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("clf"); @@ -12114,7 +12117,7 @@ yy701: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 12118 "ext/date/lib/parse_date.c" +#line 12121 "ext/date/lib/parse_date.c" yy702: YYDEBUG(702, *YYCURSOR); yych = *++YYCURSOR; @@ -12666,7 +12669,7 @@ yy763: } yy764: YYDEBUG(764, *YYCURSOR); -#line 1301 "ext/date/lib/parse_date.re" +#line 1304 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("iso8601date2"); @@ -12679,7 +12682,7 @@ yy764: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 12683 "ext/date/lib/parse_date.c" +#line 12686 "ext/date/lib/parse_date.c" yy765: YYDEBUG(765, *YYCURSOR); yych = *++YYCURSOR; @@ -12718,7 +12721,7 @@ yy771: YYDEBUG(771, *YYCURSOR); ++YYCURSOR; YYDEBUG(772, *YYCURSOR); -#line 1542 "ext/date/lib/parse_date.re" +#line 1545 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextreverse"); @@ -12731,7 +12734,7 @@ yy771: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 12735 "ext/date/lib/parse_date.c" +#line 12738 "ext/date/lib/parse_date.c" yy773: YYDEBUG(773, *YYCURSOR); yych = *++YYCURSOR; @@ -12869,7 +12872,7 @@ yy783: } yy784: YYDEBUG(784, *YYCURSOR); -#line 1577 "ext/date/lib/parse_date.re" +#line 1580 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("year4"); TIMELIB_INIT; @@ -12877,7 +12880,7 @@ yy784: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 12881 "ext/date/lib/parse_date.c" +#line 12884 "ext/date/lib/parse_date.c" yy785: YYDEBUG(785, *YYCURSOR); yych = *++YYCURSOR; @@ -13028,7 +13031,7 @@ yy793: } yy794: YYDEBUG(794, *YYCURSOR); -#line 1398 "ext/date/lib/parse_date.re" +#line 1401 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenodayrev"); @@ -13041,7 +13044,7 @@ yy794: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 13045 "ext/date/lib/parse_date.c" +#line 13048 "ext/date/lib/parse_date.c" yy795: YYDEBUG(795, *YYCURSOR); yych = *++YYCURSOR; @@ -13256,7 +13259,7 @@ yy814: if (yych <= '7') goto yy817; yy815: YYDEBUG(815, *YYCURSOR); -#line 1509 "ext/date/lib/parse_date.re" +#line 1512 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweek"); @@ -13274,7 +13277,7 @@ yy815: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 13278 "ext/date/lib/parse_date.c" +#line 13281 "ext/date/lib/parse_date.c" yy816: YYDEBUG(816, *YYCURSOR); yych = *++YYCURSOR; @@ -13284,7 +13287,7 @@ yy817: YYDEBUG(817, *YYCURSOR); ++YYCURSOR; YYDEBUG(818, *YYCURSOR); -#line 1490 "ext/date/lib/parse_date.re" +#line 1493 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweekday"); @@ -13302,7 +13305,7 @@ yy817: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 13306 "ext/date/lib/parse_date.c" +#line 13309 "ext/date/lib/parse_date.c" yy819: YYDEBUG(819, *YYCURSOR); yych = *++YYCURSOR; @@ -13366,7 +13369,7 @@ yy821: } yy822: YYDEBUG(822, *YYCURSOR); -#line 1476 "ext/date/lib/parse_date.re" +#line 1479 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgydotd"); @@ -13379,7 +13382,7 @@ yy822: TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 13383 "ext/date/lib/parse_date.c" +#line 13386 "ext/date/lib/parse_date.c" yy823: YYDEBUG(823, *YYCURSOR); yych = *++YYCURSOR; @@ -13482,7 +13485,7 @@ yy842: ++YYCURSOR; yy843: YYDEBUG(843, *YYCURSOR); -#line 1450 "ext/date/lib/parse_date.re" +#line 1453 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif"); @@ -13507,7 +13510,7 @@ yy843: TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 13511 "ext/date/lib/parse_date.c" +#line 13514 "ext/date/lib/parse_date.c" yy844: YYDEBUG(844, *YYCURSOR); yych = *++YYCURSOR; @@ -13769,7 +13772,7 @@ yy848: } yy849: YYDEBUG(849, *YYCURSOR); -#line 1438 "ext/date/lib/parse_date.re" +#line 1441 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenocolon"); TIMELIB_INIT; @@ -13780,7 +13783,7 @@ yy849: TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 13784 "ext/date/lib/parse_date.c" +#line 13787 "ext/date/lib/parse_date.c" yy850: YYDEBUG(850, *YYCURSOR); yych = *++YYCURSOR; @@ -14700,7 +14703,7 @@ yy973: if (yych <= '9') goto yy996; yy974: YYDEBUG(974, *YYCURSOR); -#line 1315 "ext/date/lib/parse_date.re" +#line 1318 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshorter"); @@ -14713,7 +14716,7 @@ yy974: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 14717 "ext/date/lib/parse_date.c" +#line 14720 "ext/date/lib/parse_date.c" yy975: YYDEBUG(975, *YYCURSOR); yyaccept = 22; @@ -15722,7 +15725,7 @@ yy1066: } yy1068: YYDEBUG(1068, *YYCURSOR); -#line 1207 "ext/date/lib/parse_date.re" +#line 1210 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("gnunocolon"); TIMELIB_INIT; @@ -15744,7 +15747,7 @@ yy1068: TIMELIB_DEINIT; return TIMELIB_GNU_NOCOLON; } -#line 15748 "ext/date/lib/parse_date.c" +#line 15751 "ext/date/lib/parse_date.c" yy1069: YYDEBUG(1069, *YYCURSOR); yych = *++YYCURSOR; @@ -15836,7 +15839,7 @@ yy1075: } yy1076: YYDEBUG(1076, *YYCURSOR); -#line 1253 "ext/date/lib/parse_date.re" +#line 1256 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("iso8601nocolon"); @@ -15855,7 +15858,7 @@ yy1076: TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 15859 "ext/date/lib/parse_date.c" +#line 15862 "ext/date/lib/parse_date.c" yy1077: YYDEBUG(1077, *YYCURSOR); yyaccept = 25; @@ -16753,7 +16756,7 @@ yy1117: } yy1118: YYDEBUG(1118, *YYCURSOR); -#line 1649 "ext/date/lib/parse_date.re" +#line 1652 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16769,7 +16772,7 @@ yy1118: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 16773 "ext/date/lib/parse_date.c" +#line 16776 "ext/date/lib/parse_date.c" yy1119: YYDEBUG(1119, *YYCURSOR); ++YYCURSOR; @@ -16820,7 +16823,7 @@ yy1126: YYDEBUG(1126, *YYCURSOR); ++YYCURSOR; YYDEBUG(1127, *YYCURSOR); -#line 1122 "ext/date/lib/parse_date.re" +#line 1125 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16841,7 +16844,7 @@ yy1126: TIMELIB_DEINIT; return TIMELIB_WEEK_DAY_OF_MONTH; } -#line 16845 "ext/date/lib/parse_date.c" +#line 16848 "ext/date/lib/parse_date.c" yy1128: YYDEBUG(1128, *YYCURSOR); yyaccept = 26; @@ -16949,7 +16952,7 @@ yy1141: } yy1142: YYDEBUG(1142, *YYCURSOR); -#line 1625 "ext/date/lib/parse_date.re" +#line 1628 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16972,7 +16975,7 @@ yy1142: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 16976 "ext/date/lib/parse_date.c" +#line 16979 "ext/date/lib/parse_date.c" yy1143: YYDEBUG(1143, *YYCURSOR); yych = *++YYCURSOR; @@ -19649,7 +19652,7 @@ yy1294: goto yy1298; yy1295: YYDEBUG(1295, *YYCURSOR); -#line 1099 "ext/date/lib/parse_date.re" +#line 1102 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("backof | frontof"); TIMELIB_INIT; @@ -19671,7 +19674,7 @@ yy1295: TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 19675 "ext/date/lib/parse_date.c" +#line 19678 "ext/date/lib/parse_date.c" yy1296: YYDEBUG(1296, *YYCURSOR); yyaccept = 28; @@ -21362,7 +21365,7 @@ yy1385: if (yych <= '9') goto yy1385; yy1387: YYDEBUG(1387, *YYCURSOR); -#line 1057 "ext/date/lib/parse_date.re" +#line 1060 "ext/date/lib/parse_date.re" { timelib_ull i; @@ -21386,7 +21389,7 @@ yy1387: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21390 "ext/date/lib/parse_date.c" +#line 21393 "ext/date/lib/parse_date.c" yy1388: YYDEBUG(1388, *YYCURSOR); yych = *++YYCURSOR; @@ -21822,7 +21825,7 @@ yy1416: ++YYCURSOR; yy1417: YYDEBUG(1417, *YYCURSOR); -#line 1045 "ext/date/lib/parse_date.re" +#line 1048 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("tomorrow"); TIMELIB_INIT; @@ -21833,7 +21836,7 @@ yy1417: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21837 "ext/date/lib/parse_date.c" +#line 21840 "ext/date/lib/parse_date.c" yy1418: YYDEBUG(1418, *YYCURSOR); yych = *++YYCURSOR; @@ -21868,7 +21871,7 @@ yy1419: } yy1420: YYDEBUG(1420, *YYCURSOR); -#line 1035 "ext/date/lib/parse_date.re" +#line 1038 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("midnight | today"); TIMELIB_INIT; @@ -21877,7 +21880,7 @@ yy1420: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21881 "ext/date/lib/parse_date.c" +#line 21884 "ext/date/lib/parse_date.c" yy1421: YYDEBUG(1421, *YYCURSOR); yych = *++YYCURSOR; @@ -23889,7 +23892,7 @@ yy1499: } yy1500: YYDEBUG(1500, *YYCURSOR); -#line 1014 "ext/date/lib/parse_date.re" +#line 1017 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("now"); TIMELIB_INIT; @@ -23897,7 +23900,7 @@ yy1500: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 23901 "ext/date/lib/parse_date.c" +#line 23904 "ext/date/lib/parse_date.c" yy1501: YYDEBUG(1501, *YYCURSOR); yych = *++YYCURSOR; @@ -24036,7 +24039,7 @@ yy1507: } yy1508: YYDEBUG(1508, *YYCURSOR); -#line 1023 "ext/date/lib/parse_date.re" +#line 1026 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("noon"); TIMELIB_INIT; @@ -24047,7 +24050,7 @@ yy1508: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 24051 "ext/date/lib/parse_date.c" +#line 24054 "ext/date/lib/parse_date.c" yy1509: YYDEBUG(1509, *YYCURSOR); yyaccept = 0; @@ -24580,7 +24583,7 @@ yy1530: ++YYCURSOR; yy1531: YYDEBUG(1531, *YYCURSOR); -#line 1002 "ext/date/lib/parse_date.re" +#line 1005 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("yesterday"); TIMELIB_INIT; @@ -24591,7 +24594,7 @@ yy1531: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 24595 "ext/date/lib/parse_date.c" +#line 24598 "ext/date/lib/parse_date.c" yy1532: YYDEBUG(1532, *YYCURSOR); yyaccept = 0; @@ -24764,7 +24767,7 @@ yy1537: goto yy1531; } } -#line 1775 "ext/date/lib/parse_date.re" +#line 1778 "ext/date/lib/parse_date.re" } diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index 1fbd670592..74a7033608 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -401,9 +401,12 @@ static timelib_sll timelib_meridian_with_check(char **ptr, timelib_sll h) { timelib_sll retval = 0; - while (!strchr("AaPp", **ptr)) { + while (**ptr && !strchr("AaPp", **ptr)) { ++*ptr; } + if(!**ptr) { + return TIMELIB_UNSET; + } if (**ptr == 'a' || **ptr == 'A') { if (h == 12) { retval = -12; diff --git a/ext/date/lib/parse_iso_intervals.c b/ext/date/lib/parse_iso_intervals.c index 07c5b76384..ca15b67201 100644 --- a/ext/date/lib/parse_iso_intervals.c +++ b/ext/date/lib/parse_iso_intervals.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Mon Dec 5 22:02:31 2011 */ +/* Generated by re2c 0.13.5 on Fri Jul 18 16:11:41 2014 */ #line 1 "ext/date/lib/parse_iso_intervals.re" /* +----------------------------------------------------------------------+ diff --git a/ext/date/tests/bug67253.phpt b/ext/date/tests/bug67253.phpt new file mode 100644 index 0000000000..b28cbe63c1 --- /dev/null +++ b/ext/date/tests/bug67253.phpt @@ -0,0 +1,44 @@ +--TEST-- +Bug #67253 (timelib_meridian_with_check out-of-bounds read) +--INI-- +date.timezone=Europe/Berlin +--FILE-- +<?php +$z = ''; +var_dump(date_parse_from_format("aHa0", "0=G{$z}9UCNnF")); +--EXPECT-- +array(12) { + ["year"]=> + bool(false) + ["month"]=> + bool(false) + ["day"]=> + bool(false) + ["hour"]=> + int(0) + ["minute"]=> + int(0) + ["second"]=> + int(0) + ["fraction"]=> + bool(false) + ["warning_count"]=> + int(0) + ["warnings"]=> + array(0) { + } + ["error_count"]=> + int(3) + ["errors"]=> + array(3) { + [0]=> + string(51) "Meridian can only come after an hour has been found" + [1]=> + string(29) "A meridian could not be found" + [9]=> + string(12) "Data missing" + } + ["is_localtime"]=> + bool(false) +} + |