[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Wed Oct 19 00:14:01 UTC 2022


The branch, master has been updated
       via  fd0c01da1c7 s3: libsmbclient: Fix smbc_stat() to return ENOENT on a non-existent file.
       via  9eda432836b s4: torture: libsmbclient: Add a torture test to ensure smbc_stat() returns ENOENT on a non-existent file.
      from  0326549a052 s3/utils: check result of talloc_strdup

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit fd0c01da1c744ae6fd9d8675616d8b6d3531e469
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Oct 17 13:24:27 2022 -0700

    s3: libsmbclient: Fix smbc_stat() to return ENOENT on a non-existent file.
    
    Remove knownfail.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15195
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Pavel Filipenský <pfilipensky at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Wed Oct 19 00:13:56 UTC 2022 on sn-devel-184

commit 9eda432836bfff3d3d4a365a08a5ecb54f0f2e34
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Oct 17 13:14:41 2022 -0700

    s4: torture: libsmbclient: Add a torture test to ensure smbc_stat() returns ENOENT on a non-existent file.
    
    Add knownfail.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15195
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Pavel Filipenský <pfilipensky at samba.org>

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

Summary of changes:
 source3/libsmb/libsmb_file.c                | 34 ++++++++++++----
 source4/torture/libsmbclient/libsmbclient.c | 63 +++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+), 8 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/libsmb/libsmb_file.c b/source3/libsmb/libsmb_file.c
index fa301b9fa18..98750754036 100644
--- a/source3/libsmb/libsmb_file.c
+++ b/source3/libsmb/libsmb_file.c
@@ -464,6 +464,7 @@ SMBC_getatr(SMBCCTX * context,
 	struct timespec access_time_ts = {0};
 	struct timespec write_time_ts = {0};
 	struct timespec change_time_ts = {0};
+	struct timespec w_time_ts = {0};
 	time_t write_time = 0;
 	SMB_INO_T ino = 0;
 	struct cli_credentials *creds = NULL;
@@ -506,6 +507,7 @@ SMBC_getatr(SMBCCTX * context,
 	}
 
 	if (!srv->no_pathinfo2) {
+		bool not_supported_error = false;
 		status = cli_qpathinfo2(targetcli,
 					targetpath,
 					&create_time_ts,
@@ -518,11 +520,21 @@ SMBC_getatr(SMBCCTX * context,
 		if (NT_STATUS_IS_OK(status)) {
 			goto setup_stat;
 		}
+		if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_LEVEL) ||
+		    NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
+			not_supported_error = true;
+		}
+		if (!not_supported_error) {
+			/* "Normal error". Just return it to caller. */
+			TALLOC_FREE(frame);
+			return status;
+		}
         }
 
 	srv->no_pathinfo2 = True;
 
 	if (!srv->no_pathinfo3) {
+		bool not_supported_error = false;
 		status = cli_qpathinfo3(targetcli,
 					targetpath,
 					&create_time_ts,
@@ -535,6 +547,15 @@ SMBC_getatr(SMBCCTX * context,
 		if (NT_STATUS_IS_OK(status)) {
 			goto setup_stat;
 		}
+		if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_LEVEL) ||
+		    NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) {
+			not_supported_error = true;
+		}
+		if (!not_supported_error) {
+			/* "Normal error". Just return it to caller. */
+			TALLOC_FREE(frame);
+			return status;
+		}
         }
 
 	srv->no_pathinfo3 = True;
@@ -545,14 +566,11 @@ SMBC_getatr(SMBCCTX * context,
         }
 
 	status = cli_getatr(targetcli, targetpath, &attr, &size, &write_time);
-	if (NT_STATUS_IS_OK(status)) {
-		struct timespec w_time_ts =
-			convert_time_t_to_timespec(write_time);
-
-		access_time_ts = change_time_ts = write_time_ts = w_time_ts;
-
-		goto setup_stat;
+	if (!NT_STATUS_IS_OK(status)) {
+		goto all_failed;
 	}
+	w_time_ts = convert_time_t_to_timespec(write_time);
+	access_time_ts = change_time_ts = write_time_ts = w_time_ts;
 
 setup_stat:
 	setup_stat(sb,
@@ -573,7 +591,7 @@ all_failed:
 	srv->no_pathinfo3 = False;
 
 	TALLOC_FREE(frame);
-	return NT_STATUS_ACCESS_DENIED;
+	return status;
 }
 
 /*
diff --git a/source4/torture/libsmbclient/libsmbclient.c b/source4/torture/libsmbclient/libsmbclient.c
index 82f64c38b69..d335cad3a4e 100644
--- a/source4/torture/libsmbclient/libsmbclient.c
+++ b/source4/torture/libsmbclient/libsmbclient.c
@@ -1412,6 +1412,67 @@ static bool torture_libsmbclient_rename(struct torture_context *tctx)
 	return success;
 }
 
+static bool torture_libsmbclient_getatr(struct torture_context *tctx)
+{
+	const char *smburl = torture_setting_string(tctx, "smburl", NULL);
+	SMBCCTX *ctx = NULL;
+	char *getatr_name = NULL;
+	struct stat st = {0};
+	bool ok;
+	int ret = 0;
+	int err = 0;
+
+	if (smburl == NULL) {
+		torture_fail(tctx,
+			     "option --option=torture:smburl="
+			     "smb://user:password@server missing\n");
+	}
+
+	ok = torture_libsmbclient_init_context(tctx, &ctx);
+	torture_assert(tctx, ok, "Failed to init context");
+	smbc_set_context(ctx);
+
+	getatr_name = talloc_asprintf(tctx,
+			"%s/noexist",
+			smburl);
+	if (getatr_name == NULL) {
+		torture_result(tctx,
+			       TORTURE_FAIL,
+			       __location__": %s",
+			       "talloc fail\n");
+		return false;
+	}
+	/* Ensure the file doesn't exist. */
+	smbc_unlink(getatr_name);
+	/*
+	 * smbc_stat() internally uses SMBC_getatr().
+	 * Make sure doing getatr on a non-existent file gives
+	 * an error of -1, errno = ENOENT.
+	 */
+
+	ret = smbc_stat(getatr_name, &st);
+	if (ret == -1) {
+		err = errno;
+	}
+	torture_assert_int_equal(tctx,
+				 ret,
+				 -1,
+				 talloc_asprintf(tctx,
+					"smbc_stat on '%s' should "
+					"get -1, got %d\n",
+					getatr_name,
+					ret));
+	torture_assert_int_equal(tctx,
+				 err,
+				 ENOENT,
+				 talloc_asprintf(tctx,
+					"smbc_stat on '%s' should "
+					"get errno = ENOENT, got %s\n",
+					getatr_name,
+					strerror(err)));
+	return true;
+}
+
 NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx)
 {
 	struct torture_suite *suite;
@@ -1438,6 +1499,8 @@ NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx)
 	torture_suite_add_simple_test(suite,
 					"rename",
 					torture_libsmbclient_rename);
+	torture_suite_add_simple_test(suite, "getatr",
+		torture_libsmbclient_getatr);
 
 	suite->description = talloc_strdup(suite, "libsmbclient interface tests");
 


-- 
Samba Shared Repository



More information about the samba-cvs mailing list