From ca6e434e0b84dc8478763dc0a8716c5e3686a99a Mon Sep 17 00:00:00 2001 From: Philippe Antoine Date: Tue, 27 Apr 2021 09:03:45 +0200 Subject: [PATCH] ftp: completely parses pasv and epsv responses --- rust/src/ftp/mod.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rust/src/ftp/mod.rs b/rust/src/ftp/mod.rs index 2a40d7f594..81ccab73bd 100644 --- a/rust/src/ftp/mod.rs +++ b/rust/src/ftp/mod.rs @@ -66,7 +66,8 @@ named!(pub ftp_pasv_response, part1: verify!(getu16, |&v| v <= std::u8::MAX as u16) >> tag!(",") >> part2: verify!(getu16, |&v| v <= std::u8::MAX as u16) >> - alt! (tag!(").") | tag!(")")) >> + // may also be completed by a final point + tag!(")") >> opt!(complete!(tag!("."))) >> ( part1 * 256 + part2 ) @@ -118,7 +119,7 @@ named!(pub ftp_epsv_response, take_until!("|||") >> tag!("|||") >> port: getu16 >> - alt! (tag!("|).") | tag!("|)")) >> + tag!("|)") >> opt!(complete!(tag!("."))) >> ( port ) @@ -185,6 +186,13 @@ mod test { fn test_pasv_response_valid() { let port = ftp_pasv_response("227 Entering Passive Mode (212,27,32,66,221,243).".as_bytes()); assert_eq!(port, Ok((&b""[..], 56819))); + let port_notdot = ftp_pasv_response("227 Entering Passive Mode (212,27,32,66,221,243)".as_bytes()); + assert_eq!(port_notdot, Ok((&b""[..], 56819))); + + let port_epsv_dot = ftp_epsv_response("229 Entering Extended Passive Mode (|||48758|).".as_bytes()); + assert_eq!(port_epsv_dot, Ok((&b""[..], 48758))); + let port_epsv_nodot = ftp_epsv_response("229 Entering Extended Passive Mode (|||48758|)".as_bytes()); + assert_eq!(port_epsv_nodot, Ok((&b""[..], 48758))); } #[test]