From: Francis Dupont Date: Wed, 31 Aug 2022 13:36:21 +0000 (+0200) Subject: [#2532] Fixed 2038 vs postgreSQL issue X-Git-Tag: Kea-2.3.1~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0b3efadffaa69cd823de6d95f5263e3b67e41778;p=thirdparty%2Fkea.git [#2532] Fixed 2038 vs postgreSQL issue --- diff --git a/src/lib/pgsql/pgsql_exchange.cc b/src/lib/pgsql/pgsql_exchange.cc index a646c46fb1..d203714108 100644 --- a/src/lib/pgsql/pgsql_exchange.cc +++ b/src/lib/pgsql/pgsql_exchange.cc @@ -239,11 +239,17 @@ PsqlBindArray::addTimestamp(const boost::posix_time::ptime& timestamp) { // Sadly boost::posix_time::to_time_t() was not added until 1.58, // so do it ourselves. ptime epoch(boost::gregorian::date(1970, 1, 1)); + if (timestamp < epoch) { + isc_throw(isc::BadValue, "Time value is before the epoch"); + } + ptime max_db_time = boost::posix_time::from_time_t(DatabaseConnection::MAX_DB_TIME); time_duration::sec_type since_epoch = (timestamp - epoch).total_seconds(); time_t input_time(since_epoch); - - if (input_time > DatabaseConnection::MAX_DB_TIME) { - isc_throw(isc::BadValue, "Time value is too large: " << input_time); + if (timestamp > max_db_time) { + isc_throw(isc::BadValue, "Time value is too large: " << + (input_time < 0 ? + static_cast(static_cast(input_time)) : + input_time)); } // Converts to timestamp to local date/time string. diff --git a/src/lib/pgsql/tests/pgsql_exchange_unittest.cc b/src/lib/pgsql/tests/pgsql_exchange_unittest.cc index fe5dfddfff..7bbf747d8f 100644 --- a/src/lib/pgsql/tests/pgsql_exchange_unittest.cc +++ b/src/lib/pgsql/tests/pgsql_exchange_unittest.cc @@ -977,6 +977,11 @@ TEST_F(PgSqlBasicsTest, ptimeTimestamp) { // Create an empty array. PsqlBindArrayPtr bind_array(new PsqlBindArray()); + // Make sure we catch values before the epoch. + ptime christmas1969(date(1969, Dec, 25)); + ASSERT_THROW_MSG(bind_array->addTimestamp(christmas1969), BadValue, + "Time value is before the epoch"); + // Make sure we catch values that are too big. time_duration duration = hours(10) + minutes(14) + seconds(15); ptime day_too_far(date(2038, Jan, 21), duration);