state: parser::RFBGlobalState
}
-#[inline]
-fn handle_incomplete(input: &[u8], current: &[u8], nom_needed: nom::Needed) -> AppLayerResult {
- if let nom::Needed::Size(needed_size) = nom_needed {
- if let Some(consumed) = input.len().checked_sub(current.len()) {
- if let Some(needed) = current.len().checked_add(needed_size) {
- if consumed <= (std::u32::MAX as usize) && needed <= (std::u32::MAX as usize) {
- return AppLayerResult::incomplete(consumed as u32, needed as u32);
- }
- }
- }
- }
- return AppLayerResult::err();
-}
-
impl RFBState {
pub fn new() -> Self {
Self {
}
let mut current = input;
+ let mut consumed = 0;
SCLogDebug!("request_state {}, input_len {}", self.state, input.len());
loop {
if current.len() == 0 {
parser::RFBGlobalState::TSClientProtocolVersion => {
match parser::parse_protocol_version(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
+
if request.major == "003" && request.minor == "003" {
// in version 3.3 the server decided security type
self.state = parser::RFBGlobalState::TCServerSecurityType;
return AppLayerResult::err();
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
parser::RFBGlobalState::TSSecurityTypeSelection => {
match parser::parse_security_type_selection(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
let chosen_security_type = request.security_type;
return AppLayerResult::err();
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
parser::RFBGlobalState::TSVncResponse => {
match parser::parse_vnc_auth(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
self.state = parser::RFBGlobalState::TCSecurityResult;
return AppLayerResult::err();
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
parser::RFBGlobalState::TSClientInit => {
match parser::parse_client_init(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
+
self.state = parser::RFBGlobalState::TCServerInit;
if let Some(current_transaction) = self.get_current_tx() {
return AppLayerResult::err();
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
}
let mut current = input;
+ let mut consumed = 0;
SCLogDebug!("response_state {}, response_len {}", self.state, input.len());
loop {
if current.len() == 0 {
parser::RFBGlobalState::TCServerProtocolVersion => {
match parser::parse_protocol_version(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
+
self.state = parser::RFBGlobalState::TSClientProtocolVersion;
let tx = self.new_tx();
self.transactions.push(tx);
return AppLayerResult::err();
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
parser::RFBGlobalState::TCSupportedSecurityTypes => {
match parser::parse_supported_security_types(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
+
SCLogDebug!(
"supported_security_types: {}, types: {}", request.number_of_types,
request.types.iter().map(ToString::to_string).map(|v| v + " ").collect::<String>()
return AppLayerResult::err();
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
// In RFB 3.3, the server decides the authentication type
match parser::parse_server_security_type(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
+
let chosen_security_type = request.security_type;
SCLogDebug!("chosen_security_type: {}", chosen_security_type);
match chosen_security_type {
return AppLayerResult::err();
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
parser::RFBGlobalState::TCVncChallenge => {
match parser::parse_vnc_auth(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
self.state = parser::RFBGlobalState::TSVncResponse;
return AppLayerResult::err();
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
parser::RFBGlobalState::TCSecurityResult => {
match parser::parse_security_result(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
if request.status == 0 {
// TODO: Event: unknown security result value
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
}
return AppLayerResult::err();
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();
parser::RFBGlobalState::TCServerInit => {
match parser::parse_server_init(current) {
Ok((rem, request)) => {
+ consumed += current.len() - rem.len();
current = rem;
+
self.state = parser::RFBGlobalState::Message;
if let Some(current_transaction) = self.get_current_tx() {
return AppLayerResult::err();
}
}
- Err(nom::Err::Incomplete(v)) => {
- return handle_incomplete(input, current, v);
+ Err(nom::Err::Incomplete(_)) => {
+ return AppLayerResult::incomplete(consumed as u32, (current.len() + 1) as u32);
}
Err(_) => {
return AppLayerResult::err();