1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-03 04:22:09 +03:00

loadparm: check for AD DC required VFS modules

When Samba is running as a domain controller and the "vfs objects"
parameter is not set, then the dfs_samba4 and acl_xattr modules are
automatically enabled.
However, if the "vfs objects" is defined, then the setting is left
as-is. This means that attempts to us other VFS modules have the side
effect of disabling the dfs_samba4 and acl_xattr modules, causing
unexpected behaviour, which is then blamed on the VFS modules that were
explicitly defined.

This change ensures that when running as a domain controller, Samba logs
an error if the required VFS modules are not enabled by an explicit
"vfs objects" definition.

Bug: https://bugzilla.samba.org/show_bug.cgi?id=10560

Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Björn Jacke <bjacke@samba.org>
This commit is contained in:
David Disseldorp
2020-01-03 14:31:28 +01:00
committed by Bjoern Jacke
parent 1d0ffcf30e
commit 4d4443d1e5

View File

@ -2740,6 +2740,38 @@ static bool do_parameter(const char *pszParmName, const char *pszParmValue,
}
}
static const char *ad_dc_req_vfs_mods[] = {"dfs_samba4", "acl_xattr", NULL};
/*
* check that @vfs_objects includes all vfs modules required by an AD DC.
*/
static bool check_ad_dc_required_mods(const char **vfs_objects)
{
int i;
int j;
int got_req;
for (i = 0; ad_dc_req_vfs_mods[i] != NULL; i++) {
got_req = false;
for (j = 0; vfs_objects[j] != NULL; j++) {
if (!strwicmp(ad_dc_req_vfs_mods[i], vfs_objects[j])) {
got_req = true;
break;
}
}
if (!got_req) {
DEBUG(0, ("vfs objects specified without required AD "
"DC module: %s\n", ad_dc_req_vfs_mods[i]));
return false;
}
}
DEBUG(6, ("vfs objects specified with all required AD DC modules\n"));
return true;
}
/***************************************************************************
Initialize any local variables in the sDefault table, after parsing a
[globals] section.
@ -2759,7 +2791,10 @@ static void init_locals(void)
*/
if (lp_server_role() == ROLE_ACTIVE_DIRECTORY_DC) {
const char **vfs_objects = lp_vfs_objects(-1);
if (!vfs_objects || !vfs_objects[0]) {
if (vfs_objects != NULL) {
/* ignore return, only warn if modules are missing */
check_ad_dc_required_mods(vfs_objects);
} else {
if (lp_parm_const_string(-1, "xattr_tdb", "file", NULL)) {
lp_do_parameter(-1, "vfs objects", "dfs_samba4 acl_xattr xattr_tdb");
} else if (lp_parm_const_string(-1, "posix", "eadb", NULL)) {