summaryrefslogtreecommitdiff
path: root/src/lib/pgsql
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/pgsql')
-rw-r--r--src/lib/pgsql/pgsql_exchange.cc12
-rw-r--r--src/lib/pgsql/tests/pgsql_exchange_unittest.cc5
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);