Skip to content

Commit 09bf7de

Browse files
committed
fix: replace unsafe arithmetic chains with explicit early-return bounds checks
nodedb-vector/src/mmap_segment.rs: rewrite the mmap offset bounds check from a single nested checked_add/checked_mul expression into sequential early-returns via let-else. Each overflow or out-of-bounds condition is now its own guard, making the failure paths obvious. nodedb-wal/src/crypto.rs: replace .clone() calls on Copy epoch values in tests with copy-dereference to avoid unnecessary clone on a type that implements Copy.
1 parent d8987d3 commit 09bf7de

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

nodedb-vector/src/mmap_segment.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,18 @@ impl MmapVectorSegment {
171171
Some(v) => v,
172172
None => return,
173173
};
174-
let offset = match self
175-
.data_offset
176-
.checked_add(idx.checked_mul(byte_len).unwrap_or(usize::MAX))
177-
{
178-
Some(v) if v.checked_add(byte_len).is_some_and(|e| e <= self.mmap_size) => v,
179-
_ => return,
174+
let Some(idx_bytes) = idx.checked_mul(byte_len) else {
175+
return;
176+
};
177+
let Some(offset) = self.data_offset.checked_add(idx_bytes) else {
178+
return;
180179
};
180+
if offset
181+
.checked_add(byte_len)
182+
.is_none_or(|e| e > self.mmap_size)
183+
{
184+
return;
185+
}
181186
let page_start = offset & !(4095);
182187
let len = (byte_len + 4095) & !(4095);
183188
unsafe {

nodedb-wal/src/crypto.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ mod tests {
227227
#[test]
228228
fn encrypt_decrypt_roundtrip() {
229229
let key = test_key();
230-
let epoch = key.epoch().clone();
230+
let epoch = *key.epoch();
231231
let header = test_header(1);
232232
let plaintext = b"hello nodedb encryption";
233233

@@ -242,7 +242,7 @@ mod tests {
242242
#[test]
243243
fn wrong_key_fails() {
244244
let key1 = WalEncryptionKey::from_bytes(&[0x01; 32]);
245-
let epoch1 = key1.epoch().clone();
245+
let epoch1 = *key1.epoch();
246246
let key2 = WalEncryptionKey::from_bytes(&[0x02; 32]);
247247
let header = test_header(1);
248248

@@ -253,7 +253,7 @@ mod tests {
253253
#[test]
254254
fn wrong_lsn_fails() {
255255
let key = test_key();
256-
let epoch = key.epoch().clone();
256+
let epoch = *key.epoch();
257257
let header = test_header(1);
258258

259259
let ciphertext = key.encrypt(1, &header, b"secret").unwrap();
@@ -264,7 +264,7 @@ mod tests {
264264
#[test]
265265
fn tampered_ciphertext_fails() {
266266
let key = test_key();
267-
let epoch = key.epoch().clone();
267+
let epoch = *key.epoch();
268268
let header = test_header(1);
269269

270270
let mut ciphertext = key.encrypt(1, &header, b"secret").unwrap();
@@ -275,7 +275,7 @@ mod tests {
275275
#[test]
276276
fn tampered_header_fails() {
277277
let key = test_key();
278-
let epoch = key.epoch().clone();
278+
let epoch = *key.epoch();
279279
let header1 = test_header(1);
280280

281281
let ciphertext = key.encrypt(1, &header1, b"secret").unwrap();
@@ -289,7 +289,7 @@ mod tests {
289289
#[test]
290290
fn empty_payload() {
291291
let key = test_key();
292-
let epoch = key.epoch().clone();
292+
let epoch = *key.epoch();
293293
let header = test_header(1);
294294

295295
let ciphertext = key.encrypt(1, &header, b"").unwrap();

0 commit comments

Comments
 (0)