The branch, master has been updated via de2738fb9a7 smbd: Don't mask open error if fstatat() fails via 13d199bea0f tests: Show smbd returns wrong error code when creating on r/o fs via 37b3667f65d error_inject: Enable returning EROFS for O_CREAT via 840480789fc error_inject: map EROFS from 7828c6535cd s4:kdc: Don’t overwrite error code
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit de2738fb9a7dad84eb50a0cf007d89b6ef53ec9a Author: Volker Lendecke <v...@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 <v...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Autobuild-User(master): Volker Lendecke <v...@samba.org> Autobuild-Date(master): Mon Jun 26 16:53:21 UTC 2023 on atb-devel-224 commit 13d199bea0f39fafd2bf39516d83e20893003aa2 Author: Volker Lendecke <v...@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 <v...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 37b3667f65d10a39b95dd84c002677d16f8c0776 Author: Volker Lendecke <v...@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 <v...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 840480789fcbb2e4ffe8b08818869f8490dc29d5 Author: Volker Lendecke <v...@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 <v...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/modules/vfs_error_inject.c | 20 ++++++++++++++++++++ source3/script/tests/test_rofs.sh | 34 ++++++++++++++++++++++++++++++++++ source3/selftest/tests.py | 7 +++++++ source3/smbd/open.c | 9 +++++++++ 4 files changed, 70 insertions(+) create mode 100755 source3/script/tests/test_rofs.sh Changeset truncated at 500 lines: 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/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 2bc4d372095..b1e33595ad8 100755 --- a/source3/selftest/tests.py +++ b/source3/selftest/tests.py @@ -1447,6 +1447,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); } -- Samba Shared Repository