The branch, v4-7-test has been updated via 7b28a97 s3: libsmb: smbc_statvfs is missing the supporting SMB2 calls. via 6f18428 libsmbclient: Allow server (NetApp) to return STATUS_INVALID_PARAMETER from an echo. from 70d7a5c VERSION: Bump version up to 4.7.3...
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-7-test - Log ----------------------------------------------------------------- commit 7b28a97a7f5125022d784f0f633ad17f79843535 Author: Jeremy Allison <j...@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 <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> (cherry picked from commit eefc7a27155b70d027b1193187dd435267d863ea) Autobuild-User(v4-7-test): Karolin Seeger <ksee...@samba.org> Autobuild-Date(v4-7-test): Mon Nov 20 17:19:21 CET 2017 on sn-devel-144 commit 6f184288eb2d3eab0dfe6f50bce3b6b51496e437 Author: Jeremy Allison <j...@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 <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Autobuild-User(master): Jeremy Allison <j...@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 b4a6c7d..9c57375 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -5900,7 +5900,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 a478c41..89cb1f4 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -1993,6 +1993,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 9a709e8..c9325b6 100644 --- a/source3/libsmb/cli_smb2_fnum.h +++ b/source3/libsmb/cli_smb2_fnum.h @@ -136,6 +136,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