self.process_request_record_lookup(r, &mut xidmap);
} else if r.procedure == NFSPROC3_ACCESS {
- match parse_nfs3_request_access(r.prog_data) {
- Ok((_, ar)) => {
- xidmap.file_handle = ar.handle.value.to_vec();
- self.xidmap_handle2name(&mut xidmap);
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_access(r.prog_data) {
+ xidmap.file_handle = rd.handle.value.to_vec();
+ self.xidmap_handle2name(&mut xidmap);
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
} else if r.procedure == NFSPROC3_GETATTR {
- match parse_nfs3_request_getattr(r.prog_data) {
- Ok((_, gar)) => {
- xidmap.file_handle = gar.handle.value.to_vec();
- self.xidmap_handle2name(&mut xidmap);
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_getattr(r.prog_data) {
+ xidmap.file_handle = rd.handle.value.to_vec();
+ self.xidmap_handle2name(&mut xidmap);
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
} else if r.procedure == NFSPROC3_READDIRPLUS {
- match parse_nfs3_request_readdirplus(r.prog_data) {
- Ok((_, rdp)) => {
- xidmap.file_handle = rdp.handle.value.to_vec();
- self.xidmap_handle2name(&mut xidmap);
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_readdirplus(r.prog_data) {
+ xidmap.file_handle = rd.handle.value.to_vec();
+ self.xidmap_handle2name(&mut xidmap);
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
} else if r.procedure == NFSPROC3_READ {
- match parse_nfs3_request_read(r.prog_data) {
- Ok((_, nfs3_read_record)) => {
- xidmap.chunk_offset = nfs3_read_record.offset;
- xidmap.file_handle = nfs3_read_record.handle.value.to_vec();
- self.xidmap_handle2name(&mut xidmap);
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_read(r.prog_data) {
+ xidmap.chunk_offset = rd.offset;
+ xidmap.file_handle = rd.handle.value.to_vec();
+ self.xidmap_handle2name(&mut xidmap);
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
} else if r.procedure == NFSPROC3_WRITE {
- match parse_nfs3_request_write(r.prog_data) {
- Ok((_, w)) => {
- self.process_write_record(r, &w);
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_write(r.prog_data) {
+ self.process_write_record(r, &rd);
+ } else {
+ self.set_event(NFSEvent::MalformedData);
}
} else if r.procedure == NFSPROC3_CREATE {
- match parse_nfs3_request_create(r.prog_data) {
- Ok((_, nfs3_create_record)) => {
- xidmap.file_handle = nfs3_create_record.handle.value.to_vec();
- xidmap.file_name = nfs3_create_record.name_vec;
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_create(r.prog_data) {
+ xidmap.file_handle = rd.handle.value.to_vec();
+ xidmap.file_name = rd.name_vec;
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
-
} else if r.procedure == NFSPROC3_REMOVE {
- match parse_nfs3_request_remove(r.prog_data) {
- Ok((_, rr)) => {
- xidmap.file_handle = rr.handle.value.to_vec();
- xidmap.file_name = rr.name_vec;
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_remove(r.prog_data) {
+ xidmap.file_handle = rd.handle.value.to_vec();
+ xidmap.file_name = rd.name_vec;
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
-
} else if r.procedure == NFSPROC3_RENAME {
- match parse_nfs3_request_rename(r.prog_data) {
- Ok((_, rr)) => {
- xidmap.file_handle = rr.from_handle.value.to_vec();
- xidmap.file_name = rr.from_name_vec;
- aux_file_name = rr.to_name_vec;
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_rename(r.prog_data) {
+ xidmap.file_handle = rd.from_handle.value.to_vec();
+ xidmap.file_name = rd.from_name_vec;
+ aux_file_name = rd.to_name_vec;
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
} else if r.procedure == NFSPROC3_MKDIR {
- match parse_nfs3_request_mkdir(r.prog_data) {
- Ok((_, mr)) => {
- xidmap.file_handle = mr.handle.value.to_vec();
- xidmap.file_name = mr.name_vec;
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_mkdir(r.prog_data) {
+ xidmap.file_handle = rd.handle.value.to_vec();
+ xidmap.file_name = rd.name_vec;
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
} else if r.procedure == NFSPROC3_RMDIR {
- match parse_nfs3_request_rmdir(r.prog_data) {
- Ok((_, rr)) => {
- xidmap.file_handle = rr.handle.value.to_vec();
- xidmap.file_name = rr.name_vec;
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_request_rmdir(r.prog_data) {
+ xidmap.file_handle = rd.handle.value.to_vec();
+ xidmap.file_name = rd.name_vec;
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
} else if r.procedure == NFSPROC3_COMMIT {
SCLogDebug!("COMMIT, closing shop");
-
- match parse_nfs3_request_commit(r.prog_data) {
- Ok((_, cr)) => {
- let file_handle = cr.handle.value.to_vec();
- match self.get_file_tx_by_handle(&file_handle, STREAM_TOSERVER) {
- Some((tx, files, flags)) => {
- if let Some(NFSTransactionTypeData::FILE(ref mut tdf)) = tx.type_data {
- tdf.chunk_count += 1;
- tdf.file_additional_procs.push(NFSPROC3_COMMIT);
- tdf.file_tracker.close(files, flags);
- tdf.file_last_xid = r.hdr.xid;
- tx.is_last = true;
- tx.request_done = true;
- }
- },
- None => { },
+ if let Ok((_, rd)) = parse_nfs3_request_commit(r.prog_data) {
+ let file_handle = rd.handle.value.to_vec();
+ if let Some((tx, files, flags)) = self.get_file_tx_by_handle(&file_handle, STREAM_TOSERVER) {
+ if let Some(NFSTransactionTypeData::FILE(ref mut tdf)) = tx.type_data {
+ tdf.chunk_count += 1;
+ tdf.file_additional_procs.push(NFSPROC3_COMMIT);
+ tdf.file_tracker.close(files, flags);
+ tdf.file_last_xid = r.hdr.xid;
+ tx.is_last = true;
+ tx.request_done = true;
}
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ }
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
}
tx.nfs_version = r.progver as u16;
tx.auth_type = r.creds_flavor;
- match r.creds {
- RpcRequestCreds::Unix(ref u) => {
- tx.request_machine_name = u.machine_name_buf.to_vec();
- tx.request_uid = u.uid;
- tx.request_gid = u.gid;
- },
- _ => { },
+ if let RpcRequestCreds::Unix(ref u) = r.creds {
+ tx.request_machine_name = u.machine_name_buf.to_vec();
+ tx.request_uid = u.uid;
+ tx.request_gid = u.gid;
}
}
}
self.requestmap.insert(r.hdr.xid, xidmap);
- 0
+ return 0;
}
pub fn process_reply_record_v3<'b>(&mut self, r: &RpcReplyPacket<'b>, xidmap: &mut NFSRequestXidMap) -> u32 {
let mut resp_handle = Vec::new();
if xidmap.procedure == NFSPROC3_LOOKUP {
- match parse_nfs3_response_lookup(r.prog_data) {
- Ok((_, lookup)) => {
- SCLogDebug!("LOOKUP: {:?}", lookup);
- SCLogDebug!("RESPONSE LOOKUP file_name {:?}", xidmap.file_name);
+ if let Ok((_, rd)) = parse_nfs3_response_lookup(r.prog_data) {
+ SCLogDebug!("LOOKUP: {:?}", rd);
+ SCLogDebug!("RESPONSE LOOKUP file_name {:?}", xidmap.file_name);
- nfs_status = lookup.status;
+ nfs_status = rd.status;
- SCLogDebug!("LOOKUP handle {:?}", lookup.handle);
- self.namemap.insert(lookup.handle.value.to_vec(), xidmap.file_name.to_vec());
- resp_handle = lookup.handle.value.to_vec();
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ SCLogDebug!("LOOKUP handle {:?}", rd.handle);
+ self.namemap.insert(rd.handle.value.to_vec(), xidmap.file_name.to_vec());
+ resp_handle = rd.handle.value.to_vec();
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
} else if xidmap.procedure == NFSPROC3_CREATE {
- match parse_nfs3_response_create(r.prog_data) {
- Ok((_, nfs3_create_record)) => {
- SCLogDebug!("nfs3_create_record: {:?}", nfs3_create_record);
-
- SCLogDebug!("RESPONSE CREATE file_name {:?}", xidmap.file_name);
- nfs_status = nfs3_create_record.status;
+ if let Ok((_, rd)) = parse_nfs3_response_create(r.prog_data) {
+ SCLogDebug!("nfs3_create_record: {:?}", rd);
+ SCLogDebug!("RESPONSE CREATE file_name {:?}", xidmap.file_name);
+ nfs_status = rd.status;
- if let Some(h) = nfs3_create_record.handle {
- SCLogDebug!("handle {:?}", h);
- self.namemap.insert(h.value.to_vec(), xidmap.file_name.to_vec());
- resp_handle = h.value.to_vec();
- }
-
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Some(h) = rd.handle {
+ SCLogDebug!("handle {:?}", h);
+ self.namemap.insert(h.value.to_vec(), xidmap.file_name.to_vec());
+ resp_handle = h.value.to_vec();
+ }
+ } else {
+ self.set_event(NFSEvent::MalformedData);
};
} else if xidmap.procedure == NFSPROC3_READ {
- match parse_nfs3_reply_read(r.prog_data) {
- Ok((_, ref reply)) => {
- self.process_read_record(r, reply, Some(&xidmap));
- nfs_status = reply.status;
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ if let Ok((_, rd)) = parse_nfs3_reply_read(r.prog_data) {
+ self.process_read_record(r, &rd, Some(&xidmap));
+ nfs_status = rd.status;
+ } else {
+ self.set_event(NFSEvent::MalformedData);
}
} else if xidmap.procedure == NFSPROC3_READDIRPLUS {
- match parse_nfs3_response_readdirplus(r.prog_data) {
- Ok((_, ref reply)) => {
- //SCLogDebug!("READDIRPLUS reply {:?}", reply);
+ if let Ok((_, rd)) = parse_nfs3_response_readdirplus(r.prog_data) {
+ nfs_status = rd.status;
- nfs_status = reply.status;
+ // cut off final eof field
+ let d = if rd.data.len() >= 4 {
+ &rd.data[..rd.data.len()-4 as usize]
+ } else {
+ rd.data
+ };
- // cut off final eof field
- let d = if reply.data.len() >= 4 {
- &reply.data[..reply.data.len()-4 as usize]
- } else {
- reply.data
- };
-
- // store all handle/filename mappings
- match many0_nfs3_response_readdirplus_entries(d) {
- Ok((_, ref entries)) => {
- SCLogDebug!("READDIRPLUS ENTRIES reply {:?}", entries);
- for ce in entries {
- SCLogDebug!("ce {:?}", ce);
- if let Some(ref e) = ce.entry {
- SCLogDebug!("e {:?}", e);
- if let Some(ref h) = e.handle {
- SCLogDebug!("h {:?}", h);
- self.namemap.insert(h.value.to_vec(),
- e.name_vec.to_vec());
- }
- }
+ // store all handle/filename mappings
+ if let Ok((_, ref entries)) = many0_nfs3_response_readdirplus_entries(d) {
+ SCLogDebug!("READDIRPLUS ENTRIES reply {:?}", entries);
+ for ce in entries {
+ SCLogDebug!("ce {:?}", ce);
+ if let Some(ref e) = ce.entry {
+ SCLogDebug!("e {:?}", e);
+ if let Some(ref h) = e.handle {
+ SCLogDebug!("h {:?}", h);
+ self.namemap.insert(h.value.to_vec(),
+ e.name_vec.to_vec());
}
- },
- _ => {
- self.set_event(NFSEvent::MalformedData);
- },
+ }
}
- },
- _ => {
+ } else {
self.set_event(NFSEvent::MalformedData);
- },
+ }
+ } else {
+ self.set_event(NFSEvent::MalformedData);
}
}
// for all other record types only parse the status
else {
- let stat = match be_u32(&r.prog_data) as IResult<&[u8],_> {
- Ok((_, stat)) => {
- stat as u32
- }
- _ => 0 as u32
+ let stat : u32 = match be_u32(&r.prog_data) as IResult<&[u8],_> {
+ Ok((_, stat)) => stat,
+ _ => 0
};
nfs_status = stat;
}
self.mark_response_tx_done(r.hdr.xid, r.reply_state, nfs_status, &resp_handle);
}
- 0
+ return 0;
}
}