From 3d542fcc677f031996151c286b5dad82b43ab264 Mon Sep 17 00:00:00 2001 From: Sam Muhammed Date: Sun, 20 Feb 2022 14:47:08 +0200 Subject: [PATCH] rust/nfs4: Add NFSPROC4_SECINFO_NO_NAME op parsers --- rust/src/nfs/nfs4_records.rs | 39 +++++++++++++++++++++++++++++++++++- rust/src/nfs/types.rs | 1 + 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/rust/src/nfs/nfs4_records.rs b/rust/src/nfs/nfs4_records.rs index 61915b0676..e49e8e3bc1 100644 --- a/rust/src/nfs/nfs4_records.rs +++ b/rust/src/nfs/nfs4_records.rs @@ -30,6 +30,8 @@ const OPEN_DELEGATE_NONE: u32 = 0; const OPEN_DELEGATE_READ: u32 = 1; const OPEN_DELEGATE_WRITE: u32 = 2; +const RPCSEC_GSS: u32 = 6; + // Maximum number of operations per compound // Linux defines NFSD_MAX_OPS_PER_COMPOUND to 16 (tested in Linux 5.15.1). const NFSD_MAX_OPS_PER_COMPOUND: usize = 64; @@ -62,6 +64,7 @@ pub enum Nfs4RequestContent<'a> { Sequence(Nfs4RequestSequence<'a>), CreateSession(Nfs4RequestCreateSession<'a>), ReclaimComplete(u32), + SecInfoNoName(u32), } #[derive(Debug,PartialEq)] @@ -230,7 +233,6 @@ fn nfs4_req_open_exclusive4(i: &[u8]) -> IResult<&[u8], Nfs4OpenRequestContent> map(take(8_usize), Nfs4OpenRequestContent::Exclusive4)(i) } - fn nfs4_req_open_type(i: &[u8]) -> IResult<&[u8], Nfs4OpenRequestContent> { let (i, mode) = be_u32(i)?; let (i, data) = match mode { @@ -308,6 +310,10 @@ fn nfs4_req_remove(i: &[u8]) -> IResult<&[u8], Nfs4RequestContent> { map(nfs4_parse_nfsstring, Nfs4RequestContent::Remove)(i) } +fn nfs4_req_secinfo_no_name(i: &[u8]) -> IResult<&[u8], Nfs4RequestContent> { + map(be_u32, Nfs4RequestContent::SecInfoNoName) (i) +} + #[derive(Debug,PartialEq)] pub struct Nfs4RequestSetAttr<'a> { pub stateid: Nfs4StateId<'a>, @@ -494,6 +500,7 @@ fn parse_request_compound_command(i: &[u8]) -> IResult<&[u8], Nfs4RequestContent NFSPROC4_EXCHANGE_ID => nfs4_req_exchangeid(i)?, NFSPROC4_CREATE_SESSION => nfs4_req_create_session(i)?, NFSPROC4_RECLAIM_COMPLETE => nfs4_req_reclaim_complete(i)?, + NFSPROC4_SECINFO_NO_NAME => nfs4_req_secinfo_no_name(i)?, _ => { return Err(Err::Error(make_error(i, ErrorKind::Switch))); } }; Ok((i, cmd_data)) @@ -544,6 +551,7 @@ pub enum Nfs4ResponseContent<'a> { Sequence(u32, Option>), CreateSession(u32, Option>), ReclaimComplete(u32), + SecInfoNoName(u32), } #[derive(Debug, PartialEq)] @@ -739,6 +747,34 @@ fn nfs4_res_open(i: &[u8]) -> IResult<&[u8], Nfs4ResponseContent> { Ok((i, Nfs4ResponseContent::Open(status, open_data))) } + +// #[derive(Debug, PartialEq)] +// pub struct Nfs4FlavorRpcSecGss<'a> { +// pub oid: &'a[u8], +// pub qop: u32, +// pub service: u32, +// } + +fn nfs4_parse_rpcsec_gss(i: &[u8]) -> IResult<&[u8], u32> { + let (i, _oid) = nfs4_parse_nfsstring(i)?; + let (i, _qop) = be_u32(i)?; + let (i, _service) = be_u32(i)?; + Ok((i, RPCSEC_GSS)) +} + +fn nfs4_parse_flavors(i: &[u8]) -> IResult<&[u8], u32> { + let (i, flavor_type) = be_u32(i)?; + let (i, _flavor) = cond(flavor_type == RPCSEC_GSS, nfs4_parse_rpcsec_gss)(i)?; + Ok((i, flavor_type)) +} + +fn nfs4_res_secinfo_no_name(i: &[u8]) -> IResult<&[u8], Nfs4ResponseContent> { + let (i, status) = be_u32(i)?; + let (i, flavors_cnt) = be_u32(i)?; + let (i, _flavors) = count(nfs4_parse_flavors, flavors_cnt as usize)(i)?; + Ok((i, Nfs4ResponseContent::SecInfoNoName(status))) +} + #[derive(Debug,PartialEq)] pub struct Nfs4ResponseReaddirEntry<'a> { pub name: &'a[u8], @@ -958,6 +994,7 @@ fn nfs4_res_compound_command(i: &[u8]) -> IResult<&[u8], Nfs4ResponseContent> { NFSPROC4_RENEW => nfs4_res_renew(i)?, NFSPROC4_CREATE_SESSION => nfs4_res_create_session(i)?, NFSPROC4_RECLAIM_COMPLETE => nfs4_res_reclaim_complete(i)?, + NFSPROC4_SECINFO_NO_NAME => nfs4_res_secinfo_no_name(i)?, _ => { return Err(Err::Error(make_error(i, ErrorKind::Switch))); } }; Ok((i, cmd_data)) diff --git a/rust/src/nfs/types.rs b/rust/src/nfs/types.rs index f20f1a2946..acee8a4d3b 100644 --- a/rust/src/nfs/types.rs +++ b/rust/src/nfs/types.rs @@ -275,6 +275,7 @@ pub const NFSPROC4_WRITE: u32 = 38; pub const NFSPROC4_RELEASE_LOCKOWNER: u32 = 39; pub const NFSPROC4_EXCHANGE_ID: u32 = 42; pub const NFSPROC4_CREATE_SESSION: u32 = 43; +pub const NFSPROC4_SECINFO_NO_NAME: u32 = 52; pub const NFSPROC4_SEQUENCE: u32 = 53; pub const NFSPROC4_RECLAIM_COMPLETE: u32 = 58; -- 2.47.2