The branch, master has been updated
       via  cb89ea70b1f libsmb: Use pidl generated parsing for posix file info
       via  cb166028c49 libsmb: Pass NTTIME to interpret_long_date()
       via  82a12f7a9a6 libndr: Factor out ndr_pull_struct_blob_noalloc()
       via  7b865702164 smbd: Remove unused marshalling of smb3posix file 
information
       via  2d6c643ebdd smbd: Use Use smb3posix marshalling in in 
smbd_do_qfilepathinfo()
       via  b573e1da921 smbd: Use Use smb3posix marshalling in in 
smbd_marshall_dir_entry()
       via  a8593ad376f smbd: Modernize a DEBUG statement
       via  36fd98a5ef5 smbd: Add smb3_file_posix_information_init()
       via  6874ed6a9de smbd: Use smb3posix marshalling in 
smbd_smb2_create_after_exec()
       via  8107aafb40c idl: Add smb3posix.idl
       via  6f91cce14e4 libsmb: Allow NULL print_name in 
reparse_data_buffer_marshall()
       via  7f1ee32a1b9 pylibsmb: Py_BuildValue can build tuples directly
       via  078db302a65 tests: Run smb3unix tests with SMB1
       via  52c3edb2820 tests: We always do smb3 unix extensions
      from  3ee348a9663 ctdb-scripts: Convert 40.vsftpd to use threshold-based 
fail counting

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit cb89ea70b1f91d3dd286f49fcbac0b6b70add5f0
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Oct 4 16:33:01 2023 +0200

    libsmb: Use pidl generated parsing for posix file info
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>
    
    Autobuild-User(master): Jeremy Allison <j...@samba.org>
    Autobuild-Date(master): Wed Oct  4 21:26:20 UTC 2023 on atb-devel-224

commit cb166028c49d407429adf256ef9f5d53e3bb1fdd
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Oct 4 13:25:21 2023 +0200

    libsmb: Pass NTTIME to interpret_long_date()
    
    Separate concerns of conversion and pulling off the wire. Needed soon
    for smb311 pidl generated parsing.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 82a12f7a9a62f2c879a49291294fc6145e54ebea
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Oct 3 11:39:36 2023 +0200

    libndr: Factor out ndr_pull_struct_blob_noalloc()
    
    smb3_file_posix_information is variable length with something behind.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 7b8657021646e940e3e2b7be3adaf939fd3c3ba5
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Sep 27 10:54:26 2023 +0200

    smbd: Remove unused marshalling of smb3posix file information
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 2d6c643ebddda0f5472fa83127a6a7a28ad37728
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Sep 27 10:51:37 2023 +0200

    smbd: Use Use smb3posix marshalling in in smbd_do_qfilepathinfo()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit b573e1da921f072f27a95912cbd99050f9709078
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Sep 27 10:48:35 2023 +0200

    smbd: Use Use smb3posix marshalling in in smbd_marshall_dir_entry()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit a8593ad376f8809ff8c358130249af935ed590fc
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Sep 27 17:43:33 2023 +0200

    smbd: Modernize a DEBUG statement
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 36fd98a5ef527347ed2c7b766383418920fe498e
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Sep 27 10:44:30 2023 +0200

    smbd: Add smb3_file_posix_information_init()
    
    Copy the logic from store_smb2_posix_info() to allow use of
    ndr_push_smb3_file_posix_information().
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 6874ed6a9defdf6f842e1e25f1ffd95708534ca6
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Sep 27 09:22:53 2023 +0200

    smbd: Use smb3posix marshalling in smbd_smb2_create_after_exec()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>

