From b113fa2d10df8005c32dbc1e1d421196f5133383 Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Mon, 4 Sep 2023 21:11:11 +0300 Subject: [PATCH] Fix read_varint() implementation It was giving wrong results when reading a database file. --- core/sqlite3_ondisk.rs | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/core/sqlite3_ondisk.rs b/core/sqlite3_ondisk.rs index 05096f0de..745158a3f 100644 --- a/core/sqlite3_ondisk.rs +++ b/core/sqlite3_ondisk.rs @@ -311,17 +311,14 @@ pub fn read_value(buf: &[u8], serial_type: SerialType) -> Result<(Value, usize)> } fn read_varint(buf: &[u8]) -> (u64, usize) { - let mut value = 0; - let mut shift = 0; - let mut i = 0; - loop { - let byte = buf[i]; - value |= ((byte & 0x7f) as u64) << shift; - if byte & 0x80 == 0 { - break; + let mut v: u64 = 0; + for i in 0..8 { + let c = buf[i]; + v = (v << 7) + (c & 0x7f) as u64; + if (c & 0x80) == 0 { + return (v, i + 1); } - shift += 7; - i += 1; } - (value, i + 1) -} + v = (v << 8) + buf[8] as u64; + (v, 9) +} \ No newline at end of file