summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2020-04-21 14:54:25 +0200
committerStefan Metzmacher <metze@samba.org>2020-05-14 22:06:32 +0000
commit01db877c7766387984ef32914eca0b2e817c4c6a (patch)
tree41b643694db47b7aba31892f5e89a12b25ab78f1
parent8e4583f730abd1a210ec52d5a060dddc4ad850bb (diff)
downloadsamba-01db877c7766387984ef32914eca0b2e817c4c6a.tar.gz
srvsvc: Move brl_get_locks() out of enum_file_fn()
With share_infos.tdb this is a locking order violation: share_infos.tdb is level 4, brlock.tdb is level 2. Avoid this by first walking the share_infos.tdb and then fetching all the brlock entries. Bug: https://bugzilla.samba.org/show_bug.cgi?id=14355 Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> Autobuild-User(master): Stefan Metzmacher <metze@samba.org> Autobuild-Date(master): Thu May 14 22:06:32 UTC 2020 on sn-devel-184
-rw-r--r--selftest/knownfail.d/netfileenum1
-rw-r--r--source3/rpc_server/srvsvc/srv_srvsvc_nt.c30
2 files changed, 17 insertions, 14 deletions
diff --git a/selftest/knownfail.d/netfileenum b/selftest/knownfail.d/netfileenum
deleted file mode 100644
index 2d3b6fae117..00000000000
--- a/selftest/knownfail.d/netfileenum
+++ /dev/null
@@ -1 +0,0 @@
-^samba3.blackbox.netfileenum.netfileenum\(simpleserver:local\)
diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
index c7bd28509fc..3fb8427693b 100644
--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
@@ -92,9 +92,6 @@ static int enum_file_fn(struct file_id id,
struct srvsvc_NetFileCtr3 *ctr3 = fenum->ctr3;
struct srvsvc_NetFileInfo3 *f;
struct file_id *fids = NULL;
- files_struct fsp;
- struct byte_range_lock *brl;
- int num_locks = 0;
char *fullpath = NULL;
uint32_t permissions;
const char *username;
@@ -132,15 +129,6 @@ static int enum_file_fn(struct file_id id,
fids[ctr3->count] = id;
fenum->fids = fids;
- /* need to count the number of locks on a file */
-
- fsp = (struct files_struct) { .file_id = id, };
-
- if ( (brl = brl_get_locks(talloc_tos(), &fsp)) != NULL ) {
- num_locks = brl_num_locks(brl);
- TALLOC_FREE(brl);
- }
-
if ( strcmp(d->base_name, "." ) == 0 ) {
fullpath = talloc_asprintf(
fenum->ctx,
@@ -168,7 +156,6 @@ static int enum_file_fn(struct file_id id,
.fid = (((uint32_t)(procid_to_pid(&e->pid))<<16) |
e->share_file_id),
.permissions = permissions,
- .num_locks = num_locks,
.path = fullpath,
.user = username,
};
@@ -189,11 +176,28 @@ static WERROR net_enum_files(TALLOC_CTX *ctx,
struct file_enum_count f_enum_cnt = {
.ctx = ctx, .username = username, .ctr3 = *ctr3,
};
+ uint32_t i;
share_entry_forall(enum_file_fn, (void *)&f_enum_cnt );
*ctr3 = f_enum_cnt.ctr3;
+ /* need to count the number of locks on a file */
+
+ for (i=0; i<(*ctr3)->count; i++) {
+ struct files_struct fsp = { .file_id = f_enum_cnt.fids[i], };
+ struct byte_range_lock *brl = NULL;
+
+ brl = brl_get_locks(ctx, &fsp);
+ if (brl == NULL) {
+ continue;
+ }
+
+ (*ctr3)->array[i].num_locks = brl_num_locks(brl);
+
+ TALLOC_FREE(brl);
+ }
+
return WERR_OK;
}