commit 8107aafb40c22cacf56b69129e7c8611fd35184a
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Sep 27 06:44:41 2023 +0200

    idl: Add smb3posix.idl
    
    Let PIDL take care of encoding SMB2_FILE_POSIX_INFORMATION. This way
    we also get parsing.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 6f91cce14e490963ed699629beae136b9fe25656
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 26 14:54:37 2023 +0200

    libsmb: Allow NULL print_name in reparse_data_buffer_marshall()
    
    read_symlink_reparse() does this.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 7f1ee32a1b91addd84784954e3150afc2b3ae2bc
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 26 14:16:08 2023 +0200

    pylibsmb: Py_BuildValue can build tuples directly
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 078db302a65fffd76722728969e5fcbd393eef02
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 26 12:01:17 2023 +0200

    tests: Run smb3unix tests with SMB1
    
    We want to create native FIFOs with smb1 extensions
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 52c3edb28203bd29f529b31b57bdbc81fd5d009c
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Sep 26 11:57:47 2023 +0200

    tests: We always do smb3 unix extensions
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 examples/fuse/clifuse.c                       |  16 +--
 libcli/smb/reparse.c                          |   7 +-
 librpc/ABI/{ndr-3.0.1.sigs => ndr-3.0.2.sigs} |   1 +
 librpc/idl/smb3posix.idl                      |  36 ++++++
 librpc/idl/wscript_build                      |   1 +
 librpc/ndr/libndr.h                           |   5 +
 librpc/ndr/ndr.c                              |  70 +++++++----
 librpc/wscript_build                          |   8 +-
 source3/include/proto.h                       |   2 +-
 source3/lib/time.c                            |   4 +-
 source3/libsmb/cli_smb2_fnum.c                | 119 +++++++++---------
 source3/libsmb/clifile.c                      |   6 +-
 source3/libsmb/clifsinfo.c                    |   2 +-
 source3/libsmb/clilist.c                      |   6 +-
 source3/libsmb/clirap.c                       |  44 +++----
 source3/libsmb/pylibsmb.c                     |  24 +---
 source3/selftest/tests.py                     |   5 +-
 source3/smbd/proto.h                          |  17 +--
 source3/smbd/smb2_create.c                    |  61 ++++-----
 source3/smbd/smb2_posix.c                     | 172 +++++---------------------
 source3/smbd/smb2_trans2.c                    |  89 ++++++-------
 source3/torture/test_smb1_dfs.c               |   6 +-
 source3/wscript                               |   5 -
 source4/librpc/wscript_build                  |   7 ++
 24 files changed, 315 insertions(+), 398 deletions(-)
 copy librpc/ABI/{ndr-3.0.1.sigs => ndr-3.0.2.sigs} (99%)
 create mode 100644 librpc/idl/smb3posix.idl


Changeset truncated at 500 lines:

diff --git a/examples/fuse/clifuse.c b/examples/fuse/clifuse.c
index 533fe14c2d4..28c5177b250 100644
--- a/examples/fuse/clifuse.c
+++ b/examples/fuse/clifuse.c
@@ -327,10 +327,10 @@ static void cli_get_unixattr_gotinfo(struct tevent_req 
*subreq)
                return;
        }
 
-       state->create_time = interpret_long_date((char *)outbuf.data + 0x0);
-       state->access_time = interpret_long_date((char *)outbuf.data + 0x8);
-       state->write_time  = interpret_long_date((char *)outbuf.data + 0x10);
-       state->change_time = interpret_long_date((char *)outbuf.data + 0x18);
+       state->create_time = interpret_long_date(BVAL(outbuf.data, 0));
+       state->access_time = interpret_long_date(BVAL(outbuf.data, 0x8));
+       state->write_time  = interpret_long_date(BVAL(outbuf.data, 0x10));
+       state->change_time = interpret_long_date(BVAL(outbuf.data, 0x18));
        state->mode        = IVAL(outbuf.data, 0x20);
        state->size        = BVAL(outbuf.data, 0x30);
        state->ino         = BVAL(outbuf.data, 0x40);
@@ -502,10 +502,10 @@ static NTSTATUS 
parse_finfo_id_both_directory_info(uint8_t *dir_data,
                return NT_STATUS_INFO_LENGTH_MISMATCH;
        }
 
-       finfo->btime_ts = interpret_long_date((const char *)dir_data + 8);
-       finfo->atime_ts = interpret_long_date((const char *)dir_data + 16);
-       finfo->mtime_ts = interpret_long_date((const char *)dir_data + 24);
-       finfo->ctime_ts = interpret_long_date((const char *)dir_data + 32);
+       finfo->btime_ts = interpret_long_date(BVAL(dir_data, 8));
+       finfo->atime_ts = interpret_long_date(BVAL(dir_data, 16));
+       finfo->mtime_ts = interpret_long_date(BVAL(dir_data, 24));
+       finfo->ctime_ts = interpret_long_date(BVAL(dir_data, 32));
        finfo->size = IVAL2_TO_SMB_BIG_UINT(dir_data + 40, 0);
        finfo->attr = IVAL(dir_data + 56, 0);
        namelen = IVAL(dir_data + 60,0);
