mirror of
https://github.com/Gnucash/gnucash.git
synced 2026-09-03 20:53:02 -05:00
Prevent leaking exceptions from gnc_dmy2timespec_neutral
And test out-of-range values in other functions for good measure.
This commit is contained in:
@@ -1248,14 +1248,29 @@ gnc_dmy2timespec_neutral (int day, int month, int year)
|
||||
date.tm_min = 59;
|
||||
date.tm_sec = 0;
|
||||
|
||||
GncDateTime gncdt(date);
|
||||
auto offset = gncdt.offset() / 3600;
|
||||
if (offset < -11)
|
||||
date.tm_hour = -offset;
|
||||
if (offset > 13)
|
||||
date.tm_hour = 23 - offset;
|
||||
try
|
||||
{
|
||||
GncDateTime gncdt(date);
|
||||
auto offset = gncdt.offset() / 3600;
|
||||
if (offset < -11)
|
||||
date.tm_hour = -offset;
|
||||
if (offset > 13)
|
||||
date.tm_hour = 23 - offset;
|
||||
|
||||
return {gnc_timegm(&date), 0};
|
||||
return {gnc_timegm(&date), 0};
|
||||
}
|
||||
catch(const std::logic_error& err)
|
||||
{
|
||||
PWARN("Date computation error from Y-M-D %d-%d-%d: %s",
|
||||
year, month, day, err.what());
|
||||
return {INT64_MAX, 0};
|
||||
}
|
||||
catch(const std::runtime_error& err)
|
||||
{
|
||||
PWARN("Date computation error from Y-M-D %d-%d-%d: %s",
|
||||
year, month, day, err.what());
|
||||
return {INT64_MAX, 0};
|
||||
}
|
||||
}
|
||||
/********************************************************************\
|
||||
\********************************************************************/
|
||||
|
||||
@@ -110,7 +110,7 @@ typedef struct
|
||||
|
||||
typedef struct
|
||||
{
|
||||
TimeMap test[4];
|
||||
TimeMap test[8];
|
||||
} FixtureB;
|
||||
|
||||
static void
|
||||
@@ -120,6 +120,10 @@ setup_begin(FixtureB *f, gconstpointer pData)
|
||||
f->test[1] = (TimeMap){1918, 3, 31, INT64_C(-1633305600)};
|
||||
f->test[2] = (TimeMap){1918, 4, 1, INT64_C(-1633219200)};
|
||||
f->test[3] = (TimeMap){2057, 11, 20, INT64_C(2773440000)};
|
||||
f->test[4] = (TimeMap){1257, 07, 02, INT64_C(21695385600)}; /*invalid year*/
|
||||
f->test[5] = (TimeMap){2017, 02, 29, INT64_C(1488326400)}; /*invalid day*/
|
||||
f->test[6] = (TimeMap){2017, 02, 33, INT64_C(1488672000)}; /*invalid day*/
|
||||
f->test[7] = (TimeMap){2017, 13, 29, INT64_C(1517184000)}; /*invalid month*/
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -129,6 +133,10 @@ setup_neutral(FixtureB *f, gconstpointer pData)
|
||||
f->test[1] = (TimeMap){1918, 3, 31, INT64_C(-1633266060)};
|
||||
f->test[2] = (TimeMap){1918, 4, 1, INT64_C(-1633179660)};
|
||||
f->test[3] = (TimeMap){2057, 11, 20, INT64_C(2773479540)};
|
||||
f->test[4] = (TimeMap){1257, 07, 02, INT64_MAX};
|
||||
f->test[5] = (TimeMap){2017, 02, 29, INT64_MAX};
|
||||
f->test[6] = (TimeMap){2017, 02, 33, INT64_MAX};
|
||||
f->test[7] = (TimeMap){2017, 13, 29, INT64_MAX};
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -138,6 +146,10 @@ setup_end(FixtureB *f, gconstpointer pData)
|
||||
f->test[1] = (TimeMap){1918, 3, 31, INT64_C(-1633219201)};
|
||||
f->test[2] = (TimeMap){1918, 4, 1, INT64_C(-1633132801)};
|
||||
f->test[3] = (TimeMap){2057, 11, 20, INT64_C(2773526399)};
|
||||
f->test[4] = (TimeMap){1257, 07, 02, INT64_C(21695471999)};
|
||||
f->test[5] = (TimeMap){2017, 02, 29, INT64_C(1488412799)};
|
||||
f->test[6] = (TimeMap){2017, 02, 33, INT64_C(1488758399)};
|
||||
f->test[7] = (TimeMap){2017, 13, 29, INT64_C(1517270399)};
|
||||
}
|
||||
|
||||
void test_suite_gnc_date ( void );
|
||||
|
||||
Reference in New Issue
Block a user