[SCM] Samba Shared Repository - branch v4-18-test updated

Jule Anger janger at samba.org
Mon Jul 3 08:54:01 UTC 2023


The branch, v4-18-test has been updated
       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
      from  fe17ff2cfc4 s3:winbind: Fix talloc parent in find_dc() leading to a segfault

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-18-test


- Log -----------------------------------------------------------------
commit d35c773e969ff56ee527fbecd385a4a56a878cf0
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Fri Dec 9 10:36:30 2022 +1300

    pidl: avoid py compile issues with --pidl-developer
    
    We get these warnings-as-errors:
    
    librpc/gen_ndr/py_netlogon.c:61903:53: error: stray ‘\’ in program
    61903 |    PyErr_Format(PyExc_TypeError, "Expected type %s",\  //<PIDL> Parse::Pidl::Samba4::Python::ConvertObjectFromPythonData  lib/Parse/Pidl/Samba4/Python.pm:2005
    
    but the '\' is unnecessary and unconventional anyway, since we're in a
    function argument list.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15404
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Fri Feb  3 03:27:54 UTC 2023 on atb-devel-224
    
    (cherry picked from commit e26a01a48c4a6ca6f9424ced72eda68e6eb1e7e3)
    
    Autobuild-User(v4-18-test): Jule Anger <janger at samba.org>
    Autobuild-Date(v4-18-test): Mon Jul  3 08:53:24 UTC 2023 on atb-devel-224

commit 29c08b5891d984dad1935dbf1ac72c1bb384ff88
Author: Jones Syue <jonessyue at qnap.com>
Date:   Tue Jun 27 17:19:59 2023 +0800

    s3:utils: smbget fix a memory leak
    
    Using smbget to download files recursively (-R).
    
    If smbget found that a file is already existed in the destination,
    smbget would said 'File exists', return early, and 'newname' allocated
    memory is never freed, this is found by valgrind.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15403
    
    Signed-off-by: Jones Syue <jonessyue at qnap.com>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Wed Jun 28 07:02:34 UTC 2023 on atb-devel-224
    
    (cherry picked from commit afbed653526b572f7309e67ed742a76ef7b2b8ec)

commit 694829f18723f630a9ca46969c345915c33e9b0a
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jun 26 13:17:44 2023 +0200

    smbd: Don't mask open error if fstatat() fails
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=15402
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Mon Jun 26 16:53:21 UTC 2023 on atb-devel-224
    
    (cherry picked from commit de2738fb9a7dad84eb50a0cf007d89b6ef53ec9a)

commit 5d040beed2c6012d8d97b0f9e4117931dea754e3
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jun 26 14:54:00 2023 +0200

    tests: Show smbd returns wrong error code when creating on r/o fs
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=15402
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    (cherry picked from commit 13d199bea0f39fafd2bf39516d83e20893003aa2)

commit 14cbe1b86716a83a2619671b65c72d522405e38e
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jun 26 13:17:19 2023 +0200

    error_inject: Enable returning EROFS for O_CREAT
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=15402
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    (cherry picked from commit 37b3667f65d10a39b95dd84c002677d16f8c0776)

commit 3350e196a7e72d5535f88586b95201edb3723739
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Jun 26 12:47:17 2023 +0200

    error_inject: map EROFS
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=15402
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    (cherry picked from commit 840480789fcbb2e4ffe8b08818869f8490dc29d5)

commit ccb235c2f4e0a2e6007af6ca206a01a5a59ac09d
Author: Christof Schmitt <cs at samba.org>
Date:   Wed May 31 11:13:51 2023 -0700

    vfs_gpfs: Register smbd process with GPFS
    
    Issue API call to tell the file system that this is a Samba process.
    This fixed the GPFS handling of Samba since the rename of smbd processes
    in commit 5955dc1e4fd.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15381
    
    Signed-off-by: Christof Schmitt <cs at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 3b72136f6782d9704a197ab7b17201df6ff4d60d)

