Skip to content

Commit

Permalink
fix(addresses): check length before decoding (#377)
Browse files Browse the repository at this point in the history
  • Loading branch information
jmhrpr authored Feb 11, 2024
1 parent 009e846 commit 4088c2d
Showing 1 changed file with 19 additions and 0 deletions.
19 changes: 19 additions & 0 deletions pallas-addresses/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ pub enum Error {
#[error("invalid hash size {0}")]
InvalidHashSize(usize),

#[error("invalid address length {0}")]
InvalidAddressLength(usize),

#[error("invalid pointer data")]
InvalidPointerData,

Expand Down Expand Up @@ -319,6 +322,10 @@ fn parse_network(header: u8) -> Network {
macro_rules! parse_shelley_fn {
($name:tt, $payment:tt, pointer) => {
fn $name(header: u8, payload: &[u8]) -> Result<Address, Error> {
if payload.len() < 29 {
return Err(Error::InvalidAddressLength(payload.len()));
}

let net = parse_network(header);
let h1 = slice_to_hash(&payload[0..=27])?;
let p1 = ShelleyPaymentPart::$payment(h1);
Expand All @@ -330,6 +337,10 @@ macro_rules! parse_shelley_fn {
};
($name:tt, $payment:tt, $delegation:tt) => {
fn $name(header: u8, payload: &[u8]) -> Result<Address, Error> {
if payload.len() != 56 {
return Err(Error::InvalidAddressLength(payload.len()));
}

let net = parse_network(header);
let h1 = slice_to_hash(&payload[0..=27])?;
let p1 = ShelleyPaymentPart::$payment(h1);
Expand All @@ -342,6 +353,10 @@ macro_rules! parse_shelley_fn {
};
($name:tt, $payment:tt) => {
fn $name(header: u8, payload: &[u8]) -> Result<Address, Error> {
if payload.len() != 28 {
return Err(Error::InvalidAddressLength(payload.len()));
}

let net = parse_network(header);
let h1 = slice_to_hash(&payload[0..=27])?;
let p1 = ShelleyPaymentPart::$payment(h1);
Expand All @@ -355,6 +370,10 @@ macro_rules! parse_shelley_fn {
macro_rules! parse_stake_fn {
($name:tt, $type:tt) => {
fn $name(header: u8, payload: &[u8]) -> Result<Address, Error> {
if payload.len() != 28 {
return Err(Error::InvalidAddressLength(payload.len()));
}

let net = parse_network(header);
let p1 = StakePayload::$type(&payload[0..=27])?;
let addr = StakeAddress(net, p1);
Expand Down

0 comments on commit 4088c2d

Please sign in to comment.