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

Karolin Seeger kseeger at samba.org
Fri Nov 17 13:00:02 UTC 2017


The branch, v4-6-test has been updated
       via  d4217c0 s3: libsmb: smbc_statvfs is missing the supporting SMB2 calls.
       via  a6db21e libsmbclient: Allow server (NetApp) to return STATUS_INVALID_PARAMETER from an echo.
      from  b196d0e VERSION: Bump version up to 4.6.11...

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


- Log -----------------------------------------------------------------
commit d4217c0aa6fe6f01842a1ac978ad05a4018109ed
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Nov 14 13:52:03 2017 -0800

    s3: libsmb: smbc_statvfs is missing the supporting SMB2 calls.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13138
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    (cherry picked from commit eefc7a27155b70d027b1193187dd435267d863ea)
    
    Autobuild-User(v4-6-test): Karolin Seeger <kseeger at samba.org>
    Autobuild-Date(v4-6-test): Fri Nov 17 13:59:02 CET 2017 on sn-devel-144

commit a6db21ef255ab3b8cc018626ae5784fdd686e7ce
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Sep 8 16:20:34 2017 -0700

    libsmbclient: Allow server (NetApp) to return STATUS_INVALID_PARAMETER from an echo.
    
    It does this if we send a session ID of zero. The server still replied.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13007
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Sat Nov 11 08:44:37 CET 2017 on sn-devel-144
    
    (cherry picked from commit a0f6ea8dec1ab3d19bc93da12a9b0a1c0ccf6142)

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

Summary of changes:
 source3/client/client.c        |  8 +++-
 source3/libsmb/cli_smb2_fnum.c | 97 ++++++++++++++++++++++++++++++++++++++++++
 source3/libsmb/cli_smb2_fnum.h |  6 +++
 source3/libsmb/clifsinfo.c     |  9 ++++
 source3/libsmb/libsmb_server.c | 11 ++++-
 5 files changed, 129 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/client/client.c b/source3/client/client.c
index bb2518a..0900df1 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -5696,7 +5696,13 @@ static void readline_callback(void)
 	/* Ping the server to keep the connection alive using SMBecho. */
 	memset(garbage, 0xf0, sizeof(garbage));
 	status = cli_echo(cli, 1, data_blob_const(garbage, sizeof(garbage)));
-	if (NT_STATUS_IS_OK(status)) {
+	if (NT_STATUS_IS_OK(status) ||
+			NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {
+		/*
+		 * Even if server returns NT_STATUS_INVALID_PARAMETER
+		 * it still responded.
+		 * BUG: https://bugzilla.samba.org/show_bug.cgi?id=13007
+		 */
 		return;
 	}
 
diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index cb62c90..e5a4055 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -1825,6 +1825,103 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli, const char *path,
 }
 
 /***************************************************************
+ Wrapper that allows SMB2 to query file system sizes.
+ Synchronous only.
+***************************************************************/
+
+NTSTATUS cli_smb2_get_fs_full_size_info(struct cli_state *cli,
+				uint64_t *total_allocation_units,
+				uint64_t *caller_allocation_units,
+				uint64_t *actual_allocation_units,
+				uint64_t *sectors_per_allocation_unit,
+				uint64_t *bytes_per_sector)
+{
+	NTSTATUS status;
+	uint16_t fnum = 0xffff;
+	DATA_BLOB outbuf = data_blob_null;
+	struct smb2_hnd *ph = NULL;
+	TALLOC_CTX *frame = talloc_stackframe();
+
+	if (smbXcli_conn_has_async_calls(cli->conn)) {
+		/*
+		 * Can't use sync call while an async call is in flight
+		 */
+		status = NT_STATUS_INVALID_PARAMETER;
+		goto fail;
+	}
+
+	if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) {
+		status = NT_STATUS_INVALID_PARAMETER;
+		goto fail;
+	}
+
+	/* First open the top level directory. */
+	status =
+	    cli_smb2_create_fnum(cli, "", 0,		   /* create_flags */
+				 FILE_READ_ATTRIBUTES,     /* desired_access */
+				 FILE_ATTRIBUTE_DIRECTORY, /* file attributes */
+				 FILE_SHARE_READ | FILE_SHARE_WRITE |
+				     FILE_SHARE_DELETE, /* share_access */
+				 FILE_OPEN,		/* create_disposition */
+				 FILE_DIRECTORY_FILE,   /* create_options */
+				 &fnum,
+				 NULL);
+
+	if (!NT_STATUS_IS_OK(status)) {
+		goto fail;
+	}
+
+	status = map_fnum_to_smb2_handle(cli, fnum, &ph);
+	if (!NT_STATUS_IS_OK(status)) {
+		goto fail;
+	}
+
+	/* getinfo on the returned handle with info_type SMB2_GETINFO_FS (2),
+	   level 7 (SMB_FS_FULL_SIZE_INFORMATION). */
+
+	status = smb2cli_query_info(cli->conn,
+				cli->timeout,
+				cli->smb2.session,
+				cli->smb2.tcon,
+				SMB2_GETINFO_FS, /* in_info_type */
+				/* in_file_info_class */
+				SMB_FS_FULL_SIZE_INFORMATION - 1000,
+				0xFFFF, /* in_max_output_length */
+				NULL, /* in_input_buffer */
+				0, /* in_additional_info */
+				0, /* in_flags */
+				ph->fid_persistent,
+				ph->fid_volatile,
+				frame,
+				&outbuf);
+	if (!NT_STATUS_IS_OK(status)) {
+		goto fail;
+	}
+
+	if (outbuf.length < 32) {
+		status = NT_STATUS_INVALID_NETWORK_RESPONSE;
+		goto fail;
+	}
+
+	*total_allocation_units = BIG_UINT(outbuf.data, 0);
+	*caller_allocation_units = BIG_UINT(outbuf.data, 8);
+	*actual_allocation_units = BIG_UINT(outbuf.data, 16);
+	*sectors_per_allocation_unit = (uint64_t)IVAL(outbuf.data, 24);
+	*bytes_per_sector = (uint64_t)IVAL(outbuf.data, 28);
+
+fail:
+
+	if (fnum != 0xffff) {
+		cli_smb2_close_fnum(cli, fnum);
+	}
+
+	cli->raw_status = status;
+
+	TALLOC_FREE(frame);
+	return status;
+}
+
+/***************************************************************
  Wrapper that allows SMB2 to query file system attributes.
  Synchronous only.
 ***************************************************************/
diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h
index c92c5c9..5354b2d 100644
--- a/source3/libsmb/cli_smb2_fnum.h
+++ b/source3/libsmb/cli_smb2_fnum.h
@@ -127,6 +127,12 @@ NTSTATUS cli_smb2_dskattr(struct cli_state *cli,
 			uint64_t *total,
 			uint64_t *avail);
 NTSTATUS cli_smb2_get_fs_attr_info(struct cli_state *cli, uint32_t *fs_attr);
+NTSTATUS cli_smb2_get_fs_full_size_info(struct cli_state *cli,
+			uint64_t *total_allocation_units,
+			uint64_t *caller_allocation_units,
+			uint64_t *actual_allocation_units,
+			uint64_t *sectors_per_allocation_unit,
+			uint64_t *bytes_per_sector);
 NTSTATUS cli_smb2_query_security_descriptor(struct cli_state *cli,
 			uint16_t fnum,
 			uint32_t sec_info,
diff --git a/source3/libsmb/clifsinfo.c b/source3/libsmb/clifsinfo.c
index 119b121..4623639 100644
--- a/source3/libsmb/clifsinfo.c
+++ b/source3/libsmb/clifsinfo.c
@@ -439,6 +439,15 @@ NTSTATUS cli_get_fs_full_size_info(struct cli_state *cli,
 	uint32_t rdata_count;
 	NTSTATUS status;
 
+	if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
+		return cli_smb2_get_fs_full_size_info(cli,
+						total_allocation_units,
+						caller_allocation_units,
+						actual_allocation_units,
+						sectors_per_allocation_unit,
+						bytes_per_sector);
+	}
+
 	SSVAL(setup, 0, TRANSACT2_QFSINFO);
 	SSVAL(param, 0, SMB_FS_FULL_SIZE_INFORMATION);
 
diff --git a/source3/libsmb/libsmb_server.c b/source3/libsmb/libsmb_server.c
index b0e5926..2d41f2f 100644
--- a/source3/libsmb/libsmb_server.c
+++ b/source3/libsmb/libsmb_server.c
@@ -61,7 +61,16 @@ SMBC_check_server(SMBCCTX * context,
 					1,
 					data_blob_const(data, sizeof(data)));
 		if (!NT_STATUS_IS_OK(status)) {
-			return 1;
+			/*
+			 * Some NetApp servers return
+			 * NT_STATUS_INVALID_PARAMETER.That's OK, they still
+			 * replied.
+			 * BUG: https://bugzilla.samba.org/show_bug.cgi?id=13007
+			 */
+			if (!NT_STATUS_EQUAL(status,
+					NT_STATUS_INVALID_PARAMETER)) {
+				return 1;
+			}
 		}
 		server->last_echo_time = now;
 	}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list