]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smb1: generic smb string parse func
authorVictor Julien <victor@inliniac.net>
Sat, 10 Mar 2018 10:18:48 +0000 (11:18 +0100)
committerVictor Julien <victor@inliniac.net>
Mon, 12 Mar 2018 14:34:43 +0000 (15:34 +0100)
rust/src/smb/smb1_records.rs

index b0887e512461fa2f8bee592aa526442ecd15f647..271c92e8ffe23cd0493d2d77c0b9d01c136095b8 100644 (file)
@@ -20,6 +20,26 @@ use nom::{rest, le_u8, le_u16, le_u32, le_u64, IResult};
 use smb::smb::*;
 use smb::smb_records::*;
 
+fn smb_get_unicode_string_with_offset(i: &[u8], offset: usize) -> IResult<&[u8], Vec<u8>>
+{
+    do_parse!(i,
+            cond!(offset % 2 == 1, take!(1))
+        >>  s: call!(smb_get_unicode_string)
+        >> ( s )
+    )
+}
+
+/// take a string, unicode or ascii based on record
+pub fn smb1_get_string<'a>(i: &'a[u8], r: &SmbRecord, offset: usize) -> IResult<&'a[u8], Vec<u8>> {
+    do_parse!(i,
+          u: value!(r.has_unicode_support())
+       >> s: switch!(value!(u),
+                true => apply!(smb_get_unicode_string_with_offset, offset) |
+                false => call!(smb_get_ascii_string))
+       >> ( s )
+    )
+}
+
 #[derive(Debug,PartialEq)]
 pub struct Smb1WriteRequestRecord<'a> {
     pub offset: u64,
@@ -158,8 +178,7 @@ pub fn parse_smb_connect_tree_andx_record<'a>(i: &'a[u8], r: &SmbRecord) -> IRes
        >> pwlen: le_u16
        >> _bcc: le_u16
        >> _pw: take!(pwlen)
-       >> unicode: value!(r.has_unicode_support())
-       >> path: switch!(value!(unicode), true => call!(smb_get_unicode_string) | false => call!(smb_get_ascii_string))
+       >> path: apply!(smb1_get_string, r, 11 + pwlen as usize)
        >> service: take_until_and_consume!("\x00")
        >> (SmbRecordTreeConnectAndX {
                 path: path,