From 7081d2c6576ab2cd893163901c629299349c2261 Mon Sep 17 00:00:00 2001 From: Daniel Lehman Date: Wed, 18 Apr 2012 13:01:56 -0700 Subject: [PATCH] oleaut32: treat years 0 to 29 as 2000 to 2029 in VARIANT_RollUdate --- dlls/oleaut32/tests/vartest.c | 5 ++++- dlls/oleaut32/variant.c | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c index a79481a..770ea5f 100644 --- a/dlls/oleaut32/tests/vartest.c +++ b/dlls/oleaut32/tests/vartest.c @@ -1742,7 +1742,10 @@ static void test_SystemTimeToVariantTime(void) ST2DT(2,1,1980,0,0,0,0,TRUE,29222.0); ST2DT(0,1,1980,0,0,0,0,TRUE,29220.0); /* Rolls back to 31 Dec 1899 */ ST2DT(1,13,1980,0,0,0,0,FALSE,29587.0); /* Fails on invalid month */ - ST2DT(31,12,90,0,0,0,0,TRUE,33238.0); /* year < 100 is 1900+year! */ + ST2DT(31,12,90,0,0,0,0,TRUE,33238.0); /* 30 <= year < 100 is 1900+year */ + ST2DT(1,1,30,0,0,0,0,TRUE,10959.0); /* 30 <= year < 100 is 1900+year */ + ST2DT(1,1,29,0,0,0,0,TRUE,47119.0); /* 0 <= year < 30 is 2000+year */ + ST2DT(1,1,0,0,0,0,0,TRUE,36526.0); /* 0 <= year < 30 is 2000+year */ } static void test_dt2st(int line, double dt, INT r, WORD d, WORD m, WORD y, diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index 0d1f2cc..2d6e2ce 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -1143,8 +1143,11 @@ static HRESULT VARIANT_RollUdate(UDATE *lpUd) if (iYear > 9999 || iYear < -9999) return E_INVALIDARG; /* Invalid value */ - /* Years < 100 are treated as 1900 + year */ - if (iYear > 0 && iYear < 100) + /* Year 0 to 29 are treated as 2000 + year */ + if (iYear >= 0 && iYear < 30) + iYear += 2000; + /* Remaining years < 100 are treated as 1900 + year */ + else if (iYear >= 30 && iYear < 100) iYear += 1900; iMinute += iSecond / 60; -- 1.6.0.4