Michael Semb Wever created CASSANDRA-21621:
----------------------------------------------
Summary: A date built from a timestamp is not range checked
Key: CASSANDRA-21621
URL: https://issues.apache.org/jira/browse/CASSANDRA-21621
Project: Apache Cassandra
Issue Type: Bug
Components: CQL/Semantics
Reporter: Michael Semb Wever
{{SimpleDateSerializer.dateStringToDays}} rejects a date string outside the
range the {{date}} type can hold, but
{{SimpleDateSerializer.timeInMillisToDay}} applies no range test:
{code:java}
public static int timeInMillisToDay(long millis)
{
return (int) (Duration.ofMillis(millis).toDays() - Integer.MIN_VALUE);
}
{code}
A day count is a signed 32-bit value shifted by {{Integer.MIN_VALUE}}, so a
timestamp further from the epoch than 2^31 days wraps and yields a date that
bears no relation to the input. {{timeInMillisToDay(Long.MAX_VALUE)}} returns a
day count near the year 1970.
{{SimpleDateType.fromTimeInMillis}} reaches that method, and {{TimeFcts}}
exposes it through {{toDate(timestamp)}} and through the date arithmetic of
{{TemporalType.addDuration}} and {{TemporalType.substractFrom}}. A query can
therefore build a wrong date with no error. The severity is Low because a
timestamp that far from the epoch is rare, and the whole {{timestamp}} range
beyond 2^31 days lies more than five million years from now.
The patch moves both range tests into {{timeInMillisToDay}}, and lets
{{dateStringToDays}} reach them through a private overload that keeps the
source string in the message, so the message a date string produces does not
change.
{{MaskingFunctionTester}} used {{timeInMillisToDay(Long.MAX_VALUE)}} as its
maximum {{date}} value, which is the wrap itself, so it now names the maximum
date the type supports.
Patch:
[mck/upstream/date-millis-range/5.0|https://github.com/thelastpickle/cassandra/tree/mck/upstream/date-millis-range/5.0]
Provenance:
[1032ba3047|https://github.com/datastax/cassandra/commit/1032ba30474d16f4b7309be48c0ab69c3ec34e56]
by Jakub Zytka and Ulises Cervino Beresi. That commit carries the same range
test; this patch keeps the existing message format and adapts the one upstream
test that relied on the wrap.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]