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