diff -up shadow-4.1.5.1/libmisc/getdate.c.date-parsing shadow-4.1.5.1/libmisc/getdate.c --- shadow-4.1.5.1/libmisc/getdate.c.date-parsing 2008-06-14 00:07:51.000000000 +0200 +++ shadow-4.1.5.1/libmisc/getdate.c 2014-08-29 13:41:22.553267506 +0200 @@ -261,6 +261,7 @@ static int yyHaveDay; static int yyHaveRel; static int yyHaveTime; static int yyHaveZone; +static int yyHaveYear; static int yyTimezone; static int yyDay; static int yyHour; @@ -1730,6 +1731,7 @@ yyreduce: yyDay = (yyvsp[(3) - (5)].Number); yyYear = (yyvsp[(5) - (5)].Number); } + yyHaveYear++; } break; @@ -1740,6 +1742,7 @@ yyreduce: yyYear = (yyvsp[(1) - (3)].Number); yyMonth = -(yyvsp[(2) - (3)].Number); yyDay = -(yyvsp[(3) - (3)].Number); + yyHaveYear++; } break; @@ -1750,6 +1753,7 @@ yyreduce: yyDay = (yyvsp[(1) - (3)].Number); yyMonth = (yyvsp[(2) - (3)].Number); yyYear = -(yyvsp[(3) - (3)].Number); + yyHaveYear++; } break; @@ -1767,6 +1771,7 @@ yyreduce: yyMonth = (yyvsp[(1) - (4)].Number); yyDay = (yyvsp[(2) - (4)].Number); yyYear = (yyvsp[(4) - (4)].Number); + yyHaveYear++; } break; @@ -1784,6 +1789,7 @@ yyreduce: yyMonth = (yyvsp[(2) - (3)].Number); yyDay = (yyvsp[(1) - (3)].Number); yyYear = (yyvsp[(3) - (3)].Number); + yyHaveYear++; } break; @@ -1928,7 +1934,8 @@ yyreduce: case 49: #line 397 "getdate.y" { - if ((yyHaveTime != 0) && (yyHaveDate != 0) && (yyHaveRel == 0)) + if ((yyHaveTime != 0 || (yyvsp[(1) - (1)].Number) >= 100) && !yyHaveYear + && (yyHaveDate != 0) && (yyHaveRel == 0)) yyYear = (yyvsp[(1) - (1)].Number); else { @@ -2556,7 +2563,7 @@ yylex (void) return LookupWord (buff); } if (c != '(') - return *yyInput++; + return (unsigned char)*yyInput++; Count = 0; do { diff -up shadow-4.1.5.1/libmisc/getdate.y.date-parsing shadow-4.1.5.1/libmisc/getdate.y --- shadow-4.1.5.1/libmisc/getdate.y.date-parsing 2008-05-26 10:57:51.000000000 +0200 +++ shadow-4.1.5.1/libmisc/getdate.y 2014-08-29 13:40:37.502229879 +0200 @@ -152,6 +152,7 @@ static int yyHaveDay; static int yyHaveRel; static int yyHaveTime; static int yyHaveZone; +static int yyHaveYear; static int yyTimezone; static int yyDay; static int yyHour; @@ -293,18 +294,21 @@ date : tUNUMBER '/' tUNUMBER { yyDay = $3; yyYear = $5; } + yyHaveYear++; } | tUNUMBER tSNUMBER tSNUMBER { /* ISO 8601 format. yyyy-mm-dd. */ yyYear = $1; yyMonth = -$2; yyDay = -$3; + yyHaveYear++; } | tUNUMBER tMONTH tSNUMBER { /* e.g. 17-JUN-1992. */ yyDay = $1; yyMonth = $2; yyYear = -$3; + yyHaveYear++; } | tMONTH tUNUMBER { yyMonth = $1; @@ -314,6 +318,7 @@ date : tUNUMBER '/' tUNUMBER { yyMonth = $1; yyDay = $2; yyYear = $4; + yyHaveYear++; } | tUNUMBER tMONTH { yyMonth = $2; @@ -323,6 +328,7 @@ date : tUNUMBER '/' tUNUMBER { yyMonth = $2; yyDay = $1; yyYear = $3; + yyHaveYear++; } ; @@ -395,7 +401,8 @@ relunit : tUNUMBER tYEAR_UNIT { number : tUNUMBER { - if ((yyHaveTime != 0) && (yyHaveDate != 0) && (yyHaveRel == 0)) + if ((yyHaveTime != 0 || $1 >= 100) && !yyHaveYear + && (yyHaveDate != 0) && (yyHaveRel == 0)) yyYear = $1; else { @@ -802,7 +809,7 @@ yylex (void) return LookupWord (buff); } if (c != '(') - return *yyInput++; + return (unsigned char)*yyInput++; Count = 0; do {