The branch, v4-6-test has been updated via 66529e1 ctdb-common: Fix crash in logging initialisation via 620aac7 s3:smbd: Set up local and remote address for fake connection via b925818 s3:smbd: Pass down remote and local address to get_referred_path() via 4fc1e91 s4/torture: test for bug 12798 via 29196ec s3/smbd: fix exclusive lease optimisation via 44ca450 s3/locking: make find_share_mode_entry public from 06e8eec s3: VFS: Catia: Ensure path name is also converted.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-6-test - Log ----------------------------------------------------------------- commit 66529e19471a036204d2b74ff3fcd70588562aee Author: Martin Schwenke <mar...@meltin.net> Date: Thu Jun 1 14:37:40 2017 +1000 ctdb-common: Fix crash in logging initialisation Setting CTDB_LOGGING to syslog:nonblocking or syslog:udp will cause ctdbd to crash at startup due to NULL pointer dereference. Refactoring in commit c9124a001f5abf7bb577a8f5341da4cc7411ed22 introduced this regression. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12814 Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> Autobuild-User(master): Amitay Isaacs <ami...@samba.org> Autobuild-Date(master): Thu Jun 1 15:26:19 CEST 2017 on sn-devel-144 (cherry picked from commit c47e6b140d0c7cc15a93782957090625a832ba59) Autobuild-User(v4-6-test): Karolin Seeger <ksee...@samba.org> Autobuild-Date(v4-6-test): Fri Jun 2 14:06:37 CEST 2017 on sn-devel-144 commit 620aac74b1834714b9f64a85649a7c1531bc63ce Author: Andreas Schneider <a...@samba.org> Date: Tue Mar 21 15:45:34 2017 +0100 s3:smbd: Set up local and remote address for fake connection BUG: https://bugzilla.samba.org/show_bug.cgi?id=12687 Pair-Programmed-With: Ralph Boehme <s...@samba.org> Signed-off-by: Andreas Schneider <a...@samba.org> Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit e530e43d67436881fd039877f956f0ad9b562af9) commit b9258183a5fd5b7235a42a719f4f033c5b135b55 Author: Andreas Schneider <a...@samba.org> Date: Tue Mar 21 15:32:37 2017 +0100 s3:smbd: Pass down remote and local address to get_referred_path() BUG: https://bugzilla.samba.org/show_bug.cgi?id=12687 Pair-Programmed-With: Ralph Boehme <s...@samba.org> Signed-off-by: Andreas Schneider <a...@samba.org> Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit cbf67123e037207662ec0d4e53c55990e21b157e) commit 4fc1e91306de7ec0c07f274884838a29edf51a38 Author: Ralph Boehme <s...@samba.org> Date: Fri May 26 15:35:54 2017 +0200 s4/torture: test for bug 12798 BUG: https://bugzilla.samba.org/show_bug.cgi?id=12798 Pair-Programmed-With: Stefan Metzmacher <me...@samba.org> Signed-off-by: Ralph Boehme <s...@samba.org> Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit bd43939ec07a2fc6858d1265fc75a68a7cd96f58) commit 29196ec24a7a184efc0e9f7b49ecfee31c689c4c Author: Ralph Boehme <s...@samba.org> Date: Fri May 26 11:57:08 2017 +0200 s3/smbd: fix exclusive lease optimisation We need to expect any amount of "stat" opens on the file without triggering an assert. This is the correct fix for bug #11844. I guess we haven't seens this very often before bug #12766 got fixed, because most clients were using LEASES instead of OPLOCKS. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12798 See also: BUG: https://bugzilla.samba.org/show_bug.cgi?id=11844 BUG: https://bugzilla.samba.org/show_bug.cgi?id=12766 Pair-Programmed-With: Stefan Metzmacher <me...@samba.org> Signed-off-by: Ralph Boehme <s...@samba.org> Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit 19b938e1fa9822ac417a3b3a34519087470d7a18) commit 44ca4507743602686ecc233ecd9a97aa31dcdfbf Author: Ralph Boehme <s...@samba.org> Date: Fri May 26 11:35:52 2017 +0200 s3/locking: make find_share_mode_entry public BUG: https://bugzilla.samba.org/show_bug.cgi?id=12798 Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit 9d7739e819d5699209b5eacad4a0e2a8b8da0a86) ----------------------------------------------------------------------- Summary of changes: ctdb/common/logging.c | 1 + source3/locking/locking.c | 2 +- source3/locking/proto.h | 2 + source3/modules/vfs_default.c | 2 + source3/rpc_server/dfs/srv_dfs_nt.c | 6 +++ source3/smbd/msdfs.c | 36 +++++++++++++--- source3/smbd/oplock.c | 30 ++++++++++++-- source3/smbd/proto.h | 12 +++--- source4/torture/smb2/lease.c | 82 +++++++++++++++++++++++++++++++++++++ 9 files changed, 158 insertions(+), 15 deletions(-) Changeset truncated at 500 lines: diff --git a/ctdb/common/logging.c b/ctdb/common/logging.c index e1b8e7f..0e3efe0 100644 --- a/ctdb/common/logging.c +++ b/ctdb/common/logging.c @@ -354,6 +354,7 @@ static int syslog_log_setup_common(TALLOC_CTX *mem_ctx, const char *app_name, state->app_name = app_name; talloc_set_destructor(state, syslog_log_state_destructor); + *result = state; return 0; } diff --git a/source3/locking/locking.c b/source3/locking/locking.c index e6d3918..3320e4a 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -858,7 +858,7 @@ bool set_share_mode(struct share_mode_lock *lck, struct files_struct *fsp, return true; } -static struct share_mode_entry *find_share_mode_entry( +struct share_mode_entry *find_share_mode_entry( struct share_mode_lock *lck, files_struct *fsp) { struct share_mode_data *d = lck->data; diff --git a/source3/locking/proto.h b/source3/locking/proto.h index 461f89a..93077ef 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -169,6 +169,8 @@ bool share_mode_stale_pid(struct share_mode_data *d, uint32_t idx); bool set_share_mode(struct share_mode_lock *lck, struct files_struct *fsp, uid_t uid, uint64_t mid, uint16_t op_type, uint32_t lease_idx); +struct share_mode_entry *find_share_mode_entry(struct share_mode_lock *lck, + files_struct *fsp); void remove_stale_share_mode_entries(struct share_mode_data *d); bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp); bool mark_share_mode_disconnected(struct share_mode_lock *lck, diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index e0b6125..dcae861 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -216,6 +216,8 @@ static NTSTATUS vfswrap_get_dfs_referrals(struct vfs_handle_struct *handle, /* The following call can change cwd. */ status = get_referred_path(r, pathnamep, + handle->conn->sconn->remote_address, + handle->conn->sconn->local_address, !handle->conn->sconn->using_smb2, junction, &consumedcnt, &self_referral); if (!NT_STATUS_IS_OK(status)) { diff --git a/source3/rpc_server/dfs/srv_dfs_nt.c b/source3/rpc_server/dfs/srv_dfs_nt.c index ab2af53..0a4d6d3 100644 --- a/source3/rpc_server/dfs/srv_dfs_nt.c +++ b/source3/rpc_server/dfs/srv_dfs_nt.c @@ -76,6 +76,8 @@ WERROR _dfs_Add(struct pipes_struct *p, struct dfs_Add *r) /* The following call can change the cwd. */ status = get_referred_path(ctx, r->in.path, + p->remote_address, + p->local_address, true, /*allow_broken_path */ jn, &consumedcnt, &self_ref); if(!NT_STATUS_IS_OK(status)) { @@ -146,6 +148,8 @@ WERROR _dfs_Remove(struct pipes_struct *p, struct dfs_Remove *r) } status = get_referred_path(ctx, r->in.dfs_entry_path, + p->remote_address, + p->local_address, true, /*allow_broken_path */ jn, &consumedcnt, &self_ref); if(!NT_STATUS_IS_OK(status)) { @@ -374,6 +378,8 @@ WERROR _dfs_GetInfo(struct pipes_struct *p, struct dfs_GetInfo *r) /* The following call can change the cwd. */ status = get_referred_path(ctx, r->in.dfs_entry_path, + p->remote_address, + p->local_address, true, /*allow_broken_path */ jn, &consumedcnt, &self_ref); if(!NT_STATUS_IS_OK(status) || diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index 61538ce..c25fb17 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -31,6 +31,7 @@ #include "lib/param/loadparm.h" #include "libcli/security/security.h" #include "librpc/gen_ndr/ndr_dfsblobs.h" +#include "lib/tsocket/tsocket.h" /********************************************************************** Parse a DFS pathname of the form \hostname\service\reqpath @@ -953,11 +954,13 @@ static NTSTATUS self_ref(TALLOC_CTX *ctx, **********************************************************************/ NTSTATUS get_referred_path(TALLOC_CTX *ctx, - const char *dfs_path, - bool allow_broken_path, - struct junction_map *jucn, - int *consumedcntp, - bool *self_referralp) + const char *dfs_path, + const struct tsocket_address *remote_address, + const struct tsocket_address *local_address, + bool allow_broken_path, + struct junction_map *jucn, + int *consumedcntp, + bool *self_referralp) { struct connection_struct *conn; char *targetpath = NULL; @@ -1069,6 +1072,29 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx, return status; } + /* + * TODO + * + * The remote and local address should be passed down to + * create_conn_struct_cwd. + */ + if (conn->sconn->remote_address == NULL) { + conn->sconn->remote_address = + tsocket_address_copy(remote_address, conn->sconn); + if (conn->sconn->remote_address == NULL) { + TALLOC_FREE(pdp); + return NT_STATUS_NO_MEMORY; + } + } + if (conn->sconn->local_address == NULL) { + conn->sconn->local_address = + tsocket_address_copy(local_address, conn->sconn); + if (conn->sconn->local_address == NULL) { + TALLOC_FREE(pdp); + return NT_STATUS_NO_MEMORY; + } + } + /* If this is a DFS path dfs_lookup should return * NT_STATUS_PATH_NOT_COVERED. */ diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index ff7c037..d30de6a 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -25,6 +25,7 @@ #include "smbd/globals.h" #include "messages.h" #include "../librpc/gen_ndr/open_files.h" +#include "../librpc/gen_ndr/ndr_open_files.h" /* * helper function used by the kernel oplock backends to post the break message @@ -166,17 +167,38 @@ bool update_num_read_oplocks(files_struct *fsp, struct share_mode_lock *lck) uint32_t i; if (fsp_lease_type_is_exclusive(fsp)) { + const struct share_mode_entry *e = NULL; + uint32_t e_lease_type = 0; + /* * If we're fully exclusive, we don't need a brlock entry */ remove_stale_share_mode_entries(d); - for (i=0; i<d->num_share_modes; i++) { - struct share_mode_entry *e = &d->share_modes[i]; - uint32_t e_lease_type = get_lease_type(d, e); + e = find_share_mode_entry(lck, fsp); + if (e != NULL) { + e_lease_type = get_lease_type(d, e); + } + + if (!lease_type_is_exclusive(e_lease_type)) { + char *timestr = NULL; - SMB_ASSERT(lease_type_is_exclusive(e_lease_type)); + timestr = timeval_string(talloc_tos(), + &fsp->open_time, + true); + + NDR_PRINT_DEBUG(share_mode_data, d); + DBG_ERR("file [%s] file_id [%s] gen_id [%lu] " + "open_time[%s] lease_type [0x%x] " + "oplock_type [0x%x]\n", + fsp_str_dbg(fsp), + file_id_string_tos(&fsp->file_id), + fsp->fh->gen_id, timestr, + e_lease_type, fsp->oplock_type); + + smb_panic("Found non-exclusive lease"); } + return true; } diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index c1b8201..e64457c 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -473,11 +473,13 @@ bool is_msdfs_link(connection_struct *conn, SMB_STRUCT_STAT *sbufp); struct junction_map; NTSTATUS get_referred_path(TALLOC_CTX *ctx, - const char *dfs_path, - bool allow_broken_path, - struct junction_map *jucn, - int *consumedcntp, - bool *self_referralp); + const char *dfs_path, + const struct tsocket_address *remote_address, + const struct tsocket_address *local_address, + bool allow_broken_path, + struct junction_map *jucn, + int *consumedcntp, + bool *self_referralp); int setup_dfs_referral(connection_struct *orig_conn, const char *dfs_path, int max_referral_level, diff --git a/source4/torture/smb2/lease.c b/source4/torture/smb2/lease.c index 3ee915c..da757b9 100644 --- a/source4/torture/smb2/lease.c +++ b/source4/torture/smb2/lease.c @@ -993,6 +993,87 @@ done: return ret; } +static bool test_lease_statopen2(struct torture_context *tctx, + struct smb2_tree *tree) +{ + TALLOC_CTX *mem_ctx = talloc_new(tctx); + struct smb2_create io; + struct smb2_lease ls; + struct smb2_handle h1 = {{0}}; + struct smb2_handle h2 = {{0}}; + struct smb2_handle h3 = {{0}}; + NTSTATUS status; + const char *fname = "lease_statopen2.dat"; + bool ret = true; + uint32_t caps; + + caps = smb2cli_conn_server_capabilities( + tree->session->transport->conn); + if (!(caps & SMB2_CAP_LEASING)) { + torture_skip(tctx, "leases are not supported"); + } + + smb2_util_unlink(tree, fname); + ZERO_STRUCT(break_info); + tree->session->transport->lease.handler = torture_lease_handler; + tree->session->transport->lease.private_data = tree; + + status = torture_smb2_testfile(tree, fname, &h1); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "smb2_create failed\n"); + smb2_util_close(tree, h1); + ZERO_STRUCT(h1); + + /* Open file with RWH lease. */ + smb2_lease_create_share(&io, &ls, false, fname, + smb2_util_share_access("RWD"), + LEASE1, + smb2_util_lease_state("RWH")); + io.in.desired_access = SEC_FILE_WRITE_DATA; + status = smb2_create(tree, mem_ctx, &io); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "smb2_create failed\n"); + h1 = io.out.file.handle; + CHECK_LEASE(&io, "RWH", true, LEASE1, 0); + + /* Stat open */ + ZERO_STRUCT(io); + io.in.desired_access = FILE_READ_ATTRIBUTES; + io.in.share_access = NTCREATEX_SHARE_ACCESS_MASK; + io.in.file_attributes = FILE_ATTRIBUTE_NORMAL; + io.in.create_disposition = NTCREATEX_DISP_OPEN; + io.in.fname = fname; + status = smb2_create(tree, mem_ctx, &io); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "smb2_create failed\n"); + h2 = io.out.file.handle; + + /* Open file with RWH lease. */ + smb2_lease_create_share(&io, &ls, false, fname, + smb2_util_share_access("RWD"), + LEASE1, + smb2_util_lease_state("RWH")); + io.in.desired_access = SEC_FILE_WRITE_DATA; + status = smb2_create(tree, mem_ctx, &io); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "smb2_create failed\n"); + h3 = io.out.file.handle; + CHECK_LEASE(&io, "RWH", true, LEASE1, 0); + +done: + if (!smb2_util_handle_empty(h3)) { + smb2_util_close(tree, h3); + } + if (!smb2_util_handle_empty(h2)) { + smb2_util_close(tree, h2); + } + if (!smb2_util_handle_empty(h1)) { + smb2_util_close(tree, h1); + } + smb2_util_unlink(tree, fname); + talloc_free(mem_ctx); + return ret; +} static void torture_oplock_break_callback(struct smb2_request *req) { @@ -3920,6 +4001,7 @@ struct torture_suite *torture_smb2_lease_init(void) torture_suite_add_1smb2_test(suite, "nobreakself", test_lease_nobreakself); torture_suite_add_1smb2_test(suite, "statopen", test_lease_statopen); + torture_suite_add_1smb2_test(suite, "statopen2", test_lease_statopen2); torture_suite_add_1smb2_test(suite, "upgrade", test_lease_upgrade); torture_suite_add_1smb2_test(suite, "upgrade2", test_lease_upgrade2); torture_suite_add_1smb2_test(suite, "upgrade3", test_lease_upgrade3); -- Samba Shared Repository