mirror of
https://github.com/samba-team/samba.git
synced 2025-10-08 07:33:19 +03:00
s3: libsmb: Add cli_smb2_setpathinfo(), to be called by cli_setpathinfo_basic().
Fix to prevent libsmbclient from accidently making SMB1 calls inside an SMB2 connection. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12913 Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
This commit is contained in:
committed by
Ralph Boehme
parent
812006fa8f
commit
2a15c70603
@@ -1645,6 +1645,75 @@ NTSTATUS cli_smb2_qpathinfo_streams(struct cli_state *cli,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
Wrapper that allows SMB2 to set SMB_FILE_BASIC_INFORMATION on
|
||||||
|
a pathname.
|
||||||
|
Synchronous only.
|
||||||
|
***************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS cli_smb2_setpathinfo(struct cli_state *cli,
|
||||||
|
const char *name,
|
||||||
|
uint8_t in_info_type,
|
||||||
|
uint8_t in_file_info_class,
|
||||||
|
const DATA_BLOB *p_in_data)
|
||||||
|
{
|
||||||
|
NTSTATUS status;
|
||||||
|
uint16_t fnum = 0xffff;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = get_fnum_from_path(cli,
|
||||||
|
name,
|
||||||
|
FILE_WRITE_ATTRIBUTES,
|
||||||
|
&fnum);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = smb2cli_set_info(cli->conn,
|
||||||
|
cli->timeout,
|
||||||
|
cli->smb2.session,
|
||||||
|
cli->smb2.tcon,
|
||||||
|
in_info_type,
|
||||||
|
in_file_info_class,
|
||||||
|
p_in_data, /* in_input_buffer */
|
||||||
|
0, /* in_additional_info */
|
||||||
|
ph->fid_persistent,
|
||||||
|
ph->fid_volatile);
|
||||||
|
fail:
|
||||||
|
|
||||||
|
if (fnum != 0xffff) {
|
||||||
|
cli_smb2_close_fnum(cli, fnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
cli->raw_status = status;
|
||||||
|
|
||||||
|
TALLOC_FREE(frame);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************
|
/***************************************************************
|
||||||
Wrapper that allows SMB2 to set pathname attributes.
|
Wrapper that allows SMB2 to set pathname attributes.
|
||||||
Synchronous only.
|
Synchronous only.
|
||||||
@@ -1752,6 +1821,7 @@ NTSTATUS cli_smb2_setatr(struct cli_state *cli,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************
|
/***************************************************************
|
||||||
Wrapper that allows SMB2 to set file handle times.
|
Wrapper that allows SMB2 to set file handle times.
|
||||||
Synchronous only.
|
Synchronous only.
|
||||||
|
@@ -114,6 +114,11 @@ NTSTATUS cli_smb2_qpathinfo_streams(struct cli_state *cli,
|
|||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
unsigned int *pnum_streams,
|
unsigned int *pnum_streams,
|
||||||
struct stream_struct **pstreams);
|
struct stream_struct **pstreams);
|
||||||
|
NTSTATUS cli_smb2_setpathinfo(struct cli_state *cli,
|
||||||
|
const char *name,
|
||||||
|
uint8_t in_info_type,
|
||||||
|
uint8_t in_file_info_class,
|
||||||
|
const DATA_BLOB *p_in_data);
|
||||||
NTSTATUS cli_smb2_setatr(struct cli_state *cli,
|
NTSTATUS cli_smb2_setatr(struct cli_state *cli,
|
||||||
const char *fname,
|
const char *fname,
|
||||||
uint16_t attr,
|
uint16_t attr,
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
#include "libsmb/clirap.h"
|
#include "libsmb/clirap.h"
|
||||||
#include "trans2.h"
|
#include "trans2.h"
|
||||||
#include "../libcli/smb/smbXcli_base.h"
|
#include "../libcli/smb/smbXcli_base.h"
|
||||||
|
#include "cli_smb2_fnum.h"
|
||||||
|
|
||||||
#define PIPE_LANMAN "\\PIPE\\LANMAN"
|
#define PIPE_LANMAN "\\PIPE\\LANMAN"
|
||||||
|
|
||||||
@@ -751,6 +752,19 @@ NTSTATUS cli_setpathinfo_basic(struct cli_state *cli, const char *fname,
|
|||||||
|
|
||||||
data_len = PTR_DIFF(p, data);
|
data_len = PTR_DIFF(p, data);
|
||||||
|
|
||||||
|
if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
|
||||||
|
DATA_BLOB in_data = data_blob_const(data, data_len);
|
||||||
|
/*
|
||||||
|
* Split out SMB2 here as we need to select
|
||||||
|
* the correct info type and level.
|
||||||
|
*/
|
||||||
|
return cli_smb2_setpathinfo(cli,
|
||||||
|
fname,
|
||||||
|
1, /* SMB2_SETINFO_FILE */
|
||||||
|
SMB_FILE_BASIC_INFORMATION - 1000,
|
||||||
|
&in_data);
|
||||||
|
}
|
||||||
|
|
||||||
return cli_setpathinfo(cli, SMB_FILE_BASIC_INFORMATION, fname,
|
return cli_setpathinfo(cli, SMB_FILE_BASIC_INFORMATION, fname,
|
||||||
(uint8_t *)data, data_len);
|
(uint8_t *)data, data_len);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user