Skip to content

Commit d6b9e49

Browse files
committed
harden segment header
1 parent 4de86da commit d6b9e49

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

libsql-wal/src/segment/current.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ impl<F> CurrentSegment<F> {
5858
index_size: 0.into(),
5959
header_cheksum: 0.into(),
6060
flags: 0.into(),
61+
magic: LIBSQL_MAGIC.into(),
62+
version: 1.into(),
6163
};
6264

6365
header.recompute_checksum();

libsql-wal/src/segment/mod.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ bitflags::bitflags! {
3939
#[repr(C)]
4040
#[derive(Debug, zerocopy::AsBytes, zerocopy::FromBytes, zerocopy::FromZeroes, Clone, Copy)]
4141
pub struct SegmentHeader {
42+
/// Set to LIBSQL_MAGIC
43+
pub magic: U64,
44+
/// header version
45+
pub version: U16,
4246
pub start_frame_no: U64,
4347
pub last_commited_frame_no: U64,
4448
/// size of the database in pages, after applying the segment.
@@ -64,8 +68,16 @@ impl SegmentHeader {
6468
}
6569

6670
fn check(&self) -> Result<()> {
67-
let computed = self.checksum();
68-
if computed == self.header_cheksum.get() {
71+
if self.magic.get() != LIBSQL_MAGIC {
72+
return Err(Error::InvalidHeaderChecksum);
73+
}
74+
75+
if self.version.get() != 1 {
76+
return Err(Error::InvalidHeaderVersion);
77+
}
78+
79+
let computed = dbg!(self.checksum());
80+
if computed == dbg!(self.header_cheksum.get()) {
6981
return Ok(());
7082
} else {
7183
return Err(Error::InvalidHeaderChecksum);

0 commit comments

Comments
 (0)