Skip to content

Commit 6d017f3

Browse files
committed
math.big: fix 1/115792089237316195423570985008687907853269984665640564039457584007908834671663 leading to panic (fix #23771)
1 parent c5b26c4 commit 6d017f3

File tree

2 files changed

+9
-7
lines changed

2 files changed

+9
-7
lines changed

vlib/math/big/big_test.v

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ const sub_test_data = [
194194
SubTest{ 2, 100, -98},
195195
SubTest{ -100, -2, -98},
196196
SubTest{ 100, -2, 102},
197-
SubTest{ 2, -100, 102},
197+
SubTest{ 2, -100, 102},
198198
//
199199
SubTest{ 2, 3, -1 },
200200
SubTest{ 3, 2, 1 },
@@ -218,10 +218,10 @@ struct MulTest {
218218
// vfmt off
219219
const mul_test_data = [
220220
MulTest{ 2, 3, 6 },
221-
MulTest{ -2, 0, 0},
222-
MulTest{ 2, 0, 0},
223-
MulTest{ 0, -2, 0},
224-
MulTest{ 0, -2, 0},
221+
MulTest{ -2, 0, 0},
222+
MulTest{ 2, 0, 0},
223+
MulTest{ 0, -2, 0},
224+
MulTest{ 0, -2, 0},
225225
MulTest{ -869, 789, -685641 },
226226
MulTest{ 869, -789, -685641 },
227227
MulTest{ -869, -789, 685641 },
@@ -264,6 +264,7 @@ const div_mod_test_data = [
264264
'629648864382619361826',
265265
'2724578611525334851445652767465274410979805962941953382558409365935061481311529445551691298696266856092833571769883246719',
266266
},
267+
DivModTest{'1', '115792089237316195423570985008687907853269984665640564039457584007908834671663', '0', '1'},
267268
]
268269
// vfmt on
269270

vlib/math/big/integer.v

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ pub fn integer_from_bytes(oinput []u8, config IntegerConfig) Integer {
144144
}
145145
input := oinput[first_non_zero_index..]
146146
// pad input
147-
mut padded_input := []u8{len: ((input.len + 3) & ~0x3) - input.len, cap: (input.len + 3) & ~0x3}
147+
mut padded_input := []u8{len: int_max(0, ((input.len + 3) & ~0x3) - input.len), cap: (
148+
input.len + 3) & ~0x3}
148149
padded_input << input
149150
mut digits := []u32{len: padded_input.len / 4}
150151
// combine every 4 bytes into a u32 and insert into n.digits
@@ -421,7 +422,7 @@ fn (dividend Integer) div_mod_internal(divisor Integer) (Integer, Integer) {
421422
}
422423
}
423424
// Division for positive integers
424-
mut q := []u32{cap: dividend.digits.len - divisor.digits.len + 1}
425+
mut q := []u32{cap: int_max(1, dividend.digits.len - divisor.digits.len + 1)}
425426
mut r := []u32{cap: dividend.digits.len}
426427
divide_digit_array(dividend.digits, divisor.digits, mut q, mut r)
427428
quotient := Integer{

0 commit comments

Comments
 (0)