The branch, master has been updated via 12596a3a8d0 libcli: Align integer types via 52b5bcb602a lib: Fix a typo via c8d5195349d smbd: Fix a comment, "flags" expanded to 2 bytes via 9653a107389 libsmbclient: Put it back to a known, well-working state from 0982980dc6d mit-kdc: Explicitly reject S4U requests
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 12596a3a8d057bd0afad530195ae71f55499bebf Author: Volker Lendecke <v...@samba.org> Date: Sun Mar 8 16:50:59 2020 +0100 libcli: Align integer types 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): Tue Mar 10 23:08:20 UTC 2020 on sn-devel-184 commit 52b5bcb602afc9ce9d2401994b4af54883cc3086 Author: Volker Lendecke <v...@samba.org> Date: Mon Mar 9 15:28:14 2020 +0100 lib: Fix a typo Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit c8d5195349ddc34095cc9c77e6b63afb180bb5c1 Author: Volker Lendecke <v...@samba.org> Date: Mon Mar 9 12:36:31 2020 +0100 smbd: Fix a comment, "flags" expanded to 2 bytes Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 9653a1073898b9e78b579b12adedadb669ae2b94 Author: Volker Lendecke <v...@samba.org> Date: Tue Mar 10 11:51:09 2020 -0700 libsmbclient: Put it back to a known, well-working state For adapting unix extensions in our client libraries, we need a fresh start with additional APIs. We can't change existing application behaviour. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: libcli/smb/smb2_negotiate_context.c | 2 +- selftest/knownfail | 3 +- selftest/knownfail.d/libsmbclient | 2 - selftest/selftesthelpers.py | 15 +-- source3/include/client.h | 6 - source3/include/libsmb_internal.h | 4 +- source3/lib/ctdbd_conn.c | 2 +- source3/libsmb/clifile.c | 122 +++++++++------------ source3/libsmb/clilist.c | 69 +----------- source3/libsmb/libsmb_dir.c | 64 ++++------- source3/libsmb/libsmb_file.c | 44 +++----- source3/libsmb/libsmb_misc.c | 15 +-- source3/libsmb/libsmb_server.c | 1 + source3/libsmb/libsmb_stat.c | 2 +- source3/libsmb/proto.h | 8 +- source3/locking/share_mode_lock.c | 2 +- .../script/tests/test_smbtorture_s3_no_unix_ext.sh | 14 --- source3/selftest/tests.py | 24 +--- source4/selftest/tests.py | 47 ++------ source4/torture/libsmbclient/libsmbclient.c | 24 ++-- 20 files changed, 134 insertions(+), 336 deletions(-) delete mode 100644 selftest/knownfail.d/libsmbclient delete mode 100755 source3/script/tests/test_smbtorture_s3_no_unix_ext.sh Changeset truncated at 500 lines: diff --git a/libcli/smb/smb2_negotiate_context.c b/libcli/smb/smb2_negotiate_context.c index f9c98fcf805..b9b8c763a8e 100644 --- a/libcli/smb/smb2_negotiate_context.c +++ b/libcli/smb/smb2_negotiate_context.c @@ -125,7 +125,7 @@ static NTSTATUS smb2_negotiate_context_push_one(TALLOC_CTX *mem_ctx, DATA_BLOB * NTSTATUS smb2_negotiate_context_push(TALLOC_CTX *mem_ctx, DATA_BLOB *buffer, const struct smb2_negotiate_contexts contexts) { - int i; + uint32_t i; NTSTATUS status; *buffer = data_blob(NULL, 0); diff --git a/selftest/knownfail b/selftest/knownfail index d4381b39a84..4dc434aca7e 100644 --- a/selftest/knownfail +++ b/selftest/knownfail @@ -19,6 +19,7 @@ ^samba3.nbt.dgram.*netlogon2\(nt4_dc\) ^samba3.*rap.sam.*.useradd # Not provided by Samba 3 ^samba3.*rap.sam.*.userdelete # Not provided by Samba 3 +^samba3.libsmbclient.opendir # This requires a workgroup called 'WORKGROUP' and for netbios browse lists to have been registered # see bug 8412 ^samba3.smb2.rename.*.simple_nodelete ^samba3.smb2.rename.*.no_share_delete_no_delete_access @@ -140,7 +141,7 @@ ^samba4.smb2.acls.*.ACCESSBASED ^samba4.ldap.dirsync.python.ad_dc_ntvfs..__main__.ExtendedDirsyncTests.test_dirsync_deleted_items #^samba4.ldap.dirsync.python.ad_dc_ntvfs..__main__.ExtendedDirsyncTests.* -^samba4.*libsmbclient.opendir.(NT1|SMB3).opendir # This requires netbios browsing +^samba4.libsmbclient.opendir.(NT1|SMB3).opendir # This requires netbios browsing ^samba4.rpc.drsuapi.*.drsuapi.DsGetDomainControllerInfo\(.*\)$ ^samba4.smb2.oplock.exclusive2\(.*\)$ # samba 4 oplocks are a mess ^samba4.smb2.oplock.exclusive5\(.*\)$ # samba 4 oplocks are a mess diff --git a/selftest/knownfail.d/libsmbclient b/selftest/knownfail.d/libsmbclient deleted file mode 100644 index 43c3fb6774d..00000000000 --- a/selftest/knownfail.d/libsmbclient +++ /dev/null @@ -1,2 +0,0 @@ -# We don't have SMB3 unix extensions yet -samba4.unix_ext.libsmbclient.readdirplus2.SMB3.readdirplus2.* diff --git a/selftest/selftesthelpers.py b/selftest/selftesthelpers.py index 1fdb2e461e1..1afabf3cdca 100644 --- a/selftest/selftesthelpers.py +++ b/selftest/selftesthelpers.py @@ -172,21 +172,14 @@ smbtorture4_options = [ "--format=subunit" ] + get_env_torture_options() -def smbtorture4testsuite_cmdarray(name, env, options, target): - cmdarray = [ valgrindify(smbtorture4), "$LISTOPT", "$LOADLIST" ] - cmdarray += smbtorture4_options - cmdarray += [ "--target=%s" % target ] - cmdarray += options - cmdarray += [ name ] - return cmdarray def plansmbtorture4testsuite(name, env, options, target, modname=None): if modname is None: modname = "samba4.%s" % name - if isinstance(options, str): - options = options.split() - cmdarray = smbtorture4testsuite_cmdarray(name, env, options, target) - cmdline = " ".join(cmdarray) + if isinstance(options, list): + options = " ".join(options) + options = " ".join(smbtorture4_options + ["--target=%s" % target]) + " " + options + cmdline = "%s $LISTOPT $LOADLIST %s %s" % (valgrindify(smbtorture4), options, name) plantestsuite_loadlist(modname, env, cmdline) diff --git a/source3/include/client.h b/source3/include/client.h index 34b6a9fc383..23ba86d2a2c 100644 --- a/source3/include/client.h +++ b/source3/include/client.h @@ -114,12 +114,6 @@ struct file_info { struct timespec mtime_ts; struct timespec atime_ts; struct timespec ctime_ts; - - /* - * Native sbuf from posix extensions. Valid if st_ex_nlink!=0. - */ - SMB_STRUCT_STAT posix_sbuf; - char *name; char *short_name; }; diff --git a/source3/include/libsmb_internal.h b/source3/include/libsmb_internal.h index 78c2cb555e0..21a11c1a024 100644 --- a/source3/include/libsmb_internal.h +++ b/source3/include/libsmb_internal.h @@ -98,7 +98,6 @@ struct smbc_dir_list { struct smbc_dirplus_list { struct smbc_dirplus_list *next; struct libsmb_file_info *smb_finfo; - SMB_STRUCT_STAT *posix_sbuf; uint64_t ino; }; @@ -432,7 +431,8 @@ SMBC_ftruncate_ctx(SMBCCTX *context, /* Functions in libsmb_misc.c */ -bool SMBC_dlist_contains(SMBCFILE * list, SMBCFILE *p); +int +SMBC_dlist_contains(SMBCFILE * list, SMBCFILE *p); int SMBC_errno(SMBCCTX *context, diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c index 843e57287b6..db6ad9404d8 100644 --- a/source3/lib/ctdbd_conn.c +++ b/source3/lib/ctdbd_conn.c @@ -1327,7 +1327,7 @@ static void ctdb_pkt_send_cleanup(struct tevent_req *req, * * This function will modify the iov array! But * this is a static function and our only caller - * ctdb_parse_send/recv is preparared for this to + * ctdb_parse_send/recv is prepared for this to * happen! **/ static struct tevent_req *ctdb_pkt_send_send(TALLOC_CTX *mem_ctx, diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index 164be11386c..dd08b0e30f3 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -736,65 +736,12 @@ NTSTATUS cli_posix_setacl(struct cli_state *cli, return status; } -static void fetch_file_unix_basic_info( - const uint8_t data[100], SMB_STRUCT_STAT *sbuf) -{ - ZERO_STRUCTP(sbuf); - - /* total size, in bytes */ - sbuf->st_ex_size = IVAL2_TO_SMB_BIG_UINT(data, 0); - - /* number of blocks allocated */ - sbuf->st_ex_blocks = IVAL2_TO_SMB_BIG_UINT(data,8); -#if defined (HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE) - sbuf->st_ex_blocks /= STAT_ST_BLOCKSIZE; -#else - /* assume 512 byte blocks */ - sbuf->st_ex_blocks /= 512; -#endif - /* time of last change */ - sbuf->st_ex_ctime = interpret_long_date((const char *)(data + 16)); - - /* time of last access */ - sbuf->st_ex_atime = interpret_long_date((const char *)(data + 24)); - - /* time of last modification */ - sbuf->st_ex_mtime = interpret_long_date((const char *)(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 */ - sbuf->st_ex_mode = unix_filetype_from_wire(IVAL(data, 56)); - -#if defined(HAVE_MAKEDEV) - { - uint32_t dev_major = IVAL(data,60); - uint32_t dev_minor = IVAL(data,68); - sbuf->st_ex_rdev = makedev(dev_major, dev_minor); - } -#endif - /* inode */ - sbuf->st_ex_ino = (SMB_INO_T)IVAL2_TO_SMB_BIG_UINT(data, 76); - - /* protection */ - sbuf->st_ex_mode |= wire_perms_to_unix(IVAL(data, 84)); - - /* number of hard links */ - sbuf->st_ex_nlink = BIG_UINT(data, 92); -} - -void fetch_file_unix_basic_info2( - const uint8_t data[116], SMB_STRUCT_STAT *sbuf) -{ - fetch_file_unix_basic_info(data, sbuf); - sbuf->st_ex_btime = interpret_long_date((const char *)(data + 100)); -} - /**************************************************************************** Stat a file (UNIX extensions). ****************************************************************************/ struct stat_state { - SMB_STRUCT_STAT sbuf; + SMB_STRUCT_STAT *sbuf; }; static void cli_posix_stat_done(struct tevent_req *subreq); @@ -802,7 +749,8 @@ static void cli_posix_stat_done(struct tevent_req *subreq); struct tevent_req *cli_posix_stat_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct cli_state *cli, - const char *fname) + const char *fname, + SMB_STRUCT_STAT *sbuf) { struct tevent_req *req = NULL, *subreq = NULL; struct stat_state *state = NULL; @@ -811,6 +759,7 @@ struct tevent_req *cli_posix_stat_send(TALLOC_CTX *mem_ctx, if (req == NULL) { return NULL; } + state->sbuf = sbuf; subreq = cli_qpathinfo_send(state, ev, cli, fname, SMB_QUERY_FILE_UNIX_BASIC, 100, 100); @@ -826,7 +775,7 @@ static void cli_posix_stat_done(struct tevent_req *subreq) struct tevent_req *req = tevent_req_callback_data( subreq, struct tevent_req); struct stat_state *state = tevent_req_data(req, struct stat_state); - SMB_STRUCT_STAT *sbuf = &state->sbuf; + SMB_STRUCT_STAT *sbuf = state->sbuf; uint8_t *data; uint32_t num_data = 0; NTSTATUS status; @@ -846,25 +795,54 @@ static void cli_posix_stat_done(struct tevent_req *subreq) return; } - fetch_file_unix_basic_info(data, sbuf); + *sbuf = (SMB_STRUCT_STAT) { 0 }; + + /* total size, in bytes */ + sbuf->st_ex_size = IVAL2_TO_SMB_BIG_UINT(data, 0); + + /* number of blocks allocated */ + sbuf->st_ex_blocks = IVAL2_TO_SMB_BIG_UINT(data,8); +#if defined (HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE) + sbuf->st_ex_blocks /= STAT_ST_BLOCKSIZE; +#else + /* assume 512 byte blocks */ + sbuf->st_ex_blocks /= 512; +#endif + /* time of last change */ + sbuf->st_ex_ctime = interpret_long_date((char *)(data + 16)); + + /* time of last access */ + sbuf->st_ex_atime = interpret_long_date((char *)(data + 24)); + + /* time of last modification */ + sbuf->st_ex_mtime = interpret_long_date((char *)(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 */ + sbuf->st_ex_mode = unix_filetype_from_wire(IVAL(data, 56)); + +#if defined(HAVE_MAKEDEV) + { + uint32_t dev_major = IVAL(data,60); + uint32_t dev_minor = IVAL(data,68); + sbuf->st_ex_rdev = makedev(dev_major, dev_minor); + } +#endif + /* inode */ + sbuf->st_ex_ino = (SMB_INO_T)IVAL2_TO_SMB_BIG_UINT(data, 76); + + /* protection */ + sbuf->st_ex_mode |= wire_perms_to_unix(IVAL(data, 84)); + + /* number of hard links */ + sbuf->st_ex_nlink = BIG_UINT(data, 92); tevent_req_done(req); } -NTSTATUS cli_posix_stat_recv(struct tevent_req *req, - SMB_STRUCT_STAT *sbuf) +NTSTATUS cli_posix_stat_recv(struct tevent_req *req) { - struct stat_state *state = tevent_req_data(req, struct stat_state); - NTSTATUS status; - - if (tevent_req_is_nterror(req, &status)) { - return status; - } - if (sbuf != NULL) { - *sbuf = state->sbuf; - } - tevent_req_received(req); - return NT_STATUS_OK; + return tevent_req_simple_recv_ntstatus(req); } NTSTATUS cli_posix_stat(struct cli_state *cli, @@ -890,7 +868,7 @@ NTSTATUS cli_posix_stat(struct cli_state *cli, goto fail; } - req = cli_posix_stat_send(frame, ev, cli, fname); + req = cli_posix_stat_send(frame, ev, cli, fname, sbuf); if (req == NULL) { status = NT_STATUS_NO_MEMORY; goto fail; @@ -900,7 +878,7 @@ NTSTATUS cli_posix_stat(struct cli_state *cli, goto fail; } - status = cli_posix_stat_recv(req, sbuf); + status = cli_posix_stat_recv(req); fail: TALLOC_FREE(frame); diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c index ca6d8b53129..f868e72a239 100644 --- a/source3/libsmb/clilist.c +++ b/source3/libsmb/clilist.c @@ -305,63 +305,6 @@ static size_t interpret_long_filename(TALLOC_CTX *ctx, } return calc_next_entry_offset(base, pdata_end); } - case SMB_FIND_FILE_UNIX_INFO2: - { - SMB_STRUCT_STAT *sbuf = &finfo->posix_sbuf; - size_t namelen; - - if (pdata_end - base < 128) { - return pdata_end - base; - } - - p += 4; /* next entry offset */ - - if (p_resume_key) { - *p_resume_key = IVAL(p,0); - } - p += 4; /* fileindex */ - - fetch_file_unix_basic_info2((const uint8_t *)p, sbuf); - p += 116; - - finfo->mode = S_ISDIR(sbuf->st_ex_mode) ? - FILE_ATTRIBUTE_DIRECTORY : - FILE_ATTRIBUTE_NORMAL; - if (sbuf->st_ex_mode & S_IXUSR) { - finfo->mode |= FILE_ATTRIBUTE_ARCHIVE; - } - - finfo->size = sbuf->st_ex_size; - finfo->allocated_size = - sbuf->st_ex_blksize * sbuf->st_ex_blocks; - finfo->uid = sbuf->st_ex_uid; - finfo->gid = sbuf->st_ex_gid; - finfo->ino = sbuf->st_ex_ino; - finfo->btime_ts = sbuf->st_ex_btime; - finfo->mtime_ts = sbuf->st_ex_mtime; - finfo->atime_ts = sbuf->st_ex_atime; - finfo->ctime_ts = sbuf->st_ex_ctime; - - namelen = IVAL(p, 0); - p += 4; - - if (namelen > (pdata_end - p)) { - return pdata_end - base; - } - - ret = clistr_pull_talloc( - ctx, - base_ptr, - recv_flags2, - &finfo->name, - p, - namelen, - 0); - if (ret == (size_t)-1) { - return pdata_end - base; - } - return calc_next_entry_offset(base, pdata_end); - } } DEBUG(1,("Unknown long filename format %d\n",level)); @@ -1100,7 +1043,6 @@ NTSTATUS cli_list(struct cli_state *cli, const char *mask, uint16_t attribute, NTSTATUS status = NT_STATUS_NO_MEMORY; struct file_info *finfo; size_t i, num_finfo = 0; - uint32_t caps; uint16_t info_level; if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { @@ -1121,15 +1063,8 @@ NTSTATUS cli_list(struct cli_state *cli, const char *mask, uint16_t attribute, goto fail; } - caps = smb1cli_conn_capabilities(cli->conn); - - if (caps & CAP_UNIX) { - info_level = SMB_FIND_FILE_UNIX_INFO2; - } else if (caps & CAP_NT_SMBS) { - info_level = SMB_FIND_FILE_BOTH_DIRECTORY_INFO; - } else { - info_level = SMB_FIND_INFO_STANDARD; - } + info_level = (smb1cli_conn_capabilities(cli->conn) & CAP_NT_SMBS) + ? SMB_FIND_FILE_BOTH_DIRECTORY_INFO : SMB_FIND_INFO_STANDARD; req = cli_list_send(frame, ev, cli, mask, attribute, info_level); if (req == NULL) { diff --git a/source3/libsmb/libsmb_dir.c b/source3/libsmb/libsmb_dir.c index 801d556f53b..00d2a878e84 100644 --- a/source3/libsmb/libsmb_dir.c +++ b/source3/libsmb/libsmb_dir.c @@ -49,7 +49,6 @@ static void remove_dirplus(SMBCFILE *dir) struct smbc_dirplus_list *f = d; d = d->next; - SAFE_FREE(f->posix_sbuf); SAFE_FREE(f->smb_finfo->short_name); SAFE_FREE(f->smb_finfo->name); SAFE_FREE(f->smb_finfo); @@ -213,20 +212,6 @@ static int add_dirplus(SMBCFILE *dir, struct file_info *finfo) } new_entry->smb_finfo = info; - if (finfo->posix_sbuf.st_ex_nlink != 0) { - new_entry->posix_sbuf = SMB_MALLOC_P(SMB_STRUCT_STAT); - if (new_entry->posix_sbuf == NULL) { - SAFE_FREE(info->short_name); - SAFE_FREE(info->name); - SAFE_FREE(info); - SAFE_FREE(new_entry); - dir->dir_error = ENOMEM; - return -1; - } - *new_entry->posix_sbuf = finfo->posix_sbuf; - new_entry->posix_sbuf->st_ex_dev = dir->srv->dev; - } - /* Now add to the list. */ if (dir->dirplus_list == NULL) { /* Empty list - point everything at new_entry. */ @@ -561,12 +546,6 @@ SMBC_opendir_ctx(SMBCCTX *context, dir->cli_fd = 0; dir->fname = SMB_STRDUP(fname); - if (dir->fname == NULL) { - SAFE_FREE(dir); - TALLOC_FREE(frame); - errno = ENOMEM; - return NULL; - } dir->srv = NULL; dir->offset = 0; dir->file = False; @@ -1055,7 +1034,7 @@ SMBC_closedir_ctx(SMBCCTX *context, return -1; } - if (!SMBC_dlist_contains(context->internal->files, dir)) { + if (!dir || !SMBC_dlist_contains(context->internal->files, dir)) { errno = EBADF; TALLOC_FREE(frame); return -1; @@ -1168,7 +1147,7 @@ SMBC_readdir_ctx(SMBCCTX *context, } - if (!SMBC_dlist_contains(context->internal->files, dir)) { + if (!dir || !SMBC_dlist_contains(context->internal->files, dir)) { errno = EBADF; DEBUG(0, ("Invalid dir in SMBC_readdir_ctx()\n")); @@ -1247,7 +1226,9 @@ SMBC_readdirplus_ctx(SMBCCTX *context, return NULL; } - if (!SMBC_dlist_contains(context->internal->files, dir)) { + if (dir == NULL || + SMBC_dlist_contains(context->internal->files, + dir) == 0) { DBG_ERR("Invalid dir in SMBC_readdirplus_ctx()\n"); TALLOC_FREE(frame); errno = EBADF; @@ -1326,7 +1307,10 @@ const struct libsmb_file_info *SMBC_readdirplus2_ctx(SMBCCTX *context, return NULL; } - if (!SMBC_dlist_contains(context->internal->files, dir)) { + if (dir == NULL || + SMBC_dlist_contains(context->internal->files, + dir) == 0) + { DBG_ERR("Invalid dir in SMBC_readdirplus2_ctx()\n"); TALLOC_FREE(frame); errno = EBADF; @@ -1375,20 +1359,15 @@ const struct libsmb_file_info *SMBC_readdirplus2_ctx(SMBCCTX *context, return NULL; } - if (dp_list->posix_sbuf != NULL) { - setup_stat_from_stat_ex(dp_list->posix_sbuf, path, st); - } else { - setup_stat( - st, - path, -- Samba Shared Repository