diff options
Diffstat (limited to 'src/lib/pgsql')
| -rw-r--r-- | src/lib/pgsql/pgsql_exchange.cc | 12 | ||||
| -rw-r--r-- | src/lib/pgsql/tests/pgsql_exchange_unittest.cc | 5 |
2 files changed, 14 insertions, 3 deletions
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<int64_t>(static_cast<uint32_t>(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); |
