Skip to content

Commit 56e6ebc

Browse files
committed
Revert "stone: Decode unknown variants"
This reverts commit 235a552.
1 parent 235a552 commit 56e6ebc

File tree

9 files changed

+90
-132
lines changed

9 files changed

+90
-132
lines changed

crates/stone/src/header/v1.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ const INTEGRITY_CHECK: [u8; 21] = [0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5,
1111
///
1212
/// Some types are now legacy as we're going to use Ion to define them.
1313
///
14-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1514
#[repr(u8)]
15+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1616
pub enum FileType {
1717
/// Binary package
1818
Binary = 1,
@@ -25,8 +25,6 @@ pub enum FileType {
2525

2626
/// (Legacy) build manifest
2727
BuildManifest,
28-
29-
Unknown = 255,
3028
}
3129

3230
/// Header for the v1 format version
@@ -51,7 +49,7 @@ impl Header {
5149
2 => FileType::Delta,
5250
3 => FileType::Repository,
5351
4 => FileType::BuildManifest,
54-
_ => FileType::Unknown,
52+
f => return Err(DecodeError::UnknownFileType(f)),
5553
};
5654

5755
Ok(Self {
@@ -78,4 +76,6 @@ impl Header {
7876
pub enum DecodeError {
7977
#[error("Corrupt header, failed integrity check")]
8078
Corrupt,
79+
#[error("Unknown file type: {0}")]
80+
UnknownFileType(u8),
8181
}

crates/stone/src/payload/layout.rs

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use crate::{ReadExt, WriteExt};
1111

1212
/// Layout entries record their target file type so they can be rebuilt on
1313
/// the target installation.
14-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1514
#[repr(u8)]
15+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1616
pub enum FileType {
1717
/// Regular file
1818
Regular = 1,
@@ -34,8 +34,6 @@ pub enum FileType {
3434

3535
/// UNIX Socket
3636
Socket,
37-
38-
Unknown = 255,
3937
}
4038

4139
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -49,8 +47,6 @@ pub enum Entry {
4947
BlockDevice(AStr),
5048
Fifo(AStr),
5149
Socket(AStr),
52-
53-
Unknown(AStr, AStr),
5450
}
5551

5652
impl Entry {
@@ -63,20 +59,18 @@ impl Entry {
6359
Entry::BlockDevice(_) => vec![],
6460
Entry::Fifo(_) => vec![],
6561
Entry::Socket(_) => vec![],
66-
Entry::Unknown(source, _) => source.as_bytes().to_vec(),
6762
}
6863
}
6964

7065
pub fn target(&self) -> &str {
7166
match self {
72-
Entry::Regular(_, target)
73-
| Entry::Symlink(_, target)
74-
| Entry::Directory(target)
75-
| Entry::CharacterDevice(target)
76-
| Entry::BlockDevice(target)
77-
| Entry::Fifo(target)
78-
| Entry::Socket(target)
79-
| Entry::Unknown(_, target) => target,
67+
Entry::Regular(_, target) => target,
68+
Entry::Symlink(_, target) => target,
69+
Entry::Directory(target) => target,
70+
Entry::CharacterDevice(target) => target,
71+
Entry::BlockDevice(target) => target,
72+
Entry::Fifo(target) => target,
73+
Entry::Socket(target) => target,
8074
}
8175
}
8276

@@ -89,7 +83,6 @@ impl Entry {
8983
Entry::BlockDevice(_) => 5,
9084
Entry::Fifo(_) => 6,
9185
Entry::Socket(_) => 7,
92-
Entry::Unknown(..) => 255,
9386
}
9487
}
9588
}
@@ -125,13 +118,14 @@ impl Record for Layout {
125118
5 => FileType::BlockDevice,
126119
6 => FileType::Fifo,
127120
7 => FileType::Socket,
128-
_ => FileType::Unknown,
121+
t => return Err(DecodeError::UnknownFileType(t)),
129122
};
130123

131124
let _padding = reader.read_array::<11>()?;
132125

133126
// Make the layout entry *usable*
134127
let entry = match file_type {
128+
// BUG: boulder stores xxh128 as le bytes not be
135129
FileType::Regular => {
136130
let source = reader.read_vec(source_length as usize)?;
137131
let hash = u128::from_be_bytes(source.try_into().unwrap());
@@ -142,16 +136,12 @@ impl Record for Layout {
142136
sanitize(&reader.read_string(target_length as u64)?).into(),
143137
),
144138
FileType::Directory => Entry::Directory(sanitize(&reader.read_string(target_length as u64)?).into()),
145-
FileType::CharacterDevice => {
146-
Entry::CharacterDevice(sanitize(&reader.read_string(target_length as u64)?).into())
139+
_ => {
140+
if source_length > 0 {
141+
let _ = reader.read_vec(source_length as usize);
142+
}
143+
unreachable!()
147144
}
148-
FileType::BlockDevice => Entry::BlockDevice(sanitize(&reader.read_string(target_length as u64)?).into()),
149-
FileType::Fifo => Entry::Fifo(sanitize(&reader.read_string(target_length as u64)?).into()),
150-
FileType::Socket => Entry::Socket(sanitize(&reader.read_string(target_length as u64)?).into()),
151-
FileType::Unknown => Entry::Unknown(
152-
sanitize(&reader.read_string(source_length as u64)?).into(),
153-
sanitize(&reader.read_string(target_length as u64)?).into(),
154-
),
155145
};
156146

157147
Ok(Self {

crates/stone/src/payload/meta.rs

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ pub struct Meta {
1717
pub kind: Kind,
1818
}
1919

20+
#[repr(u8)]
2021
#[derive(Debug, Clone, Copy, PartialEq, Eq, strum::Display)]
2122
#[strum(serialize_all = "lowercase")]
22-
#[repr(u8)]
2323
pub enum Dependency {
2424
/// Just the plain name of a package
2525
#[strum(serialize = "name")]
@@ -50,10 +50,9 @@ pub enum Dependency {
5050

5151
/// An emul32-compatible pkgconfig .pc dependency (lib32/*.pc)
5252
PkgConfig32,
53-
54-
Unknown = 255,
5553
}
5654

55+
#[repr(u8)]
5756
#[derive(Debug, Clone, PartialEq, Eq)]
5857
pub enum Kind {
5958
Int8(i8),
@@ -67,7 +66,6 @@ pub enum Kind {
6766
String(String),
6867
Dependency(Dependency, String),
6968
Provider(Dependency, String),
70-
Unknown(Vec<u8>),
7169
}
7270

7371
impl Kind {
@@ -87,61 +85,58 @@ impl Kind {
8785
Kind::Dependency(_, s) => s.len() + 2,
8886
// Plus dep size & nul terminator
8987
Kind::Provider(_, s) => s.len() + 2,
90-
Kind::Unknown(data) => data.len(),
9188
}
9289
}
9390
}
9491

95-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9692
#[repr(u16)]
93+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9794
pub enum Tag {
9895
// Name of the package
9996
Name = 1,
10097
// Architecture of the package
101-
Architecture,
98+
Architecture = 2,
10299
// Version of the package
103-
Version,
100+
Version = 3,
104101
// Summary of the package
105-
Summary,
102+
Summary = 4,
106103
// Description of the package
107-
Description,
104+
Description = 5,
108105
// Homepage for the package
109-
Homepage,
106+
Homepage = 6,
110107
// ID for the source package, used for grouping
111-
SourceID,
108+
SourceID = 7,
112109
// Runtime dependencies
113-
Depends,
110+
Depends = 8,
114111
// Provides some capability or name
115-
Provides,
112+
Provides = 9,
116113
// Conflicts with some capability or name
117-
Conflicts,
114+
Conflicts = 10,
118115
// Release number for the package
119-
Release,
116+
Release = 11,
120117
// SPDX license identifier
121-
License,
118+
License = 12,
122119
// Currently recorded build number
123-
BuildRelease,
120+
BuildRelease = 13,
124121
// Repository index specific (relative URI)
125-
PackageURI,
122+
PackageURI = 14,
126123
// Repository index specific (Package hash)
127-
PackageHash,
124+
PackageHash = 15,
128125
// Repository index specific (size on disk)
129-
PackageSize,
126+
PackageSize = 16,
130127
// A Build Dependency
131-
BuildDepends,
128+
BuildDepends = 17,
132129
// Upstream URI for the source
133-
SourceURI,
130+
SourceURI = 18,
134131
// Relative path for the source within the upstream URI
135-
SourcePath,
132+
SourcePath = 19,
136133
// Ref/commit of the upstream source
137-
SourceRef,
138-
139-
Unknown = u16::MAX,
134+
SourceRef = 20,
140135
}
141136

142137
/// Helper to decode a dependency's encoded kind
143-
fn decode_dependency(i: u8) -> Dependency {
144-
match i {
138+
fn decode_dependency(i: u8) -> Result<Dependency, DecodeError> {
139+
let result = match i {
145140
0 => Dependency::PackageName,
146141
1 => Dependency::SharedLibrary,
147142
2 => Dependency::PkgConfig,
@@ -151,8 +146,9 @@ fn decode_dependency(i: u8) -> Dependency {
151146
6 => Dependency::Binary,
152147
7 => Dependency::SystemBinary,
153148
8 => Dependency::PkgConfig32,
154-
_ => Dependency::Unknown,
155-
}
149+
_ => return Err(DecodeError::UnknownDependency(i)),
150+
};
151+
Ok(result)
156152
}
157153

158154
impl Record for Meta {
@@ -180,7 +176,7 @@ impl Record for Meta {
180176
18 => Tag::SourceURI,
181177
19 => Tag::SourcePath,
182178
20 => Tag::SourceRef,
183-
_ => Tag::Unknown,
179+
t => return Err(DecodeError::UnknownMetaTag(t)),
184180
};
185181

186182
let kind = reader.read_u8()?;
@@ -201,15 +197,15 @@ impl Record for Meta {
201197
9 => Kind::String(sanitize(reader.read_string(length as u64)?)),
202198
10 => Kind::Dependency(
203199
// DependencyKind u8 subtracted from length
204-
decode_dependency(reader.read_u8()?),
200+
decode_dependency(reader.read_u8()?)?,
205201
sanitize(reader.read_string(length as u64 - 1)?),
206202
),
207203
11 => Kind::Provider(
208204
// DependencyKind u8 subtracted from length
209-
decode_dependency(reader.read_u8()?),
205+
decode_dependency(reader.read_u8()?)?,
210206
sanitize(reader.read_string(length as u64 - 1)?),
211207
),
212-
_ => Kind::Unknown(reader.read_vec(length as usize)?),
208+
k => return Err(DecodeError::UnknownMetaKind(k)),
213209
};
214210

215211
Ok(Self { tag, kind })
@@ -228,7 +224,6 @@ impl Record for Meta {
228224
Kind::String(_) => 9,
229225
Kind::Dependency(_, _) => 10,
230226
Kind::Provider(_, _) => 11,
231-
Kind::Unknown(_) => 255,
232227
};
233228

234229
writer.write_u32(self.kind.size() as u32)?;
@@ -255,9 +250,6 @@ impl Record for Meta {
255250
writer.write_all(s.as_bytes())?;
256251
writer.write_u8(b'\0')?;
257252
}
258-
Kind::Unknown(data) => {
259-
writer.write_all(data)?;
260-
}
261253
}
262254

263255
Ok(())

crates/stone/src/payload/mod.rs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,30 @@ pub use self::layout::Layout;
1717
pub use self::meta::Meta;
1818
use crate::{ReadExt, WriteExt};
1919

20-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2120
#[repr(u8)]
21+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2222
pub enum Kind {
2323
// The Metadata store
2424
Meta = 1,
2525
// File store, i.e. hash indexed
26-
Content,
26+
Content = 2,
2727
// Map Files to Disk with basic UNIX permissions + types
28-
Layout,
28+
Layout = 3,
2929
// For indexing the deduplicated store
30-
Index,
30+
Index = 4,
3131
// Attribute storage
32-
Attributes,
33-
34-
Unknown = 255,
32+
Attributes = 5,
33+
// For Writer interim
34+
Dumb = 6,
3535
}
3636

37-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3837
#[repr(u8)]
38+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3939
pub enum Compression {
4040
// Payload has no compression
4141
None = 1,
4242
// Payload uses ZSTD compression
43-
Zstd,
44-
45-
Unknown = 255,
43+
Zstd = 2,
4644
}
4745

4846
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -73,13 +71,14 @@ impl Header {
7371
3 => Kind::Layout,
7472
4 => Kind::Index,
7573
5 => Kind::Attributes,
76-
_ => Kind::Unknown,
74+
6 => Kind::Dumb,
75+
k => return Err(DecodeError::UnknownKind(k)),
7776
};
7877

7978
let compression = match reader.read_u8()? {
8079
1 => Compression::None,
8180
2 => Compression::Zstd,
82-
_ => Compression::Unknown,
81+
d => return Err(DecodeError::UnknownCompression(d)),
8382
};
8483

8584
Ok(Self {
@@ -141,6 +140,18 @@ pub struct Payload<T> {
141140

142141
#[derive(Debug, Error)]
143142
pub enum DecodeError {
143+
#[error("Unknown header type: {0}")]
144+
UnknownKind(u8),
145+
#[error("Unknown header compression: {0}")]
146+
UnknownCompression(u8),
147+
#[error("Unknown metadata type: {0}")]
148+
UnknownMetaKind(u8),
149+
#[error("Unknown metadata tag: {0}")]
150+
UnknownMetaTag(u16),
151+
#[error("Unknown file type: {0}")]
152+
UnknownFileType(u8),
153+
#[error("Unknown dependency type: {0}")]
154+
UnknownDependency(u8),
144155
#[error("io")]
145156
Io(#[from] io::Error),
146157
}

0 commit comments

Comments
 (0)