Use saturating addition for ephemeral timers

Integer overflows crash the application by default.

On a first sight this is only a potential crash that can't be
triggered, because timestamps are stored as i64 and ephemeral timer
duration is u32.
This commit is contained in:
link2xt
2021-09-10 22:49:48 +00:00
parent 15dcd62652
commit 6f3dd7f0c2
3 changed files with 5 additions and 3 deletions

View File

@@ -1222,7 +1222,7 @@ impl Chat {
}; };
let ephemeral_timestamp = match ephemeral_timer { let ephemeral_timestamp = match ephemeral_timer {
EphemeralTimer::Disabled => 0, EphemeralTimer::Disabled => 0,
EphemeralTimer::Enabled { duration } => time() + i64::from(duration), EphemeralTimer::Enabled { duration } => time().saturating_add(duration.into()),
}; };
let new_mime_headers = if msg.has_html() { let new_mime_headers = if msg.has_html() {

View File

@@ -1046,7 +1046,9 @@ INSERT INTO msgs
} else { } else {
match ephemeral_timer { match ephemeral_timer {
EphemeralTimer::Disabled => 0, EphemeralTimer::Disabled => 0,
EphemeralTimer::Enabled { duration } => rcvd_timestamp + i64::from(duration), EphemeralTimer::Enabled { duration } => {
rcvd_timestamp.saturating_add(duration.into())
}
} }
}; };

View File

@@ -279,7 +279,7 @@ impl MsgId {
/// Starts ephemeral message timer for the message if it is not started yet. /// Starts ephemeral message timer for the message if it is not started yet.
pub(crate) async fn start_ephemeral_timer(self, context: &Context) -> anyhow::Result<()> { pub(crate) async fn start_ephemeral_timer(self, context: &Context) -> anyhow::Result<()> {
if let Timer::Enabled { duration } = self.ephemeral_timer(context).await? { if let Timer::Enabled { duration } = self.ephemeral_timer(context).await? {
let ephemeral_timestamp = time() + i64::from(duration); let ephemeral_timestamp = time().saturating_add(duration.into());
context context
.sql .sql