[SCM] Samba Shared Repository - branch v4-18-stable updated
Jule Anger
janger at samba.org
Wed Jul 5 11:33:55 UTC 2023
The branch, v4-18-stable has been updated
via 273696dc5d4 VERSION: Disable GIT_SNAPSHOT for the 4.18.4 release.
via bcdc186bb67 WHATSNEW: Add release notes for Samba 4.18.4.
via d4b86186d29 selftest:Samba3: use the correct NSS_WRAPPER_HOSTNAME
via d35c773e969 pidl: avoid py compile issues with --pidl-developer
via 29c08b5891d s3:utils: smbget fix a memory leak
via 694829f1872 smbd: Don't mask open error if fstatat() fails
via 5d040beed2c tests: Show smbd returns wrong error code when creating on r/o fs
via 14cbe1b8671 error_inject: Enable returning EROFS for O_CREAT
via 3350e196a7e error_inject: map EROFS
via ccb235c2f4e vfs_gpfs: Register smbd process with GPFS
via 2492a18d762 gpfswrap: Add wrapper for gpfs_register_cifs_export
via fe17ff2cfc4 s3:winbind: Fix talloc parent in find_dc() leading to a segfault
via a6edfaa4985 python:safe_tarfile: Improve safe extract()
via b7cad429a52 python:safe_tarfile: Implement safer extractall()
via eff4e88d2cc python:safe_tarfile: Set extraction_filter for pythons providing it
via 4a79ee44c31 python:tests: Adopt safe_tarfile for extraction_filter raises
via d2c86925f62 s3/utils: avoid erronous NO MEMORY detection
via c7e3c042fbc smbcacls/smbcquotas: check for valid UNC path
via c4968128b7f smbclient: Fix fd leak with "showacls;ls"
via d49f9f4be7d smbd: remove comments about deprecated 'write cache size'
via 3662ddaadc9 libsmb: Fix directory listing against old servers
via ad3f78b4ab6 tests: Show that we 100% loop in cli_list_old_recv()
via 6f0d17e1210 tests: Make timelimit available to test scripts
via af4d536ad20 s4:dnsserver: Rename dns_name_equal() to samba_dns_name_equal()
via fcf2e89167f VERSION: Bump version up to Samba 4.18.4...
from 897e67a7cf8 VERSION: Disable GIT_SNAPSHOT for the 4.18.3 release.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-18-stable
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
VERSION | 2 +-
WHATSNEW.txt | 73 ++++++++++++++++++++++++++++-
docs-xml/smbdotconf/locking/smb2leases.xml | 2 -
docs-xml/smbdotconf/tuning/aioreadsize.xml | 2 +-
docs-xml/smbdotconf/tuning/aiowritesize.xml | 2 +-
lib/util/gpfswrap.c | 12 +++++
lib/util/gpfswrap.h | 1 +
pidl/lib/Parse/Pidl/Samba4/Python.pm | 8 ++--
python/samba/safe_tarfile.py | 73 ++++++++++++++++++++++++-----
python/samba/tests/safe_tarfile.py | 27 ++++++++---
selftest/selftesthelpers.py | 1 +
selftest/target/Samba3.pm | 4 +-
source3/client/client.c | 1 +
source3/libsmb/clilist.c | 6 +++
source3/modules/vfs_error_inject.c | 20 ++++++++
source3/modules/vfs_gpfs.c | 6 +++
source3/script/tests/test_old_dirlisting.sh | 28 +++++++++++
source3/script/tests/test_rofs.sh | 34 ++++++++++++++
source3/selftest/tests.py | 13 +++++
source3/smbd/open.c | 9 ++++
source3/smbd/smb2_read.c | 1 -
source3/utils/net_ads.c | 10 ++--
source3/utils/smbcacls.c | 5 ++
source3/utils/smbcquotas.c | 5 ++
source3/utils/smbget.c | 1 +
source3/winbindd/winbindd_cm.c | 2 +-
source4/dns_server/dns_crypto.c | 2 +-
source4/dns_server/dns_update.c | 4 +-
source4/dns_server/dnsserver_common.c | 21 +++++----
source4/dns_server/dnsserver_common.h | 2 +-
source4/rpc_server/dnsserver/dnsutils.c | 2 +-
source4/torture/dns/dlz_bind9.c | 8 ++--
32 files changed, 334 insertions(+), 53 deletions(-)
create mode 100755 source3/script/tests/test_old_dirlisting.sh
create mode 100755 source3/script/tests/test_rofs.sh
Changeset truncated at 500 lines:
diff --git a/VERSION b/VERSION
index 93ebe2430aa..35e338ed4d5 100644
--- a/VERSION
+++ b/VERSION
@@ -25,7 +25,7 @@
########################################################
SAMBA_VERSION_MAJOR=4
SAMBA_VERSION_MINOR=18
-SAMBA_VERSION_RELEASE=3
+SAMBA_VERSION_RELEASE=4
########################################################
# If a official release has a serious bug #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 01c121a8e48..c5dbc985f28 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,3 +1,73 @@
+ ==============================
+ Release Notes for Samba 4.18.4
+ July 05, 2023
+ ==============================
+
+
+This is the latest stable release of the Samba 4.18 release series.
+
+
+Changes since 4.18.3
+--------------------
+
+o Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
+ * BUG 15404: Backport --pidl-developer fixes.
+
+o Samuel Cabrero <scabrero at samba.org>
+ * BUG 14030: Named crashes on DLZ zone update.
+
+o Björn Jacke <bj at sernet.de>
+ * BUG 2312: smbcacls and smbcquotas do not check // before the server.
+
+o Volker Lendecke <vl at samba.org>
+ * BUG 15382: cli_list loops 100% CPU against pre-lanman2 servers.
+ * BUG 15391: smbclient leaks fds with showacls.
+ * BUG 15402: smbd returns NOT_FOUND when creating files on a r/o filesystem.
+
+o Stefan Metzmacher <metze at samba.org>
+ * BUG 15355: NSS_WRAPPER_HOSTNAME doesn't match NSS_WRAPPER_HOSTS entry and
+ causes test timeouts.
+
+o Noel Power <noel.power at suse.com>
+ * BUG 15384: net ads lookup (with unspecified realm) fails.
+
+o Christof Schmitt <cs at samba.org>
+ * BUG 15381: Register Samba processes with GPFS.
+
+o Andreas Schneider <asn at samba.org>
+ * BUG 15390: Python tarfile extraction needs change to avoid a warning
+ (CVE-2007-4559 mitigation).
+ * BUG 15398: The winbind child segfaults when listing users with `winbind
+ scan trusted domains = yes`.
+
+o Jones Syue <jonessyue at qnap.com>
+ * BUG 15383: Remove comments about deprecated 'write cache size'.
+ * BUG 15403: smbget memory leak if failed to download files recursively.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical:matrix.org matrix room, or
+#samba-technical IRC channel on irc.libera.chat.
+
+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.18.3
May 31, 2023
@@ -58,8 +128,7 @@ database (https://bugzilla.samba.org/).
======================================================================
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
==============================
Release Notes for Samba 4.18.2
April 19, 2023
diff --git a/docs-xml/smbdotconf/locking/smb2leases.xml b/docs-xml/smbdotconf/locking/smb2leases.xml
index 5a490875af7..89ff307d8f9 100644
--- a/docs-xml/smbdotconf/locking/smb2leases.xml
+++ b/docs-xml/smbdotconf/locking/smb2leases.xml
@@ -15,8 +15,6 @@
and <smbconfoption name="kernel oplocks">no</smbconfoption>.
</para>
- <para>Note that the write cache won't be used for file handles with a smb2 write lease.</para>
-
</description>
<related>oplocks</related>
diff --git a/docs-xml/smbdotconf/tuning/aioreadsize.xml b/docs-xml/smbdotconf/tuning/aioreadsize.xml
index 71120a80388..5218f34a6d6 100644
--- a/docs-xml/smbdotconf/tuning/aioreadsize.xml
+++ b/docs-xml/smbdotconf/tuning/aioreadsize.xml
@@ -6,7 +6,7 @@
<para>If this integer parameter is set to a non-zero value,
Samba will read from files asynchronously when the request size is bigger
than this value. Note that it happens only for non-chained and non-chaining
- reads and when not using write cache.</para>
+ reads.</para>
<para>The only reasonable values for this parameter are 0 (no async I/O) and
1 (always do async I/O).</para>
<related>aio write size</related>
diff --git a/docs-xml/smbdotconf/tuning/aiowritesize.xml b/docs-xml/smbdotconf/tuning/aiowritesize.xml
index cdc079d13dc..029e1d135c0 100644
--- a/docs-xml/smbdotconf/tuning/aiowritesize.xml
+++ b/docs-xml/smbdotconf/tuning/aiowritesize.xml
@@ -6,7 +6,7 @@
<para>If this integer parameter is set to a non-zero value,
Samba will write to files asynchronously when the request size is bigger
than this value. Note that it happens only for non-chained and non-chaining
- reads and when not using write cache.</para>
+ writes.</para>
<para>The only reasonable values for this parameter are 0 (no async I/O) and
1 (always do async I/O).</para>
<para>Compared to <smbconfoption name="aio read size"/> this parameter has
diff --git a/lib/util/gpfswrap.c b/lib/util/gpfswrap.c
index d05358e141e..2f15bf452cf 100644
--- a/lib/util/gpfswrap.c
+++ b/lib/util/gpfswrap.c
@@ -28,6 +28,7 @@ static int (*gpfs_putacl_fn)(const char *pathname, int flags, void *acl);
static int (*gpfs_get_realfilename_path_fn)(const char *pathname,
char *filenamep,
int *len);
+static int (*gpfs_register_cifs_export_fn)(void);
static int (*gpfs_set_winattrs_path_fn)(const char *pathname,
int flags,
struct gpfs_winattr *attrs);
@@ -71,6 +72,7 @@ int gpfswrap_init(void)
gpfs_fgetacl_fn = dlsym(l, "gpfs_getacl_fd");
gpfs_putacl_fn = dlsym(l, "gpfs_putacl");
gpfs_get_realfilename_path_fn = dlsym(l, "gpfs_get_realfilename_path");
+ gpfs_register_cifs_export_fn = dlsym(l, "gpfs_register_cifs_export");
gpfs_set_winattrs_path_fn = dlsym(l, "gpfs_set_winattrs_path");
gpfs_set_winattrs_fn = dlsym(l, "gpfs_set_winattrs");
gpfs_get_winattrs_fn = dlsym(l, "gpfs_get_winattrs");
@@ -141,6 +143,16 @@ int gpfswrap_get_realfilename_path(const char *pathname,
return gpfs_get_realfilename_path_fn(pathname, filenamep, len);
}
+int gpfswrap_register_cifs_export(void)
+{
+ if (gpfs_register_cifs_export_fn == NULL) {
+ errno = ENOSYS;
+ return -1;
+ }
+
+ return gpfs_register_cifs_export_fn();
+}
+
int gpfswrap_set_winattrs_path(const char *pathname,
int flags,
struct gpfs_winattr *attrs)
diff --git a/lib/util/gpfswrap.h b/lib/util/gpfswrap.h
index 1e74496c060..e387a56446b 100644
--- a/lib/util/gpfswrap.h
+++ b/lib/util/gpfswrap.h
@@ -34,6 +34,7 @@ int gpfswrap_putacl(const char *pathname, int flags, void *acl);
int gpfswrap_get_realfilename_path(const char *pathname,
char *filenamep,
int *len);
+int gpfswrap_register_cifs_export(void);
int gpfswrap_set_winattrs_path(const char *pathname,
int flags,
struct gpfs_winattr *attrs);
diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm
index 5c4d3e8e087..03a901cc24d 100644
--- a/pidl/lib/Parse/Pidl/Samba4/Python.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm
@@ -1747,7 +1747,7 @@ sub ConvertObjectFromPythonData($$$$$$;$$)
$self->pidl("}");
$self->pidl("if (test_var > uint_max) {");
$self->indent;
- $self->pidl("PyErr_Format(PyExc_OverflowError, \"Expected type %s within range 0 - %llu, got %llu\",\\");
+ $self->pidl("PyErr_Format(PyExc_OverflowError, \"Expected type %s within range 0 - %llu, got %llu\",");
$self->pidl(" PyLong_Type.tp_name, uint_max, test_var);");
$self->pidl($fail);
$self->deindent;
@@ -1756,7 +1756,7 @@ sub ConvertObjectFromPythonData($$$$$$;$$)
$self->deindent;
$self->pidl("} else {");
$self->indent;
- $self->pidl("PyErr_Format(PyExc_TypeError, \"Expected type %s\",\\");
+ $self->pidl("PyErr_Format(PyExc_TypeError, \"Expected type %s\",");
$self->pidl(" PyLong_Type.tp_name);");
$self->pidl($fail);
$self->deindent;
@@ -1786,7 +1786,7 @@ sub ConvertObjectFromPythonData($$$$$$;$$)
$self->pidl("}");
$self->pidl("if (test_var < int_min || test_var > int_max) {");
$self->indent;
- $self->pidl("PyErr_Format(PyExc_OverflowError, \"Expected type %s within range %lld - %lld, got %lld\",\\");
+ $self->pidl("PyErr_Format(PyExc_OverflowError, \"Expected type %s within range %lld - %lld, got %lld\",");
$self->pidl(" PyLong_Type.tp_name, int_min, int_max, test_var);");
$self->pidl($fail);
$self->deindent;
@@ -1795,7 +1795,7 @@ sub ConvertObjectFromPythonData($$$$$$;$$)
$self->deindent;
$self->pidl("} else {");
$self->indent;
- $self->pidl("PyErr_Format(PyExc_TypeError, \"Expected type %s\",\\");
+ $self->pidl("PyErr_Format(PyExc_TypeError, \"Expected type %s\",");
$self->pidl(" PyLong_Type.tp_name);");
$self->pidl($fail);
$self->deindent;
diff --git a/python/samba/safe_tarfile.py b/python/samba/safe_tarfile.py
index cc19770d73f..7a2b0382a79 100644
--- a/python/samba/safe_tarfile.py
+++ b/python/samba/safe_tarfile.py
@@ -15,6 +15,9 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import os
+import tarfile
+from pathlib import Path
from tarfile import ExtractError, TarInfo, TarFile as UnsafeTarFile
@@ -24,20 +27,68 @@ class TarFile(UnsafeTarFile):
using '../../'.
"""
- def extract(self, member, path="", set_attrs=True, *, numeric_owner=False):
- if isinstance(member, TarInfo):
- name = member.name
- else:
- name = member
+ try:
+ # New in version 3.11.4 (also has been backported)
+ # https://docs.python.org/3/library/tarfile.html#tarfile.TarFile.extraction_filter
+ # https://peps.python.org/pep-0706/
+ extraction_filter = staticmethod(tarfile.data_filter)
+ except AttributeError:
+ def extract(self, member, path="", set_attrs=True, *,
+ numeric_owner=False):
+ self._safetarfile_check()
+ super().extract(member, path, set_attrs=set_attrs,
+ numeric_owner=numeric_owner)
- if '../' in name:
- raise ExtractError(f"'../' is not allowed in path '{name}'")
+ def extractall(self, path, members=None, *, numeric_owner=False):
+ self._safetarfile_check()
+ super().extractall(path, members,
+ numeric_owner=numeric_owner)
- if name.startswith('/'):
- raise ExtractError(f"path '{name}' should not start with '/'")
+ def _safetarfile_check(self):
+ for tarinfo in self.__iter__():
+ if self._is_traversal_attempt(tarinfo=tarinfo):
+ raise ExtractError(
+ "Attempted directory traversal for "
+ f"member: {tarinfo.name}")
+ if self._is_unsafe_symlink(tarinfo=tarinfo):
+ raise ExtractError(
+ "Attempted directory traversal via symlink for "
+ f"member: {tarinfo.linkname}")
+ if self._is_unsafe_link(tarinfo=tarinfo):
+ raise ExtractError(
+ "Attempted directory traversal via link for "
+ f"member: {tarinfo.linkname}")
- super().extract(member, path, set_attrs=set_attrs,
- numeric_owner=numeric_owner)
+ def _resolve_path(self, path):
+ return os.path.realpath(os.path.abspath(path))
+
+ def _is_path_in_dir(self, path, basedir):
+ return self._resolve_path(os.path.join(basedir,
+ path)).startswith(basedir)
+
+ def _is_traversal_attempt(self, tarinfo):
+ if (tarinfo.name.startswith(os.sep)
+ or ".." + os.sep in tarinfo.name):
+ return True
+ return False
+
+ def _is_unsafe_symlink(self, tarinfo):
+ if tarinfo.issym():
+ symlink_file = Path(
+ os.path.normpath(os.path.join(os.getcwd(),
+ tarinfo.linkname)))
+ if not self._is_path_in_dir(symlink_file, os.getcwd()):
+ return True
+ return False
+
+ def _is_unsafe_link(self, tarinfo):
+ if tarinfo.islnk():
+ link_file = Path(
+ os.path.normpath(os.path.join(os.getcwd(),
+ tarinfo.linkname)))
+ if not self._is_path_in_dir(link_file, os.getcwd()):
+ return True
+ return False
open = TarFile.open
diff --git a/python/samba/tests/safe_tarfile.py b/python/samba/tests/safe_tarfile.py
index 40aa9e17d4a..cf9b725afcb 100644
--- a/python/samba/tests/safe_tarfile.py
+++ b/python/samba/tests/safe_tarfile.py
@@ -43,9 +43,16 @@ class SafeTarFileTestCase(TestCaseInTempDir):
stf = safe_tarfile.open(tarname)
- self.assertRaises(tarfile.ExtractError,
- stf.extractall,
- tarname)
+ # We we have data_filter, we have a patched python to address
+ # CVE-2007-4559.
+ if hasattr(tarfile, "data_filter"):
+ self.assertRaises(tarfile.OutsideDestinationError,
+ stf.extractall,
+ tarname)
+ else:
+ self.assertRaises(tarfile.ExtractError,
+ stf.extractall,
+ tarname)
self.rm_files('x', 'tar.tar')
def test_slash(self):
@@ -60,8 +67,16 @@ class SafeTarFileTestCase(TestCaseInTempDir):
tf.close()
stf = safe_tarfile.open(tarname)
- self.assertRaises(tarfile.ExtractError,
- stf.extractall,
- tarname)
+
+ # We we have data_filter, we have a patched python to address
+ # CVE-2007-4559.
+ if hasattr(tarfile, "data_filter"):
+ self.assertRaises(NotADirectoryError,
+ stf.extractall,
+ tarname)
+ else:
+ self.assertRaises(tarfile.ExtractError,
+ stf.extractall,
+ tarname)
self.rm_files('x', 'tar.tar')
diff --git a/selftest/selftesthelpers.py b/selftest/selftesthelpers.py
index 0320008faf9..1af8f5f837c 100644
--- a/selftest/selftesthelpers.py
+++ b/selftest/selftesthelpers.py
@@ -226,3 +226,4 @@ rpcclient = binpath('rpcclient')
smbcacls = binpath('smbcacls')
smbcontrol = binpath('smbcontrol')
smbstatus = binpath('smbstatus')
+timelimit = binpath('timelimit')
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index 0556efd4741..ba3268f147c 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -3678,7 +3678,7 @@ jacknomappergroup:x:$gid_jacknomapper:jacknomapper
$createuser_env{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
$createuser_env{NSS_WRAPPER_GROUP} = $nss_wrapper_group;
$createuser_env{NSS_WRAPPER_HOSTS} = $nss_wrapper_hosts;
- $createuser_env{NSS_WRAPPER_HOSTNAME} = "${hostname}.samba.example.com";
+ $createuser_env{NSS_WRAPPER_HOSTNAME} = "${hostname}.${dns_domain}";
if ($ENV{SAMBA_DNS_FAKING}) {
$createuser_env{RESOLV_WRAPPER_HOSTS} = $dns_host_file;
} else {
@@ -3732,7 +3732,7 @@ jacknomappergroup:x:$gid_jacknomapper:jacknomapper
$ret{NSS_WRAPPER_PASSWD} = $nss_wrapper_passwd;
$ret{NSS_WRAPPER_GROUP} = $nss_wrapper_group;
$ret{NSS_WRAPPER_HOSTS} = $nss_wrapper_hosts;
- $ret{NSS_WRAPPER_HOSTNAME} = "${hostname}.samba.example.com";
+ $ret{NSS_WRAPPER_HOSTNAME} = "${hostname}.${dns_domain}";
$ret{NSS_WRAPPER_MODULE_SO_PATH} = Samba::nss_wrapper_winbind_so_path($self);
$ret{NSS_WRAPPER_MODULE_FN_PREFIX} = "winbind";
if ($ENV{SAMBA_DNS_FAKING}) {
diff --git a/source3/client/client.c b/source3/client/client.c
index 8e29224918d..c4d309958cd 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -626,6 +626,7 @@ static NTSTATUS display_finfo(struct cli_state *cli_state, struct file_info *fin
display_sec_desc(sd);
}
TALLOC_FREE(sd);
+ cli_close(targetcli, fnum);
}
TALLOC_FREE(afname);
}
diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c
index 903c5d22777..58a8fe1a0c6 100644
--- a/source3/libsmb/clilist.c
+++ b/source3/libsmb/clilist.c
@@ -544,6 +544,11 @@ static NTSTATUS cli_list_old_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
return status;
}
+ if (state->dirlist == NULL) {
+ *pfinfo = NULL;
+ return NT_STATUS_OK;
+ }
+
num_received = talloc_array_length(state->dirlist) / DIR_STRUCT_SIZE;
finfo = talloc_array(mem_ctx, struct file_info, num_received);
@@ -570,6 +575,7 @@ static NTSTATUS cli_list_old_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
return status;
}
}
+ TALLOC_FREE(state->dirlist);
*pfinfo = finfo;
return NT_STATUS_OK;
}
diff --git a/source3/modules/vfs_error_inject.c b/source3/modules/vfs_error_inject.c
index 1a327097b30..edb7c64a92a 100644
--- a/source3/modules/vfs_error_inject.c
+++ b/source3/modules/vfs_error_inject.c
@@ -31,6 +31,7 @@ struct unix_error_map {
{ "EBADF", EBADF },
{ "EINTR", EINTR },
{ "EACCES", EACCES },
+ { "EROFS", EROFS },
};
static int find_unix_error_from_string(const char *err_str)
@@ -115,6 +116,7 @@ static int vfs_error_inject_openat(struct vfs_handle_struct *handle,
const struct vfs_open_how *how)
{
int error = inject_unix_error("openat", handle);
+ int create_error = inject_unix_error("openat_create", handle);
int dirfsp_flags = (O_NOFOLLOW|O_DIRECTORY);
bool return_error;
@@ -126,6 +128,24 @@ static int vfs_error_inject_openat(struct vfs_handle_struct *handle,
#endif
#endif
+ if ((create_error != 0) && (how->flags & O_CREAT)) {
+ struct stat_ex st = {
+ .st_ex_nlink = 0,
+ };
+ int ret;
+
+ ret = SMB_VFS_FSTATAT(handle->conn,
+ dirfsp,
+ smb_fname,
+ &st,
+ AT_SYMLINK_NOFOLLOW);
+
+ if ((ret == -1) && (errno == ENOENT)) {
+ errno = create_error;
+ return -1;
+ }
+ }
+
return_error = (error != 0);
return_error &= !fsp->fsp_flags.is_pathref;
return_error &= ((how->flags & dirfsp_flags) != dirfsp_flags);
diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c
index 969e7744fce..93748eab54c 100644
--- a/source3/modules/vfs_gpfs.c
+++ b/source3/modules/vfs_gpfs.c
@@ -2043,6 +2043,12 @@ static int vfs_gpfs_connect(struct vfs_handle_struct *handle,
gpfswrap_lib_init(0);
+ ret = gpfswrap_register_cifs_export();
+ if (ret < 0) {
+ DBG_ERR("Failed to register with GPFS: %s\n", strerror(errno));
+ return ret;
+ }
+
config = talloc_zero(handle->conn, struct gpfs_config_data);
if (!config) {
DEBUG(0, ("talloc_zero() failed\n"));
diff --git a/source3/script/tests/test_old_dirlisting.sh b/source3/script/tests/test_old_dirlisting.sh
new file mode 100755
index 00000000000..f50a4742b1a
--- /dev/null
--
Samba Shared Repository
More information about the samba-cvs
mailing list