[SCM] Samba Shared Repository - branch v4-6-stable updated
Karolin Seeger
kseeger at samba.org
Wed Feb 14 11:11:05 UTC 2018
The branch, v4-6-stable has been updated
via fd09a02 VERSION: Disable GIT_SNAPSHOT for the 4.6.13 release.
via 38e71ba WHATSNEW: Add release notes for Samba 4.6.13.
via 666c680 build: fix ceph_statx check when configured with libcephfs_dir
via 3015558 vfs_fruit: set delete-on-close for empty finderinfo
via 9e47e9e vfs_fruit: filter out AFP_AfpInfo streams with pending delete-on-close
via c1e0396 vfs_fruit: factor out delete_invalid_meta_stream() from fruit_streaminfo_meta_stream()
via d95b278 s4/torture/fruit: enhance zero AFP_AfpInfo stream test
via 26da45b s4/torture/fruit: ensure AFP_AfpInfo blobs are 0-initialized
via 21d0446 vfs_default: use VFS statvfs macro in fs_capabilities
via a6b780c vfs_ceph: add fs_capabilities hook to avoid local statvfs
via 579b6a4 s3: smbd: Use identical logic to test for kernel oplocks on a share.
via 6ba6125 smbd: Fix coredump on failing chdir during logoff
via 60eb51d selftest: Add test for failing chdir call in smbd
via e6ec5ae selftest: Make location of log file available in tests
via 90d87d4 selftest: Add share for error injection testing
via 919d16e vfs_error_inject: Add new module
via d932fcf ctdb-recovery-helper: Deregister message handler in error paths
via a3dc640 sysacls: change datatypes to 32 bits
via e64528a pysmbd: fix use of sysacl API
via f502340 HEIMDAL:kdc: fix dh->q allocation check in get_dh_param()
via c6dfb4e HEIMDAL: don't bother seeing q if not sent
via 03c69a5 HEIMDAL: allow optional q in DH DomainParameters
via f69814f g_lock: fix cleanup of stale entries in g_lock_trylock()
via e39dcec s4:kdc: only map SDB_ERR_NOT_FOUND_HERE to HDB_ERR_NOT_FOUND_HERE
via 51fb772 VERSION: Bump version up to 4.6.13...
from 1377b56 VERSION: Disable GIT_SNAPSHOT for the 4.6.12 release.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-6-stable
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
VERSION | 2 +-
WHATSNEW.txt | 74 +++++++++++++-
ctdb/server/ctdb_recovery_helper.c | 16 ++-
selftest/selftest.pl | 1 +
selftest/target/Samba3.pm | 4 +
source3/include/smb_acls.h | 10 +-
source3/lib/g_lock.c | 6 +-
source3/modules/vfs_ceph.c | 15 +++
source3/modules/vfs_default.c | 14 +--
source3/modules/vfs_error_inject.c | 99 ++++++++++++++++++
source3/modules/vfs_fruit.c | 172 ++++++++++++++++++++++++--------
source3/modules/wscript_build | 7 ++
source3/script/tests/test_smbd_error.sh | 56 +++++++++++
source3/selftest/tests.py | 3 +
source3/smbd/oplock.c | 25 +++--
source3/smbd/pysmbd.c | 43 +++++++-
source3/smbd/server_exit.c | 4 -
source3/wscript | 10 +-
source4/heimdal/kdc/pkinit.c | 11 +-
source4/heimdal/lib/asn1/rfc2459.asn1 | 2 +-
source4/heimdal/lib/krb5/pkinit.c | 7 +-
source4/kdc/hdb-samba4.c | 24 +++--
source4/torture/vfs/fruit.c | 89 ++++++++++++++++-
23 files changed, 604 insertions(+), 90 deletions(-)
create mode 100644 source3/modules/vfs_error_inject.c
create mode 100755 source3/script/tests/test_smbd_error.sh
Changeset truncated at 500 lines:
diff --git a/VERSION b/VERSION
index 0c4ca38..8a613d1 100644
--- a/VERSION
+++ b/VERSION
@@ -25,7 +25,7 @@
########################################################
SAMBA_VERSION_MAJOR=4
SAMBA_VERSION_MINOR=6
-SAMBA_VERSION_RELEASE=12
+SAMBA_VERSION_RELEASE=13
########################################################
# If a official release has a serious bug #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index a759fa9..992007d 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,4 +1,74 @@
==============================
+ Release Notes for Samba 4.6.13
+ February 14, 2017
+ =============================
+
+
+This is the latest stable release of the Samba 4.6 release series.
+
+
+Changes since 4.6.12:
+---------------------
+
+o Jeremy Allison <jra at samba.org>
+ * BUG 13193: s3: smbd: Use identical logic to test for kernel oplocks on a
+ share.
+
+o Love Hornquist Astrand <lha at h5l.org>
+ * BUG 12986: Kerberos: PKINIT: Can't decode algorithm parameters in
+ clientPublicValue.
+
+o Ralph Boehme <slow at samba.org>
+ * BUG 13181: vfs_fruit: Fail to copy file with empty FinderInfo from Windows
+ client to Samba share with fruit.
+
+o David Disseldorp <ddiss at suse.de>
+ * BUG 13208: vfs_default: Use VFS statvfs macro in fs_capabilities.
+ * BUG 13250: build: Fix ceph_statx check when configured with libcephfs_dir.
+
+o Amitay Isaacs <amitay at gmail.com>
+ * BUG 13188: ctdb-recovery-helper: Deregister message handler in error
+ paths.
+
+o Christof Schmitt <cs at samba.org>
+ * BUG 13189: smbd: Fix coredump on failing chdir during logoff.
+
+o Stefan Metzmacher <metze at samba.org>
+ * BUG 12986: Kerberos: PKINIT: Can't decode algorithm parameters in
+ clientPublicValue.
+ * BUG 13132: s4:kdc: Only map SDB_ERR_NOT_FOUND_HERE to
+ HDB_ERR_NOT_FOUND_HERE.
+ * BUG 13195: g_lock: fix cleanup of stale entries in g_lock_trylock().
+
+o Uri Simchoni <uri at samba.org>
+ * BUG 13176: Fix POSIX ACL support on hpux and possibly other
+ big-endian OSs.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical IRC channel on irc.freenode.net.
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored. All bug reports should
+be filed under the "Samba 4.1 and newer" product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
+
+ ==============================
Release Notes for Samba 4.6.12
December 20, 2017
=============================
@@ -90,8 +160,8 @@ database (https://bugzilla.samba.org/).
======================================================================
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
+
==============================
Release Notes for Samba 4.6.11
diff --git a/ctdb/server/ctdb_recovery_helper.c b/ctdb/server/ctdb_recovery_helper.c
index 474b900..2c7bb4b 100644
--- a/ctdb/server/ctdb_recovery_helper.c
+++ b/ctdb/server/ctdb_recovery_helper.c
@@ -428,6 +428,7 @@ struct pull_database_state {
uint32_t pnn;
uint64_t srvid;
int num_records;
+ int result;
};
static void pull_database_handler(uint64_t srvid, TDB_DATA data,
@@ -625,8 +626,8 @@ static void pull_database_new_done(struct tevent_req *subreq)
if (! status) {
LOG("control DB_PULL failed for %s on node %u, ret=%d\n",
recdb_name(state->recdb), state->pnn, ret);
- tevent_req_error(req, ret);
- return;
+ state->result = ret;
+ goto unregister;
}
ret = ctdb_reply_control_db_pull(reply, &num_records);
@@ -634,13 +635,15 @@ static void pull_database_new_done(struct tevent_req *subreq)
if (num_records != state->num_records) {
LOG("mismatch (%u != %u) in DB_PULL records for %s\n",
num_records, state->num_records, recdb_name(state->recdb));
- tevent_req_error(req, EIO);
- return;
+ state->result = EIO;
+ goto unregister;
}
LOG("Pulled %d records for db %s from node %d\n",
state->num_records, recdb_name(state->recdb), state->pnn);
+unregister:
+
subreq = ctdb_client_remove_message_handler_send(
state, state->ev, state->client,
state->srvid, req);
@@ -668,6 +671,11 @@ static void pull_database_unregister_done(struct tevent_req *subreq)
return;
}
+ if (state->result != 0) {
+ tevent_req_error(req, state->result);
+ return;
+ }
+
tevent_req_done(req);
}
diff --git a/selftest/selftest.pl b/selftest/selftest.pl
index c54ea68..c4a5464 100755
--- a/selftest/selftest.pl
+++ b/selftest/selftest.pl
@@ -843,6 +843,7 @@ my @exported_envvars = (
"DNS_FORWARDER2",
"RESOLV_CONF",
"UNACCEPTABLE_PASSWORD",
+ "SMBD_TEST_LOG",
# nss_wrapper
"NSS_WRAPPER_PASSWD",
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index dbfad1c..77716e9 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -2010,6 +2010,10 @@ sub provision($$$$$$$$)
copy = tmp
kernel oplocks = yes
vfs objects = streams_xattr xattr_tdb
+[error_inject]
+ copy = tmp
+ vfs objects = error_inject
+ include = $libdir/error_inject.conf
";
close(CONF);
diff --git a/source3/include/smb_acls.h b/source3/include/smb_acls.h
index 3ac23db..cd2452b 100644
--- a/source3/include/smb_acls.h
+++ b/source3/include/smb_acls.h
@@ -26,8 +26,14 @@ struct vfs_handle_struct;
struct files_struct;
typedef int SMB_ACL_TYPE_T;
-typedef mode_t *SMB_ACL_PERMSET_T;
-typedef mode_t SMB_ACL_PERM_T;
+/*
+ * struct smb_acl_entry is defined in IDL as
+ * using mode_t values, pidl always converts these
+ * to uint32_t. Ensure the external type definitions
+ * match.
+ */
+typedef uint32_t *SMB_ACL_PERMSET_T;
+typedef uint32_t SMB_ACL_PERM_T;
typedef enum smb_acl_tag_t SMB_ACL_TAG_T;
typedef struct smb_acl_t *SMB_ACL_T;
diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c
index f954978..6a661cd 100644
--- a/source3/lib/g_lock.c
+++ b/source3/lib/g_lock.c
@@ -133,7 +133,9 @@ static NTSTATUS g_lock_trylock(struct db_record *rec, struct server_id self,
return NT_STATUS_INTERNAL_ERROR;
}
- for (i=0; i<num_locks; i++) {
+ i=0;
+
+ while (i < num_locks) {
if (serverid_equal(&self, &locks[i].pid)) {
status = NT_STATUS_INTERNAL_ERROR;
goto done;
@@ -160,7 +162,9 @@ static NTSTATUS g_lock_trylock(struct db_record *rec, struct server_id self,
locks[i] = locks[num_locks-1];
num_locks -= 1;
modified = true;
+ continue;
}
+ i++;
}
tmp = talloc_realloc(talloc_tos(), locks, struct g_lock_rec,
diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index e3d22bf..2842647 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -251,6 +251,20 @@ static int cephwrap_statvfs(struct vfs_handle_struct *handle, const char *path,
return ret;
}
+static uint32_t cephwrap_fs_capabilities(struct vfs_handle_struct *handle,
+ enum timestamp_set_resolution *p_ts_res)
+{
+ uint32_t caps = FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES;
+
+#ifdef HAVE_CEPH_STATX
+ *p_ts_res = TIMESTAMP_SET_NT_OR_BETTER;
+#else
+ *p_ts_res = TIMESTAMP_SET_MSEC;
+#endif
+
+ return caps;
+}
+
/* Directory operations */
static DIR *cephwrap_opendir(struct vfs_handle_struct *handle,
@@ -1339,6 +1353,7 @@ static struct vfs_fn_pointers ceph_fns = {
.get_quota_fn = cephwrap_get_quota,
.set_quota_fn = cephwrap_set_quota,
.statvfs_fn = cephwrap_statvfs,
+ .fs_capabilities_fn = cephwrap_fs_capabilities,
/* Directory operations */
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index ce1b6e2..4889591 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -121,8 +121,14 @@ static uint32_t vfswrap_fs_capabilities(struct vfs_handle_struct *handle,
struct vfs_statvfs_struct statbuf;
int ret;
+ smb_fname_cpath = synthetic_smb_fname(talloc_tos(), conn->connectpath,
+ NULL, NULL, 0);
+ if (smb_fname_cpath == NULL) {
+ return caps;
+ }
+
ZERO_STRUCT(statbuf);
- ret = sys_statvfs(conn->connectpath, &statbuf);
+ ret = SMB_VFS_STATVFS(conn, conn->connectpath, &statbuf);
if (ret == 0) {
caps = statbuf.FsCapabilities;
}
@@ -132,12 +138,6 @@ static uint32_t vfswrap_fs_capabilities(struct vfs_handle_struct *handle,
/* Work out what timestamp resolution we can
* use when setting a timestamp. */
- smb_fname_cpath = synthetic_smb_fname(talloc_tos(), conn->connectpath,
- NULL, NULL, 0);
- if (smb_fname_cpath == NULL) {
- return caps;
- }
-
ret = SMB_VFS_STAT(conn, smb_fname_cpath);
if (ret == -1) {
TALLOC_FREE(smb_fname_cpath);
diff --git a/source3/modules/vfs_error_inject.c b/source3/modules/vfs_error_inject.c
new file mode 100644
index 0000000..3196a2f
--- /dev/null
+++ b/source3/modules/vfs_error_inject.c
@@ -0,0 +1,99 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Samba VFS module for error injection in VFS calls
+ * Copyright (C) Christof Schmitt 2017
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+#include "smbd/smbd.h"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_VFS
+
+struct unix_error_map {
+ const char *err_str;
+ int error;
+} unix_error_map_array[] = {
+ { "ESTALE", ESTALE },
+};
+
+static int find_unix_error_from_string(const char *err_str)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(unix_error_map_array); i++) {
+ struct unix_error_map *m = &unix_error_map_array[i];
+
+ if (strequal(err_str, m->err_str)) {
+ return m->error;
+ }
+ }
+
+ return 0;
+}
+
+static int inject_unix_error(const char *vfs_func, vfs_handle_struct *handle)
+{
+ const char *err_str;
+
+ err_str = lp_parm_const_string(SNUM(handle->conn),
+ "error_inject", vfs_func, NULL);
+
+ if (err_str != NULL) {
+ int error;
+
+ error = find_unix_error_from_string(err_str);
+ if (error != 0) {
+ DBG_WARNING("Returning error %s for VFS function %s\n",
+ err_str, vfs_func);
+ return error;
+ }
+
+ if (strequal(err_str, "panic")) {
+ DBG_ERR("Panic in VFS function %s\n", vfs_func);
+ smb_panic("error_inject");
+ }
+
+ DBG_ERR("Unknown error inject %s requested "
+ "for vfs function %s\n", err_str, vfs_func);
+ }
+
+ return 0;
+}
+
+static int vfs_error_inject_chdir(vfs_handle_struct *handle, const char *path)
+{
+ int error;
+
+ error = inject_unix_error("chdir", handle);
+ if (error != 0) {
+ errno = error;
+ return -1;
+ }
+
+ return SMB_VFS_NEXT_CHDIR(handle, path);
+}
+
+static struct vfs_fn_pointers vfs_error_inject_fns = {
+ .chdir_fn = vfs_error_inject_chdir,
+};
+
+static_decl_vfs;
+NTSTATUS vfs_error_inject_init(void)
+{
+ return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "error_inject",
+ &vfs_error_inject_fns);
+}
diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c
index f7e57d0..7ae51ee 100644
--- a/source3/modules/vfs_fruit.c
+++ b/source3/modules/vfs_fruit.c
@@ -4065,26 +4065,35 @@ static ssize_t fruit_pwrite_meta_stream(vfs_handle_struct *handle,
size_t n, off_t offset)
{
AfpInfo *ai = NULL;
- int ret;
+ size_t nwritten;
+ bool ok;
ai = afpinfo_unpack(talloc_tos(), data);
if (ai == NULL) {
return -1;
}
- if (ai_empty_finderinfo(ai)) {
- ret = SMB_VFS_NEXT_UNLINK(handle, fsp->fsp_name);
- if (ret != 0 && errno != ENOENT && errno != ENOATTR) {
- DBG_ERR("Can't delete metadata for %s: %s\n",
- fsp_str_dbg(fsp), strerror(errno));
- TALLOC_FREE(ai);
- return -1;
- }
+ nwritten = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
+ if (nwritten != n) {
+ return -1;
+ }
+ if (!ai_empty_finderinfo(ai)) {
return n;
}
- return SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
+ ok = set_delete_on_close(
+ fsp,
+ true,
+ handle->conn->session_info->security_token,
+ handle->conn->session_info->unix_token);
+ if (!ok) {
+ DBG_ERR("set_delete_on_close on [%s] failed\n",
+ fsp_str_dbg(fsp));
+ return -1;
+ }
+
+ return n;
}
static ssize_t fruit_pwrite_meta_netatalk(vfs_handle_struct *handle,
@@ -4095,26 +4104,13 @@ static ssize_t fruit_pwrite_meta_netatalk(vfs_handle_struct *handle,
AfpInfo *ai = NULL;
char *p = NULL;
int ret;
+ bool ok;
ai = afpinfo_unpack(talloc_tos(), data);
if (ai == NULL) {
return -1;
}
- if (ai_empty_finderinfo(ai)) {
- ret = SMB_VFS_REMOVEXATTR(handle->conn,
- fsp->fsp_name->base_name,
- AFPINFO_EA_NETATALK);
-
- if (ret != 0 && errno != ENOENT && errno != ENOATTR) {
- DBG_ERR("Can't delete metadata for %s: %s\n",
- fsp_str_dbg(fsp), strerror(errno));
- return -1;
- }
-
- return n;
- }
-
ad = ad_fget(talloc_tos(), handle, fsp, ADOUBLE_META);
if (ad == NULL) {
ad = ad_init(talloc_tos(), handle, ADOUBLE_META);
@@ -4139,6 +4135,22 @@ static ssize_t fruit_pwrite_meta_netatalk(vfs_handle_struct *handle,
}
TALLOC_FREE(ad);
+
+ if (!ai_empty_finderinfo(ai)) {
+ return n;
+ }
+
+ ok = set_delete_on_close(
+ fsp,
+ true,
+ handle->conn->session_info->security_token,
+ handle->conn->session_info->unix_token);
+ if (!ok) {
+ DBG_ERR("set_delete_on_close on [%s] failed\n",
+ fsp_str_dbg(fsp));
+ return -1;
+ }
+
return n;
}
--
Samba Shared Repository
More information about the samba-cvs
mailing list