[SCM] Samba Shared Repository - branch v4-10-stable updated
Karolin Seeger
kseeger at samba.org
Tue Mar 19 10:16:20 UTC 2019
The branch, v4-10-stable has been updated
via 25f2fe02a61 VERSION: Disable GIT_SNAPSHOT for the 4.10.0 release.
via 983bcc352cb VERSION: Bump version up to 4.10.0.
via 5da71ca11d4 WHATSNEW: Add release notes for Samba 4.10.0.
via 00ea6a7d24e lib:util: Move debug message for mkdir failing to log level 1
via 6d901af0f1c lib/winbind_util: Add winbind_xid_to_sid for --without-winbind
via 3c32774b925 lib/winbind_util: Move include out of ifdef
via 545914afefa passdb: Update ABI to 0.27.2
via 2021080a41d passdb: Make [ug]id_to_sid use xid_to_sid
via 8c0268a5fec passdb: Introduce xid_to_sid
via 10a0d77f17c lib: Introduce winbind_xid_to_sid
via ba6dd781d4a winbind: Use idmap_cache_find_xid2sid
via a20e68bcc63 torture: Add tests for idmap cache
via f6f0994a597 idmap_cache: Introduce idmap_cache_find_xid2sid
via 6434de2b76d winbind: Now we explicitly track if we got ids from cache
via 465bd07ff70 winbind: Initialize "expired" parameter to idmap_cache_xid2sid
via 1df6720d74b idmap_cache: Only touch "sid" on success in find_xid_to_sid
via 41c1870a8c2 lib: Make idmap_cache return negative mappings
via 5c2a243d3e7 CI: don't use swap
via 7bd135d25d6 s4/scripting/bin: open unicode files with utf8 encoding and write unicode string
via 5d0e2bf8190 libcli/security: fix handling of deny type ACEs in access_check_max_allowed()
via cc7629a20e9 s4:torture: Add test_deny1().
via c9b6b7ed4be s4:torture: Add test_owner_rights_deny1().
via 1dc2e296f17 libcli/security: correct access check and maximum access calculation for Owner Rights ACEs
via 3026c1a36c3 s4:torture: Add test_owner_rights_deny().
via 63f0db77204 s4:torture: Fix the test_owner_rights() test to show permissions are additive.
via 7e95499d39a libcli/security: add "Owner Rights" calculation to access_check_max_allowed()
via ac08949dcdf s4:torture: add a Maximum Access check with an Owner Rights ACE
via 3b52cba505a s4:libcli: remember return code from maximum access
via 49bac77e789 autobuild: Add -py2 tests for new split backup/restore testenvs
via 9f85efa76d3 autobuild: Split backup/restore testenvs out into separate job
via ea33a7b0911 sambaundoguididx: use the right escaped oder unescaped sam ldb files
via 2f4d8214601 s4-server: Open and close a transaction on sam.ldb at startup
via 0e80b245bf4 WHATSNEW: mention new vfs_glusterfs_fuse module
via 9169e9722d6 VERSION: Bump version up to 4.10.0rc5...
from e399a0209f4 VERSION: Disable GIT_SNAPSHOT for the 4.10.0rc4 release.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-10-stable
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
.gitlab-ci.yml | 17 +-
VERSION | 2 +-
WHATSNEW.txt | 58 ++-
lib/util/util.c | 6 +-
libcli/security/access_check.c | 127 +++--
script/autobuild.py | 13 +
source3/lib/idmap_cache.c | 48 +-
source3/lib/idmap_cache.h | 2 +
source3/lib/winbind_util.c | 41 +-
source3/lib/winbind_util.h | 2 +
...passdb-0.27.1.sigs => samba-passdb-0.27.2.sigs} | 2 +
source3/passdb/lookup_sid.c | 235 +++------
source3/passdb/lookup_sid.h | 1 +
source3/selftest/tests.py | 1 +
source3/torture/proto.h | 1 +
source3/torture/test_idmap_cache.c | 122 +++++
source3/torture/torture.c | 1 +
source3/winbindd/wb_xids2sids.c | 33 +-
source3/wscript_build | 3 +-
source4/libcli/raw/interfaces.h | 1 +
source4/libcli/smb2/create.c | 4 +-
source4/scripting/bin/gen_ntstatus.py | 11 +-
source4/scripting/bin/gen_werror.py | 11 +-
source4/scripting/bin/sambaundoguididx | 3 +-
source4/smbd/server.c | 42 ++
source4/torture/smb2/acls.c | 558 +++++++++++++++++++++
26 files changed, 1066 insertions(+), 279 deletions(-)
copy source3/passdb/ABI/{samba-passdb-0.27.1.sigs => samba-passdb-0.27.2.sigs} (99%)
create mode 100644 source3/torture/test_idmap_cache.c
Changeset truncated at 500 lines:
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 04d57cb0491..4249f5296b3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -7,12 +7,7 @@ variables:
GIT_DEPTH: "3"
before_script:
- - echo "Build starting (preparing swap)..."
- - if [ $(df -m / --output=avail | tail -n1) -gt 10240 ]; then
- sudo dd if=/dev/zero of=/samba-swap bs=1M count=6144;
- sudo mkswap /samba-swap;
- sudo swapon /samba-swap;
- fi
+ - echo "Build starting..."
after_script:
- tar -xf logs.tar.gz system-info.txt -O
@@ -61,6 +56,16 @@ build_samba_ad_dc_2:
# this one takes about 1 hours to finish
- script/autobuild.py samba-ad-dc-2 --verbose --nocleanup --keeplogs --tail --testbase /tmp/samba-testbase
+build_samba_ad_dc_backup:
+ <<: *shared_template
+ script:
+ - script/autobuild.py samba-ad-dc-backup --verbose --nocleanup --keeplogs --tail --testbase /tmp/samba-testbase
+
+build_samba_ad_dc_backup_py2:
+ <<: *shared_template
+ script:
+ - script/autobuild.py samba-ad-dc-backup-py2 --verbose --nocleanup --keeplogs --tail --testbase /tmp/samba-testbase
+
build_samba_ad_dc_2_py2:
<<: *shared_template
script:
diff --git a/VERSION b/VERSION
index a07b000b709..48820391c4f 100644
--- a/VERSION
+++ b/VERSION
@@ -87,7 +87,7 @@ SAMBA_VERSION_PRE_RELEASE=
# e.g. SAMBA_VERSION_RC_RELEASE=1 #
# -> "3.0.0rc1" #
########################################################
-SAMBA_VERSION_RC_RELEASE=4
+SAMBA_VERSION_RC_RELEASE=
########################################################
# To mark SVN snapshots this should be set to 'yes' #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 875d168e749..5d3d23ab9da 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,16 +1,11 @@
-Release Announcements
-=====================
+ ==============================
+ Release Notes for Samba 4.10.0
+ March 19, 2019
+ ==============================
-This is the fourth release candidate of Samba 4.10. This is *not*
-intended for production environments and is designed for testing
-purposes only. Please report any defects via the Samba bug reporting
-system at https://bugzilla.samba.org/.
-Samba 4.10 will be the next version of the Samba suite.
-
-
-UPGRADING
-=========
+This is the first stable release of the Samba 4.10 release series.
+Please read the release notes carefully before upgrading.
NEW FEATURES/CHANGES
@@ -194,6 +189,19 @@ DC that had SMBv1 disabled. SMBv2 support has now been added for samba-tool.
The affected commands are 'samba-tool domain backup|rename' and the
'samba-tool gpo' set of commands. Refer also bug #13676.
+New glusterfs_fuse VFS module
+-----------------------------
+
+The new vfs_glusterfs_fuse module improves performance when Samba
+accesses a glusterfs volume mounted via FUSE (Filesystem in Userspace
+as part of the Linux kernel). It achieves that by leveraging a
+mechanism to retrieve the appropriate case of filenames by querying a
+specific extended attribute in the filesystem. No extra configuration
+is required to use this module, only glusterfs_fuse needs to be set in
+the "vfs objects" parameter. Further details can be found in the
+vfs_glusterfs_fuse(8) manpage. This new vfs_glusterfs_fuse module does
+not replace the existing vfs_glusterfs module, it just provides an
+additional, alternative mechanism to access a Gluster volume.
REMOVED FEATURES
================
@@ -242,6 +250,34 @@ smb.conf changes
sharemode" but for SMB getinfo
+CHANGES SINCE 4.10.0rc4
+=======================
+
+o Andrew Bartlett <abartlet at samba.org>
+ * BUG 13760: s4-server: Open and close a transaction on sam.ldb at startup.
+
+o Ralph Boehme <slow at samba.org>
+ * BUG 13812: access_check_max_allowed() doesn't process "Owner Rights" ACEs.
+
+o Joe Guo <joeg at catalyst.net.nz>
+ * s4/scripting/bin: Open unicode files with utf8 encoding and write
+ * unicode string.
+
+o Björn Jacke <bj at sernet.de>
+ * BUG 13759: sambaundoguididx: Use the right escaped oder unescaped sam ldb
+ files.
+
+o Volker Lendecke <vl at samba.org>
+ * BUG 13813: Fix idmap cache pollution with S-1-22- IDs on winbind hickup.
+
+o Christof Schmitt <cs at samba.org>
+ * passdb: Update ABI to 0.27.2.
+ * BUG 13813: lib/winbind_util: Add winbind_xid_to_sid for --without-winbind.
+
+o Andreas Schneider <asn at samba.org>
+ * BUG 13823: lib:util: Move debug message for mkdir failing to log level 1.
+
+
CHANGES SINCE 4.10.0rc3
=======================
diff --git a/lib/util/util.c b/lib/util/util.c
index f52f69c6ef0..dc1772c839e 100644
--- a/lib/util/util.c
+++ b/lib/util/util.c
@@ -200,9 +200,9 @@ _PUBLIC_ bool directory_create_or_exist(const char *dname,
old_umask = umask(0);
ret = mkdir(dname, dir_perms);
if (ret == -1 && errno != EEXIST) {
- DEBUG(0, ("mkdir failed on directory "
- "%s: %s\n", dname,
- strerror(errno)));
+ DBG_WARNING("mkdir failed on directory %s: %s\n",
+ dname,
+ strerror(errno));
umask(old_umask);
return false;
}
diff --git a/libcli/security/access_check.c b/libcli/security/access_check.c
index 03a7dca4adf..322f4fdb0c6 100644
--- a/libcli/security/access_check.c
+++ b/libcli/security/access_check.c
@@ -109,24 +109,61 @@ static uint32_t access_check_max_allowed(const struct security_descriptor *sd,
const struct security_token *token)
{
uint32_t denied = 0, granted = 0;
+ bool am_owner = false;
+ bool have_owner_rights_ace = false;
unsigned i;
+ if (sd->dacl == NULL) {
+ if (security_token_has_sid(token, sd->owner_sid)) {
+ granted |= SEC_STD_WRITE_DAC | SEC_STD_READ_CONTROL;
+ }
+ return granted;
+ }
+
if (security_token_has_sid(token, sd->owner_sid)) {
- granted |= SEC_STD_WRITE_DAC | SEC_STD_READ_CONTROL;
+ /*
+ * Check for explicit owner rights: if there are none, we remove
+ * the default owner right SEC_STD_WRITE_DAC|SEC_STD_READ_CONTROL
+ * from remaining_access. Otherwise we just process the
+ * explicitly granted rights when processing the ACEs.
+ */
+ am_owner = true;
+
+ for (i=0; i < sd->dacl->num_aces; i++) {
+ struct security_ace *ace = &sd->dacl->aces[i];
+
+ if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY) {
+ continue;
+ }
+
+ have_owner_rights_ace = dom_sid_equal(
+ &ace->trustee, &global_sid_Owner_Rights);
+ if (have_owner_rights_ace) {
+ break;
+ }
+ }
}
- if (sd->dacl == NULL) {
- return granted & ~denied;
+ if (am_owner && !have_owner_rights_ace) {
+ granted |= SEC_STD_WRITE_DAC|SEC_STD_READ_CONTROL;
}
for (i = 0;i<sd->dacl->num_aces; i++) {
struct security_ace *ace = &sd->dacl->aces[i];
+ bool is_owner_rights_ace = false;
if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY) {
continue;
}
- if (!security_token_has_sid(token, &ace->trustee)) {
+ if (am_owner) {
+ is_owner_rights_ace = dom_sid_equal(
+ &ace->trustee, &global_sid_Owner_Rights);
+ }
+
+ if (!is_owner_rights_ace &&
+ !security_token_has_sid(token, &ace->trustee))
+ {
continue;
}
@@ -136,7 +173,7 @@ static uint32_t access_check_max_allowed(const struct security_descriptor *sd,
break;
case SEC_ACE_TYPE_ACCESS_DENIED:
case SEC_ACE_TYPE_ACCESS_DENIED_OBJECT:
- denied |= ace->access_mask;
+ denied |= ~granted & ace->access_mask;
break;
default: /* Other ACE types not handled/supported */
break;
@@ -159,16 +196,8 @@ NTSTATUS se_access_check(const struct security_descriptor *sd,
uint32_t i;
uint32_t bits_remaining;
uint32_t explicitly_denied_bits = 0;
- /*
- * Up until Windows Server 2008, owner always had these rights. Now
- * we have to use Owner Rights perms if they are on the file.
- *
- * In addition we have to accumulate these bits and apply them
- * correctly. See bug #8795
- */
- uint32_t owner_rights_allowed = 0;
- uint32_t owner_rights_denied = 0;
- bool owner_rights_default = true;
+ bool am_owner = false;
+ bool have_owner_rights_ace = false;
*access_granted = access_desired;
bits_remaining = access_desired;
@@ -198,35 +227,50 @@ NTSTATUS se_access_check(const struct security_descriptor *sd,
goto done;
}
+ if (security_token_has_sid(token, sd->owner_sid)) {
+ /*
+ * Check for explicit owner rights: if there are none, we remove
+ * the default owner right SEC_STD_WRITE_DAC|SEC_STD_READ_CONTROL
+ * from remaining_access. Otherwise we just process the
+ * explicitly granted rights when processing the ACEs.
+ */
+ am_owner = true;
+
+ for (i=0; i < sd->dacl->num_aces; i++) {
+ struct security_ace *ace = &sd->dacl->aces[i];
+
+ if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY) {
+ continue;
+ }
+
+ have_owner_rights_ace = dom_sid_equal(
+ &ace->trustee, &global_sid_Owner_Rights);
+ if (have_owner_rights_ace) {
+ break;
+ }
+ }
+ }
+ if (am_owner && !have_owner_rights_ace) {
+ bits_remaining &= ~(SEC_STD_WRITE_DAC | SEC_STD_READ_CONTROL);
+ }
+
/* check each ace in turn. */
for (i=0; bits_remaining && i < sd->dacl->num_aces; i++) {
struct security_ace *ace = &sd->dacl->aces[i];
+ bool is_owner_rights_ace = false;
if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY) {
continue;
}
- /*
- * We need the Owner Rights permissions to ensure we
- * give or deny the correct permissions to the owner. Replace
- * owner_rights with the perms here if it is present.
- *
- * We don't care if we are not the owner because that is taken
- * care of below when we check if our token has the owner SID.
- *
- */
- if (dom_sid_equal(&ace->trustee, &global_sid_Owner_Rights)) {
- if (ace->type == SEC_ACE_TYPE_ACCESS_ALLOWED) {
- owner_rights_allowed |= ace->access_mask;
- owner_rights_default = false;
- } else if (ace->type == SEC_ACE_TYPE_ACCESS_DENIED) {
- owner_rights_denied |= (bits_remaining & ace->access_mask);
- owner_rights_default = false;
- }
- continue;
+ if (am_owner) {
+ is_owner_rights_ace = dom_sid_equal(
+ &ace->trustee, &global_sid_Owner_Rights);
}
- if (!security_token_has_sid(token, &ace->trustee)) {
+ if (!is_owner_rights_ace &&
+ !security_token_has_sid(token, &ace->trustee))
+ {
continue;
}
@@ -246,21 +290,6 @@ NTSTATUS se_access_check(const struct security_descriptor *sd,
/* Explicitly denied bits always override */
bits_remaining |= explicitly_denied_bits;
- /* The owner always gets owner rights as defined above. */
- if (security_token_has_sid(token, sd->owner_sid)) {
- if (owner_rights_default) {
- /*
- * Just remove them, no need to check if they are
- * there.
- */
- bits_remaining &= ~(SEC_STD_WRITE_DAC |
- SEC_STD_READ_CONTROL);
- } else {
- bits_remaining &= ~owner_rights_allowed;
- bits_remaining |= owner_rights_denied;
- }
- }
-
/*
* We check privileges here because they override even DENY entries.
*/
diff --git a/script/autobuild.py b/script/autobuild.py
index 2ea9e55b932..67c18a1aa35 100755
--- a/script/autobuild.py
+++ b/script/autobuild.py
@@ -51,6 +51,8 @@ builddirs = {
"samba-ad-dc-py2": ".",
"samba-ad-dc-2": ".",
"samba-ad-dc-2-py2": ".",
+ "samba-ad-dc-backup": ".",
+ "samba-ad-dc-backup-py2": ".",
"samba-systemkrb5": ".",
"samba-nopython": ".",
"samba-buildpy2-only": ".",
@@ -166,6 +168,17 @@ tasks = {
"--include-env=vampire_2000_dc "
"--include-env=fl2000dc "
"--include-env=ad_dc_no_nss "
+ "'",
+ "text/plain"),
+ ("check-clean-tree", "script/clean-source-tree.sh", "text/plain")],
+
+ # run the backup/restore testenvs separately as they're fairly standalone
+ # (and CI seems to max out at ~8 different DCs running at once)
+ "samba-ad-dc-backup": [("random-sleep", "script/random-sleep.sh 60 600", "text/plain"),
+ ("configure", "./configure.developer --with-selftest-prefix=./bin/ab" + samba_configure_params, "text/plain"),
+ ("make", "make -j", "text/plain"),
+ ("test", "make test FAIL_IMMEDIATELY=1 "
+ "TESTS='${PY3_ONLY}"
"--include-env=backupfromdc "
"--include-env=restoredc "
"--include-env=renamedc "
diff --git a/source3/lib/idmap_cache.c b/source3/lib/idmap_cache.c
index 77618dd5aa1..9d2149844ed 100644
--- a/source3/lib/idmap_cache.c
+++ b/source3/lib/idmap_cache.c
@@ -203,19 +203,23 @@ static void idmap_cache_xid2sid_parser(const struct gencache_timeout *timeout,
(struct idmap_cache_xid2sid_state *)private_data;
char *value;
- ZERO_STRUCTP(state->sid);
- state->ret = false;
-
if ((blob.length == 0) || (blob.data[blob.length-1] != 0)) {
/*
* Not a string, can't be a valid mapping
*/
+ state->ret = false;
return;
}
value = (char *)blob.data;
- if (value[0] != '-') {
+ if ((value[0] == '-') && (value[1] == '\0')) {
+ /*
+ * Return NULL SID, see comment to uid2sid
+ */
+ *state->sid = (struct dom_sid) {0};
+ state->ret = true;
+ } else {
state->ret = string_to_sid(state->sid, value);
}
if (state->ret) {
@@ -273,6 +277,42 @@ bool idmap_cache_find_gid2sid(gid_t gid, struct dom_sid *sid, bool *expired)
return state.ret;
}
+/**
+ * Find a xid2sid mapping
+ * @param[in] id the unix id to map
+ * @param[out] sid where to put the result
+ * @param[out] expired is the cache entry expired?
+ * @retval Was anything in the cache at all?
+ *
+ * If "is_null_sid(sid)", this was a negative mapping.
+ */
+bool idmap_cache_find_xid2sid(
+ const struct unixid *id, struct dom_sid *sid, bool *expired)
+{
+ struct idmap_cache_xid2sid_state state = {
+ .sid = sid, .expired = expired
+ };
+ fstring key;
+ char c;
+
+ switch (id->type) {
+ case ID_TYPE_UID:
+ c = 'U';
+ break;
+ case ID_TYPE_GID:
+ c = 'G';
+ break;
+ default:
+ return false;
+ }
+
+ fstr_sprintf(key, "IDMAP/%cID2SID/%d", c, (int)id->id);
+
+ gencache_parse(key, idmap_cache_xid2sid_parser, &state);
+ return state.ret;
+}
+
+
/**
* Store a mapping in the idmap cache
* @param[in] sid the sid to map
diff --git a/source3/lib/idmap_cache.h b/source3/lib/idmap_cache.h
index dc497022e3b..d5afa170e1a 100644
--- a/source3/lib/idmap_cache.h
+++ b/source3/lib/idmap_cache.h
@@ -31,6 +31,8 @@ bool idmap_cache_find_sid2gid(const struct dom_sid *sid, gid_t *pgid,
bool *expired);
bool idmap_cache_find_uid2sid(uid_t uid, struct dom_sid *sid, bool *expired);
bool idmap_cache_find_gid2sid(gid_t gid, struct dom_sid *sid, bool *expired);
+bool idmap_cache_find_xid2sid(
+ const struct unixid *id, struct dom_sid *sid, bool *expired);
void idmap_cache_set_sid2unixid(const struct dom_sid *sid, struct unixid *unix_id);
bool idmap_cache_del_uid(uid_t uid);
diff --git a/source3/lib/winbind_util.c b/source3/lib/winbind_util.c
index a072166ce18..0c1f2c2552a 100644
--- a/source3/lib/winbind_util.c
+++ b/source3/lib/winbind_util.c
@@ -23,10 +23,10 @@
#include "../lib/util/util_pw.h"
#include "nsswitch/libwbclient/wbclient.h"
-#if defined(WITH_WINBIND)
-
#include "lib/winbind_util.h"
+#if defined(WITH_WINBIND)
+
struct passwd * winbind_getpwnam(const char * name)
{
wbcErr result;
@@ -198,6 +198,36 @@ bool winbind_gid_to_sid(struct dom_sid *sid, gid_t gid)
return (result == WBC_ERR_SUCCESS);
}
+bool winbind_xid_to_sid(struct dom_sid *sid, const struct unixid *xid)
+{
+ struct wbcUnixId wbc_xid;
+ struct wbcDomainSid dom_sid;
+ wbcErr result;
+
+ switch (xid->type) {
+ case ID_TYPE_UID:
+ wbc_xid = (struct wbcUnixId) {
+ .type = WBC_ID_TYPE_UID, .id.uid = xid->id
+ };
+ break;
+ case ID_TYPE_GID:
+ wbc_xid = (struct wbcUnixId) {
+ .type = WBC_ID_TYPE_GID, .id.gid = xid->id
+ };
+ break;
+ default:
+ return false;
+ }
+
+ result = wbcUnixIdsToSids(&wbc_xid, 1, &dom_sid);
+ if (result != WBC_ERR_SUCCESS) {
--
Samba Shared Repository
More information about the samba-cvs
mailing list