fix(tvix/nix-compat): Fix panic in nixbase32 decoding
The decode function didn't check that the input had a valid length and so would panic when given input with invalid length. Change-Id: Ie27d006b8fe20f005b4a47a1763821a61e9a95c7 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12051 Reviewed-by: aspen <root@gws.fyi> Tested-by: BuildkiteCI Autosubmit: Brian Olsen <me@griff.name>
This commit is contained in:
parent
a982f73477
commit
a794790203
1 changed files with 15 additions and 0 deletions
|
@ -62,6 +62,12 @@ pub fn decode(input: impl AsRef<[u8]>) -> Result<Vec<u8>, DecodeError> {
|
||||||
let input = input.as_ref();
|
let input = input.as_ref();
|
||||||
|
|
||||||
let output_len = decode_len(input.len());
|
let output_len = decode_len(input.len());
|
||||||
|
if input.len() != encode_len(output_len) {
|
||||||
|
return Err(DecodeError {
|
||||||
|
position: input.len().min(encode_len(output_len)),
|
||||||
|
kind: DecodeKind::Length,
|
||||||
|
});
|
||||||
|
}
|
||||||
let mut output: Vec<u8> = vec![0x00; output_len];
|
let mut output: Vec<u8> = vec![0x00; output_len];
|
||||||
|
|
||||||
decode_inner(input, &mut output)?;
|
decode_inner(input, &mut output)?;
|
||||||
|
@ -163,6 +169,10 @@ mod tests {
|
||||||
#[case::invalid_encoding_1("zz", None)]
|
#[case::invalid_encoding_1("zz", None)]
|
||||||
// this is an even more specific example - it'd decode as 00000000 11
|
// this is an even more specific example - it'd decode as 00000000 11
|
||||||
#[case::invalid_encoding_2("c0", None)]
|
#[case::invalid_encoding_2("c0", None)]
|
||||||
|
// This has an invalid length
|
||||||
|
#[case::invalid_encoding_3("0", None)]
|
||||||
|
// This has an invalid length
|
||||||
|
#[case::invalid_encoding_4("0zz", None)]
|
||||||
#[test]
|
#[test]
|
||||||
fn decode(#[case] enc: &str, #[case] dec: Option<&[u8]>) {
|
fn decode(#[case] enc: &str, #[case] dec: Option<&[u8]>) {
|
||||||
match dec {
|
match dec {
|
||||||
|
@ -201,6 +211,11 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn decode_len() {
|
fn decode_len() {
|
||||||
assert_eq!(super::decode_len(0), 0);
|
assert_eq!(super::decode_len(0), 0);
|
||||||
|
assert_eq!(super::decode_len(1), 0);
|
||||||
|
assert_eq!(super::decode_len(2), 1);
|
||||||
|
assert_eq!(super::decode_len(3), 1);
|
||||||
|
assert_eq!(super::decode_len(4), 2);
|
||||||
|
assert_eq!(super::decode_len(5), 3);
|
||||||
assert_eq!(super::decode_len(32), 20);
|
assert_eq!(super::decode_len(32), 20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue