From 61a32360eba3c032de51029a05515ab46690286f Mon Sep 17 00:00:00 2001 From: Philippe Antoine Date: Tue, 17 Oct 2023 22:01:27 +0200 Subject: [PATCH] pgsql: parse auth message within its bound 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 (cherry picked from commit f52c033e566beafb4480c139eb18662a2870464f) --- rust/src/pgsql/parser.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/rust/src/pgsql/parser.rs b/rust/src/pgsql/parser.rs index 97a16b5738..3fd3f8546f 100644 --- a/rust/src/pgsql/parser.rs +++ b/rust/src/pgsql/parser.rs @@ -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]| { @@ -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)?; @@ -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 => { @@ -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(), } ))) } -- 2.47.3