commit 2492a18d7624054f65624203f69b86e3994c3bae
Author: Christof Schmitt <cs at samba.org>
Date:   Wed May 24 14:06:36 2023 -0700

    gpfswrap: Add wrapper for gpfs_register_cifs_export
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15381
    
    Signed-off-by: Christof Schmitt <cs at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 34b9c54ff2f089dbffe65bdc69f3024b5d3efd5c)

-----------------------------------------------------------------------

Summary of changes:
 lib/util/gpfswrap.c                  | 12 ++++++++++++
 lib/util/gpfswrap.h                  |  1 +
 pidl/lib/Parse/Pidl/Samba4/Python.pm |  8 ++++----
 source3/modules/vfs_error_inject.c   | 20 ++++++++++++++++++++
 source3/modules/vfs_gpfs.c           |  6 ++++++
 source3/script/tests/test_rofs.sh    | 34 ++++++++++++++++++++++++++++++++++
 source3/selftest/tests.py            |  7 +++++++
 source3/smbd/open.c                  |  9 +++++++++
 source3/utils/smbget.c               |  1 +
 9 files changed, 94 insertions(+), 4 deletions(-)
 create mode 100755 source3/script/tests/test_rofs.sh


Changeset truncated at 500 lines:

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/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_rofs.sh b/source3/script/tests/test_rofs.sh
new file mode 100755
index 00000000000..72901e5845a
--- /dev/null
+++ b/source3/script/tests/test_rofs.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+# Test smbd handling EROFS when creating a file
+# Copyright (C) 2023 Volker Lendecke
+
+if [ $# -ne 4 ]; then
+	echo Usage: $0 SERVERCONFFILE SMBCLIENT SERVER SHARE
+	exit 1
+fi
+
+CONF=$1
+shift 1
+SMBCLIENT=$1
+shift 1
+SERVER=$1
+shift 1
+SHARE=$1
+shift 1
+
+incdir=$(dirname $0)/../../../testprogs/blackbox
+. $incdir/subunit.sh
+
+error_inject_conf=$(dirname ${SERVERCONFFILE})/error_inject.conf
+echo "error_inject:openat_create = EROFS" >${error_inject_conf}
+
+failed=0
+
+out=$(${SMBCLIENT} //${SERVER}/${SHARE} ${CONF} -U${USER}%${PASSWORD} \
+		   -c "put VERSION")
+testit_grep "Expect MEDIA_WRITE_PROTECTED" NT_STATUS_MEDIA_WRITE_PROTECTED \
+    echo "$out" || failed=$(expr $failed + 1)
+
+>${error_inject_conf}
+
+testok $0 $failed
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 6e4ed6713f6..90806f9ca92 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -1420,6 +1420,13 @@ plantestsuite("samba3.blackbox.chdir-cache", "simpleserver:local",
                '$PREFIX',
                'simpleserver'])
 
+plantestsuite("samba3.blackbox.rofs_error", "simpleserver",
+              [os.path.join(samba3srcdir, "script/tests/test_rofs.sh"),
+               configuration,
+               os.path.join(bindir(), "smbclient"),
+               '$SERVER_IP',
+               "error_inject"])
+
 plantestsuite("samba3.blackbox.zero_readsize",
               "simpleserver:local",
               [os.path.join(samba3srcdir,
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index da0498f9e7d..94f50becb24 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -780,6 +780,15 @@ again:
 			smb_fname_rel,
 			&fsp->fsp_name->st,
 			AT_SYMLINK_NOFOLLOW);
+
+		if (ret == -1) {
+			/*
+			 * Keep the original error. Otherwise we would
+			 * mask for example EROFS for open(O_CREAT),
+			 * turning it into ENOENT.
+			 */
+			goto out;
+		}
 	} else {
 		ret = SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st);
 	}
diff --git a/source3/utils/smbget.c b/source3/utils/smbget.c
index 5f3ac16b204..227f5c638e1 100644
--- a/source3/utils/smbget.c
+++ b/source3/utils/smbget.c
@@ -265,6 +265,7 @@ static bool smb_download_dir(const char *base, const char *name, int resume)
 		if (!ok) {
 			fprintf(stderr, "Failed to download %s: %s\n",
 				newname, strerror(errno));
+			free(newname);
 			free(tmpname);
 			return false;
 		}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list