Skip to content

Commit 9de593a

Browse files
fix[sqlx-postgres]: do a checked_mul to prevent panic when casting from db (#3919)
1 parent 29549b1 commit 9de593a

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

sqlx-postgres/src/types/rust_decimal.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ impl TryFrom<&'_ PgNumeric> for Decimal {
6262
.checked_powi(weight as i64)
6363
.ok_or("value not representable as rust_decimal::Decimal")?;
6464

65-
let part = Decimal::from(digit) * mul;
65+
let part = Decimal::from(digit)
66+
.checked_mul(mul)
67+
.ok_or("value not representable as rust_decimal::Decimal")?;
6668

6769
value = value
6870
.checked_add(part)
@@ -383,6 +385,19 @@ mod tests {
383385
assert_eq!(actual_decimal.scale(), 0);
384386
}
385387

388+
#[test]
389+
fn mult_overflow() {
390+
// -24_0711_6702_1036_7100_2022_8579_3280.00
391+
let large_negative_number = PgNumeric::Number {
392+
sign: PgNumericSign::Negative,
393+
scale: 0,
394+
weight: 7,
395+
digits: vec![24, 0711, 6702, 1036, 7100, 2022, 8579, 3280],
396+
};
397+
398+
assert!(Decimal::try_from(large_negative_number).is_err());
399+
}
400+
386401
#[test]
387402
fn max_value_max_scale() {
388403
let mut max_value_max_scale = Decimal::MAX;

0 commit comments

Comments
 (0)