diff --git a/libcli/smb/reparse.c b/libcli/smb/reparse.c
index 1a6feff17e1..49ecc77725d 100644
--- a/libcli/smb/reparse.c
+++ b/libcli/smb/reparse.c
@@ -388,6 +388,7 @@ reparse_data_buffer_marshall_syml(const struct 
symlink_reparse_struct *src,
 {
        uint8_t sbuf[12];
        struct iovec iov[3];
+       const char *print_name = src->print_name;
        uint8_t *subst_utf16 = NULL;
        uint8_t *print_utf16 = NULL;
        size_t subst_len = 0;
@@ -399,7 +400,7 @@ reparse_data_buffer_marshall_syml(const struct 
symlink_reparse_struct *src,
                return -1;
        }
        if (src->print_name == NULL) {
-               return -1;
+               print_name = src->substitute_name;
        }
 
        iov[0] = (struct iovec){
@@ -428,8 +429,8 @@ reparse_data_buffer_marshall_syml(const struct 
symlink_reparse_struct *src,
        ok = convert_string_talloc(talloc_tos(),
                                   CH_UNIX,
                                   CH_UTF16,
-                                  src->print_name,
-                                  strlen(src->print_name),
+                                  print_name,
+                                  strlen(print_name),
                                   &print_utf16,
                                   &print_len);
        if (!ok) {
diff --git a/librpc/ABI/ndr-3.0.1.sigs b/librpc/ABI/ndr-3.0.2.sigs
similarity index 99%
copy from librpc/ABI/ndr-3.0.1.sigs
copy to librpc/ABI/ndr-3.0.2.sigs
index 54aab1d56d4..2f9b4b80c84 100644
--- a/librpc/ABI/ndr-3.0.1.sigs
+++ b/librpc/ABI/ndr-3.0.2.sigs
@@ -148,6 +148,7 @@ ndr_pull_string_array: enum ndr_err_code (struct ndr_pull 
*, int, const char ***
 ndr_pull_struct_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void 
*, ndr_pull_flags_fn_t)
 ndr_pull_struct_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, 
void *, ndr_pull_flags_fn_t)
 ndr_pull_struct_blob_all_noalloc: enum ndr_err_code (const DATA_BLOB *, void 
*, ndr_pull_flags_fn_t)
+ndr_pull_struct_blob_noalloc: enum ndr_err_code (const uint8_t *, size_t, void 
*, ndr_pull_flags_fn_t, size_t *)
 ndr_pull_subcontext_end: enum ndr_err_code (struct ndr_pull *, struct ndr_pull 
*, size_t, ssize_t)
 ndr_pull_subcontext_start: enum ndr_err_code (struct ndr_pull *, struct 
ndr_pull **, size_t, ssize_t)
 ndr_pull_svcctl_ServerType: enum ndr_err_code (struct ndr_pull *, int, 
uint32_t *)
diff --git a/librpc/idl/smb3posix.idl b/librpc/idl/smb3posix.idl
new file mode 100644
index 00000000000..e75922963a2
--- /dev/null
+++ b/librpc/idl/smb3posix.idl
@@ -0,0 +1,36 @@
+#include "idl_types.h"
+
+/*
+   IDL for smb311 unix structures
+*/
+
+import "security.idl";
+
+[
+  version(0.0),
+  pointer_default(unique)
+]
+interface smb3posix
+{
+       typedef [public,flag(NDR_NOALIGN)] struct {
+               uint32 nlinks;
+               uint32 reparse_tag;
+               uint32 posix_perms;
+               dom_sid owner;
+               dom_sid group;
+       } smb3_posix_cc_info;
+
+       typedef [public,flag(NDR_NOALIGN)] struct {
+               NTTIME creation_time;
+               NTTIME last_access_time;
+               NTTIME last_write_time;
+               NTTIME change_time;
+               hyper end_of_file;
+               hyper allocation_size;
+               uint32 file_attributes;
+               hyper inode;
+               uint32 device;
+               uint32 reserved;
+               smb3_posix_cc_info cc;
+       } smb3_file_posix_information;
+}
diff --git a/librpc/idl/wscript_build b/librpc/idl/wscript_build
index 95f1b340fbd..1221ef829b9 100644
--- a/librpc/idl/wscript_build
+++ b/librpc/idl/wscript_build
@@ -141,6 +141,7 @@ bld.SAMBA_PIDL_LIST('PIDL',
                     server_id.idl
                     smb_acl.idl
                     xattr.idl
+                    smb3posix.idl
                     ''',
                     options='--header --ndr-parser --python',
                     output_dir='../gen_ndr')
diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h
index e55f7e12687..4d6a078add0 100644
--- a/librpc/ndr/libndr.h
+++ b/librpc/ndr/libndr.h
@@ -716,6 +716,11 @@ enum ndr_err_code ndr_pull_steal_switch_value(struct 
ndr_pull *ndr,
                                              uint32_t *v);
 enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob, TALLOC_CTX 
*mem_ctx, void *p, ndr_pull_flags_fn_t fn);
 enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX 
*mem_ctx, void *p, ndr_pull_flags_fn_t fn);
+_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_noalloc(const uint8_t *buf,
+                                                       size_t buflen,
+                                                       void *p,
+                                                       ndr_pull_flags_fn_t fn,
+                                                       size_t *consumed);
 enum ndr_err_code ndr_pull_struct_blob_all_noalloc(const DATA_BLOB *blob,
                                                   void *p, ndr_pull_flags_fn_t 
fn);
 enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX 
*mem_ctx, void *p, uint32_t level, ndr_pull_flags_fn_t fn);
diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c
index 424d7126f89..52f837cbe8b 100644
--- a/librpc/ndr/ndr.c
+++ b/librpc/ndr/ndr.c
@@ -1347,13 +1347,16 @@ _PUBLIC_ enum ndr_err_code 
ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLO
 }
 
 /*
-  pull a struct from a blob using NDR - failing if all bytes are not consumed
-
-  This only works for structures with NO allocated memory, like
-  objectSID and GUID.  This helps because we parse these a lot.
-*/
-_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all_noalloc(const DATA_BLOB 
*blob,
-                                                           void *p, 
ndr_pull_flags_fn_t fn)
+ * pull a struct from a blob using NDR
+ *
+ * This only works for structures with NO allocated memory, like
+ * objectSID and GUID.  This helps because we parse these a lot.
+ */
+_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_noalloc(const uint8_t *buf,
+                                                       size_t buflen,
+                                                       void *p,
+                                                       ndr_pull_flags_fn_t fn,
+                                                       size_t *consumed)
 {
        /*
         * We init this structure on the stack here, to avoid a
@@ -1364,24 +1367,47 @@ _PUBLIC_ enum ndr_err_code 
ndr_pull_struct_blob_all_noalloc(const DATA_BLOB *blo
         * code without the talloc() overhead.
         */
        struct ndr_pull ndr = {
-               .data = blob->data,
-               .data_size = blob->length,
-               .current_mem_ctx = (void *)-1
+               .data = discard_const_p(uint8_t, buf),
+               .data_size = buflen,
+               .current_mem_ctx = (void *)-1,
        };
-       uint32_t highest_ofs;
+
        NDR_CHECK(fn(&ndr, NDR_SCALARS|NDR_BUFFERS, p));
-       highest_ofs = MAX(ndr.offset, ndr.relative_highest_offset);
-       if (highest_ofs < ndr.data_size) {
-               enum ndr_err_code ret;
-               ret = ndr_pull_error(
-                       &ndr,
-                       NDR_ERR_UNREAD_BYTES,
-                       "not all bytes consumed ofs[%"PRIu32"] "
-                       "size[%"PRIu32"]",
-                       highest_ofs,
-                       ndr.data_size);
-               return ret;
+       *consumed = MAX(ndr.offset, ndr.relative_highest_offset);
+
+       return NDR_ERR_SUCCESS;
+}
+
+/*
+  pull a struct from a blob using NDR - failing if all bytes are not consumed
+
+  This only works for structures with NO allocated memory, like
+  objectSID and GUID.  This helps because we parse these a lot.
+*/
+_PUBLIC_ enum ndr_err_code
+ndr_pull_struct_blob_all_noalloc(const DATA_BLOB *blob,
+                                void *p,
+                                ndr_pull_flags_fn_t fn)
+{
+       size_t consumed;
+       enum ndr_err_code ndr_err;
+
+       ndr_err = ndr_pull_struct_blob_noalloc(blob->data,
+                                              blob->length,
+                                              p,
+                                              fn,
+                                              &consumed);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               return ndr_err;
        }
+
+       if (consumed < blob->length) {
+               D_WARNING("not all bytes consumed ofs[%zu] size[%zu]",
+                         consumed,
+                         blob->length);
+               return NDR_ERR_UNREAD_BYTES;
+       }
+
        return NDR_ERR_SUCCESS;
 }
 
diff --git a/librpc/wscript_build b/librpc/wscript_build
index 3ba7ce23082..be1b158d010 100644
--- a/librpc/wscript_build
+++ b/librpc/wscript_build
@@ -387,6 +387,11 @@ bld.SAMBA_SUBSYSTEM('NDR_XATTR',
     public_deps='ndr NDR_SECURITY'
     )
 
+bld.SAMBA_SUBSYSTEM('NDR_SMB3POSIX',
+                    source='gen_ndr/ndr_smb3posix.c',
+                    public_deps='ndr',
+                    public_headers='gen_ndr/smb3posix.h')
+
 bld.SAMBA_SUBSYSTEM('NDR_SMB2_LEASE_STRUCT',
     source='gen_ndr/ndr_smb2_lease_struct.c',
     public_deps='ndr',
@@ -606,6 +611,7 @@ bld.SAMBA_LIBRARY('ndr-samba',
     deps='''NDR_DRSBLOBS NDR_DRSUAPI NDR_IDMAP NDR_NTLMSSP NDR_NEGOEX 
NDR_SCHANNEL NDR_MGMT
     NDR_DNSSERVER NDR_EPMAPPER NDR_XATTR NDR_UNIXINFO NDR_NAMED_PIPE_AUTH
     NDR_NTPRINTING NDR_FSRVP NDR_WITNESS NDR_MDSSVC NDR_OPEN_FILES NDR_SMBXSRV
+    NDR_SMB3POSIX
     NDR_KRB5CCACHE''',
     private_library=True,
     grouping_library=True
@@ -633,7 +639,7 @@ bld.SAMBA_LIBRARY('ndr',
     public_deps='samba-errors talloc samba-util util_str_hex',
     public_headers='gen_ndr/misc.h gen_ndr/ndr_misc.h ndr/libndr.h:ndr.h',
     header_path= [('*gen_ndr*', 'gen_ndr')],
-    vnum='3.0.1',
+    vnum='3.0.2',
     abi_directory='ABI',
     abi_match='!ndr_table_* ndr_* GUID_* _ndr_pull_error* _ndr_push_error*',
     )
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 853d4e57e20..8a6b944a0d6 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -257,7 +257,7 @@ time_t make_unix_date3(const void *date_ptr, int 
zone_offset);
 time_t srv_make_unix_date(const void *date_ptr);
 time_t srv_make_unix_date2(const void *date_ptr);
 time_t srv_make_unix_date3(const void *date_ptr);
-struct timespec interpret_long_date(const char *p);
+struct timespec interpret_long_date(NTTIME nt);
 void TimeInit(void);
 void get_process_uptime(struct timeval *ret_time);
 void get_startup_time(struct timeval *ret_time);
diff --git a/source3/lib/time.c b/source3/lib/time.c
index 3b96a9d690c..ec93f6c5347 100644
--- a/source3/lib/time.c
+++ b/source3/lib/time.c
@@ -254,10 +254,8 @@ time_t srv_make_unix_date3(const void *date_ptr)
  will be returned as (time_t)-1, whereas nt_time_to_unix returns 0 in this 
case.
 ****************************************************************************/
 
-struct timespec interpret_long_date(const char *p)
+struct timespec interpret_long_date(NTTIME nt)
 {
-       NTTIME nt;
-       nt = BVAL(p, 0);
        if (nt == (uint64_t)-1) {
                struct timespec ret;
                ret.tv_sec = (time_t)-1;
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index d5a167f8dd0..42f6d807fc5 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -42,6 +42,7 @@
 #include "librpc/gen_ndr/ndr_ioctl.h"
 #include "ntioctl.h"
 #include "librpc/gen_ndr/ndr_quota.h"
+#include "librpc/gen_ndr/ndr_smb3posix.h"
 #include "lib/util/string_wrappers.h"
 #include "lib/util/idtree.h"
 
@@ -1174,29 +1175,6 @@ NTSTATUS cli_smb2_unlink_recv(struct tevent_req *req)
        return tevent_req_simple_recv_ntstatus(req);
 }
 
-static ssize_t sid_parse_wire(TALLOC_CTX *mem_ctx, const uint8_t *data,
-                             struct dom_sid *sid, size_t num_rdata)
-{
-       size_t sid_size;
-       enum ndr_err_code ndr_err;
-       DATA_BLOB in = data_blob_const(data, num_rdata);
-
-       ndr_err = ndr_pull_struct_blob(&in,
-                                      mem_ctx,
-                                      sid,
-                                      (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               return 0;
-       }
-
-       sid_size = ndr_size_dom_sid(sid, 0);
-       if (sid_size > num_rdata) {
-               return 0;
-       }
-
-       return sid_size;
-}
-
 /***************************************************************
  Utility function to parse a SMB2_FIND_POSIX_INFORMATION reply.
 ***************************************************************/
@@ -1206,8 +1184,10 @@ static NTSTATUS parse_finfo_posix_info(const uint8_t 
*dir_data,
                                       struct file_info *finfo,
                                       uint32_t *next_offset)
 {
+       struct smb3_file_posix_information info = {};
+       size_t consumed;
+       enum ndr_err_code ndr_err;
        size_t namelen = 0;
-       size_t slen = 0, slen2 = 0;
        size_t ret = 0;
        uint32_t _next_offset = 0;
 
@@ -1226,43 +1206,64 @@ static NTSTATUS parse_finfo_posix_info(const uint8_t 
*dir_data,
                dir_data_length = _next_offset;
        }
 
-       if (dir_data_length < 92) {
+       /*
+        * Skip NextEntryOffset and FileIndex
+        */
+       if (dir_data_length < 8) {
                return NT_STATUS_INFO_LENGTH_MISMATCH;
        }
+       dir_data += 8;
+       dir_data_length -= 8;
 
-       finfo->btime_ts = interpret_long_date((const char *)dir_data + 8);
-       finfo->atime_ts = interpret_long_date((const char *)dir_data + 16);
-       finfo->mtime_ts = interpret_long_date((const char *)dir_data + 24);
-       finfo->ctime_ts = interpret_long_date((const char *)dir_data + 32);
-       finfo->allocated_size = PULL_LE_U64(dir_data, 40);
-       finfo->size = PULL_LE_U64(dir_data, 48);
-       finfo->mode = PULL_LE_U32(dir_data, 56);
-       finfo->ino = PULL_LE_U64(dir_data, 60);
-       finfo->st_ex_dev = PULL_LE_U32(dir_data, 68);
-       finfo->st_ex_nlink = PULL_LE_U32(dir_data, 76);
-       finfo->reparse_tag = PULL_LE_U32(dir_data, 80);
-       finfo->st_ex_mode = wire_perms_to_unix(PULL_LE_U32(dir_data, 84));
-
-       slen = sid_parse_wire(finfo, dir_data+88, &finfo->owner_sid,
-                             dir_data_length-88);
-       if (slen == 0) {
-               return NT_STATUS_INVALID_NETWORK_RESPONSE;
+       ndr_err = ndr_pull_struct_blob_noalloc(
+               dir_data,
+               dir_data_length,
+               &info,
+               (ndr_pull_flags_fn_t)ndr_pull_smb3_file_posix_information,
+               &consumed);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               return ndr_map_error2ntstatus(ndr_err);
        }
-       slen2 = sid_parse_wire(finfo, dir_data+88+slen, &finfo->group_sid,
-                              dir_data_length-88-slen);
-       if (slen2 == 0) {
-               return NT_STATUS_INVALID_NETWORK_RESPONSE;
+       if (consumed > dir_data_length) {
+               return NT_STATUS_INFO_LENGTH_MISMATCH;
+       }
+       dir_data += consumed;
+       dir_data_length -= consumed;
+
+       finfo->btime_ts = interpret_long_date(info.creation_time);
+       finfo->atime_ts = interpret_long_date(info.last_access_time);
+       finfo->mtime_ts = interpret_long_date(info.last_write_time);
+       finfo->ctime_ts = interpret_long_date(info.change_time);
+       finfo->allocated_size = info.allocation_size;
+       finfo->size = info.end_of_file;
+       finfo->mode = info.file_attributes;
+       finfo->ino = info.inode;
+       finfo->st_ex_dev = info.device;
+       finfo->st_ex_nlink = info.cc.nlinks;
+       finfo->reparse_tag = info.cc.reparse_tag;
+       finfo->st_ex_mode = wire_perms_to_unix(info.cc.posix_perms);
+       sid_copy(&finfo->owner_sid, &info.cc.owner);
+       sid_copy(&finfo->group_sid, &info.cc.group);
+
+       if (dir_data_length < 4) {
+               return NT_STATUS_INFO_LENGTH_MISMATCH;
+       }
+       namelen = PULL_LE_U32(dir_data, 0);
+
+       dir_data += 4;
+       dir_data_length -= 4;
+
+       if (namelen > dir_data_length) {
+               return NT_STATUS_INFO_LENGTH_MISMATCH;
        }
-       slen += slen2;
 
-       namelen = PULL_LE_U32(dir_data, 88+slen);
        ret = pull_string_talloc(finfo,
-                               dir_data,
-                               FLAGS2_UNICODE_STRINGS,
-                               &finfo->name,
-                               dir_data+92+slen,
-                               namelen,
-                               STR_UNICODE);
+                                dir_data,
+                                FLAGS2_UNICODE_STRINGS,
+                                &finfo->name,
+                                dir_data,
+                                namelen,
+                                STR_UNICODE);
        if (ret == (size_t)-1) {
                /* Bad conversion. */
                return NT_STATUS_INVALID_NETWORK_RESPONSE;
@@ -1309,10 +1310,10 @@ static NTSTATUS 
parse_finfo_id_both_directory_info(const uint8_t *dir_data,
                return NT_STATUS_INFO_LENGTH_MISMATCH;
        }
 
-       finfo->btime_ts = interpret_long_date((const char *)dir_data + 8);
-       finfo->atime_ts = interpret_long_date((const char *)dir_data + 16);
-       finfo->mtime_ts = interpret_long_date((const char *)dir_data + 24);
-       finfo->ctime_ts = interpret_long_date((const char *)dir_data + 32);
+       finfo->btime_ts = interpret_long_date(BVAL(dir_data, 8));
+       finfo->atime_ts = interpret_long_date(BVAL(dir_data, 16));
+       finfo->mtime_ts = interpret_long_date(BVAL(dir_data, 24));
+       finfo->ctime_ts = interpret_long_date(BVAL(dir_data, 32));
        finfo->size = IVAL2_TO_SMB_BIG_UINT(dir_data + 40, 0);
        finfo->allocated_size = IVAL2_TO_SMB_BIG_UINT(dir_data + 48, 0);
        finfo->attr = IVAL(dir_data + 56, 0);
@@ -2887,7 +2888,7 @@ NTSTATUS cli_smb2_get_fs_volume_info(struct cli_state 
*cli,
 
        if (pdate) {
                struct timespec ts;
-               ts = interpret_long_date((char *)outbuf.data);
+               ts = interpret_long_date(BVAL(outbuf.data, 0));
                *pdate = ts.tv_sec;
        }
        if (pserial_number) {
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index b13946d5be8..46b9f27bf4e 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -852,13 +852,13 @@ static void cli_posix_stat_done(struct tevent_req *subreq)
        sbuf->st_ex_blocks /= 512;
 #endif
        /* time of last change */
-       sbuf->st_ex_ctime = interpret_long_date((char *)(data + 16));
+       sbuf->st_ex_ctime = interpret_long_date(BVAL(data, 16));
 
        /* time of last access */
-       sbuf->st_ex_atime = interpret_long_date((char *)(data + 24));
+       sbuf->st_ex_atime = interpret_long_date(BVAL(data, 24));
 
        /* time of last modification */
-       sbuf->st_ex_mtime = interpret_long_date((char *)(data + 32));
+       sbuf->st_ex_mtime = interpret_long_date(BVAL(data, 32));
 
        sbuf->st_ex_uid = (uid_t) IVAL(data, 40); /* user ID of owner */
        sbuf->st_ex_gid = (gid_t) IVAL(data, 48); /* group ID of owner */
diff --git a/source3/libsmb/clifsinfo.c b/source3/libsmb/clifsinfo.c
index 50fb6e52c9f..3183e2f4f43 100644


-- 
Samba Shared Repository

Reply via email to