Skip to content

Commit e29a96b

Browse files
authored
deku-derive: deku_read: Use checked slice for remaining data (sharksforarms#581)
1 parent cf40c3f commit e29a96b

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

deku-derive/src/macros/deku_read.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,10 @@ fn emit_struct(input: &DekuData) -> Result<TokenStream, syn::Error> {
137137
} else {
138138
(__deku_reader.bits_read - (__deku_reader.bits_read % 8)) / 8
139139
};
140-
Ok(((&__deku_input.0[idx..], __deku_reader.bits_read % 8), __deku_value))
140+
let Some(rest) = __deku_input.0.get(idx..) else {
141+
return Err(deku::DekuError::Incomplete(deku::prelude::NeedSize::new(8 * (idx - __deku_input.0.len()))));
142+
};
143+
Ok(((rest, __deku_reader.bits_read % 8), __deku_value))
141144
};
142145

143146
tokens.extend(emit_try_from(&imp, &lifetime, &ident, wher));
@@ -436,7 +439,10 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
436439
} else {
437440
(__deku_reader.bits_read - (__deku_reader.bits_read % 8)) / 8
438441
};
439-
Ok(((&__deku_input.0[idx..], __deku_reader.bits_read % 8), __deku_value))
442+
let Some(rest) = __deku_input.0.get(idx..) else {
443+
return Err(deku::DekuError::Incomplete(deku::prelude::NeedSize::new(8 * (idx - __deku_input.0.len()))));
444+
};
445+
Ok(((rest, __deku_reader.bits_read % 8), __deku_value))
440446
};
441447

442448
tokens.extend(emit_try_from(&imp, &lifetime, &ident, wher));

tests/test_from_bytes.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,30 @@ fn test_from_bytes_long() {
8181
assert_eq!(6, i);
8282
assert_eq!(0b0101_1010u8, rest[0]);
8383
}
84+
85+
#[test]
86+
fn test_from_bytes_short_with_seek() {
87+
#[derive(Debug, DekuRead, Eq, PartialEq)]
88+
#[deku(ctx = "mid: u8", id = "mid")]
89+
enum Sneaky {
90+
#[deku(id = 0)]
91+
Zero,
92+
#[deku(id = 1)]
93+
One,
94+
}
95+
96+
#[derive(Debug, DekuRead, Eq, PartialEq)]
97+
struct Seeky {
98+
id: u8,
99+
// Use seek to force an out-of-bounds slice for remaining data
100+
#[deku(seek_from_current = "1")]
101+
#[deku(ctx = "*id")]
102+
body: Sneaky,
103+
}
104+
105+
let bytes: [u8; 1] = [0x01];
106+
assert_eq!(
107+
Err(DekuError::Incomplete(NeedSize::new(8))),
108+
Seeky::from_bytes((&bytes, 0))
109+
);
110+
}

0 commit comments

Comments
 (0)