From 03e4555f344e6806c80fefc8cf00a08d6ea2766e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sun, 24 Feb 2019 08:15:23 -0800 Subject: s3: smbd: filenames - ensure we replace the missing '/' if we error in an intermediate POSIX path. Previous regression test ensures we still return the correct error code for POSIX pathname operations. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13803 Signed-off-by: Jeremy Allison Reviewed-by: Volker Lendecke Autobuild-User(master): Volker Lendecke Autobuild-Date(master): Mon Feb 25 09:33:27 CET 2019 on sn-devel-144 (cherry picked from commit 3f1a13a94a753c5cb3b9f2cf795df5adb0f74205) --- selftest/knownfail | 1 - source3/smbd/filename.c | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/selftest/knownfail b/selftest/knownfail index f4427fb4ab4..84776d4f35d 100644 --- a/selftest/knownfail +++ b/selftest/knownfail @@ -9,7 +9,6 @@ ^samba3.smbtorture_s3.crypt_server\(nt4_dc\).SMB2-SESSION-REAUTH # expected to give ACCESS_DENIED SMB2.1 doesn't have encryption ^samba3.smbtorture_s3.crypt_server\(nt4_dc\).SMB2-SESSION-RECONNECT # expected to give CONNECTION_DISCONNECTED, we need to fix the test ^samba3.smbtorture_s3.*ad_dc_ntvfs.*SMB2-DIR-FSYNC.* -^samba3.smbtorture_s3.*.POSIX-MKDIR ^samba3.smb2.session enc.reconnect # expected to give CONNECTION_DISCONNECTED, we need to fix the test ^samba3.raw.session enc # expected to give ACCESS_DENIED as SMB1 encryption isn't used ^samba3.smbtorture_s3.crypt_server # expected to give ACCESS_DENIED as SMB1 encryption isn't used diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 4c8c5ea19bc..8a00fbb06e7 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -917,6 +917,24 @@ NTSTATUS unix_convert(TALLOC_CTX *ctx, * * BUG: https://bugzilla.samba.org/show_bug.cgi?id=13803 */ + if (end != NULL) { + const char *morepath = NULL; + /* + * If this is intermediate we must + * restore the full path. + */ + *end = '/'; + /* + * If there are any more components + * after the failed LSTAT we cannot + * continue. + */ + morepath = strchr(end + 1, '/'); + if (morepath != NULL) { + status = NT_STATUS_OBJECT_PATH_NOT_FOUND; + goto fail; + } + } if (errno == ENOENT) { /* New file or directory. */ goto done; -- cgit v1.2.1