Skip to content

Commit

Permalink
pgsql: parse auth message within its bound
Browse files Browse the repository at this point in the history
If the next PDU is already in the slice next, do not use it and
restrict ourselves to the length of this PDU.
Avoids overconsumption of memory by quadratic complexity, when
having many small PDUS in one big chunk being parsed

Ticket: #6411
  • Loading branch information
catenacyber authored and victorjulien committed Feb 6, 2024
1 parent bc422c1 commit f52c033
Showing 1 changed file with 6 additions and 9 deletions.
15 changes: 6 additions & 9 deletions rust/src/pgsql/parser.rs
Expand Up @@ -719,7 +719,6 @@ fn pgsql_parse_authentication_message<'a>(i: &'a [u8]) -> IResult<&'a [u8], Pgsq
let (i, identifier) = verify(be_u8, |&x| x == b'R')(i)?;
let (i, length) = verify(be_u32, |&x| x >= 8)(i)?;
let (i, auth_type) = be_u32(i)?;
let (i, payload) = peek(rest)(i)?;
let (i, message) = map_parser(
take(length - 8),
|b: &'a [u8]| {
Expand All @@ -729,14 +728,14 @@ fn pgsql_parse_authentication_message<'a>(i: &'a [u8]) -> IResult<&'a [u8], Pgsq
identifier,
length,
auth_type,
payload: payload.to_vec(),
payload: b.to_vec(),
}))),
3 => Ok((b, PgsqlBEMessage::AuthenticationCleartextPassword(
AuthenticationMessage {
identifier,
length,
auth_type,
payload: payload.to_vec(),
payload: b.to_vec(),
}))),
5 => {
let (b, salt) = all_consuming(take(4_usize))(b)?;
Expand All @@ -753,7 +752,7 @@ fn pgsql_parse_authentication_message<'a>(i: &'a [u8]) -> IResult<&'a [u8], Pgsq
identifier,
length,
auth_type,
payload: payload.to_vec(),
payload: b.to_vec(),
}))),
// TODO - For SASL, should we parse specific details of the challenge itself? (as seen in: https://github.com/launchbadge/sqlx/blob/master/sqlx-core/src/postgres/message/authentication.rs )
10 => {
Expand All @@ -767,23 +766,21 @@ fn pgsql_parse_authentication_message<'a>(i: &'a [u8]) -> IResult<&'a [u8], Pgsq
})))
}
11 => {
let (b, sasl_challenge) = rest(i)?;
Ok((b, PgsqlBEMessage::AuthenticationSASLContinue(
AuthenticationMessage {
identifier,
length,
auth_type,
payload: sasl_challenge.to_vec(),
payload: b.to_vec(),
})))
},
12 => {
let (i, signature) = take(length - 8)(i)?;
Ok((i, PgsqlBEMessage::AuthenticationSASLFinal(
Ok((b, PgsqlBEMessage::AuthenticationSASLFinal(
AuthenticationMessage {
identifier,
length,
auth_type,
payload: signature.to_vec(),
payload: b.to_vec(),
}
)))
}
Expand Down

0 comments on commit f52c033

Please sign in to comment.