1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

smbd: Move process_smb to smb2_process.c

Signed-off-by: David Mulder <dmulder@suse.com>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
David Mulder 2022-03-18 14:53:19 -06:00 committed by Jeremy Allison
parent 92d18a3599
commit f2fc4227a5
3 changed files with 93 additions and 84 deletions

View File

@ -277,7 +277,7 @@ out:
return (ret > 0);
}
static bool valid_smb_header(const uint8_t *inbuf)
bool valid_smb_header(const uint8_t *inbuf)
{
if (is_encrypted_packet(inbuf)) {
return true;
@ -1626,23 +1626,10 @@ error:
Process an smb from the client
****************************************************************************/
static void process_smb2(struct smbXsrv_connection *xconn,
uint8_t *inbuf, size_t nread, size_t unread_bytes,
uint32_t seqnum, bool encrypted,
struct smb_perfcount_data *deferred_pcd)
{
const uint8_t *inpdu = inbuf + NBT_HDR_SIZE;
size_t pdulen = nread - NBT_HDR_SIZE;
NTSTATUS status = smbd_smb2_process_negprot(xconn, 0, inpdu, pdulen);
if (!NT_STATUS_IS_OK(status)) {
exit_server_cleanly("SMB2 negprot fail");
}
}
static void process_smb1(struct smbXsrv_connection *xconn,
uint8_t *inbuf, size_t nread, size_t unread_bytes,
uint32_t seqnum, bool encrypted,
struct smb_perfcount_data *deferred_pcd)
void process_smb1(struct smbXsrv_connection *xconn,
uint8_t *inbuf, size_t nread, size_t unread_bytes,
uint32_t seqnum, bool encrypted,
struct smb_perfcount_data *deferred_pcd)
{
struct smbd_server_connection *sconn = xconn->client->sconn;
@ -1678,68 +1665,6 @@ static void process_smb1(struct smbXsrv_connection *xconn,
sconn->trans_num++;
}
void process_smb(struct smbXsrv_connection *xconn,
uint8_t *inbuf, size_t nread, size_t unread_bytes,
uint32_t seqnum, bool encrypted,
struct smb_perfcount_data *deferred_pcd)
{
struct smbd_server_connection *sconn = xconn->client->sconn;
int msg_type = CVAL(inbuf,0);
DO_PROFILE_INC(request);
DEBUG( 6, ( "got message type 0x%x of len 0x%x\n", msg_type,
smb_len(inbuf) ) );
DEBUG(3, ("Transaction %d of length %d (%u toread)\n",
sconn->trans_num, (int)nread, (unsigned int)unread_bytes));
if (msg_type != NBSSmessage) {
/*
* NetBIOS session request, keepalive, etc.
*/
reply_special(xconn, (char *)inbuf, nread);
goto done;
}
#if defined(WITH_SMB1SERVER)
if (sconn->using_smb2) {
/* At this point we're not really using smb2,
* we make the decision here.. */
if (smbd_is_smb2_header(inbuf, nread)) {
#endif
process_smb2(xconn, inbuf, nread, unread_bytes, seqnum,
encrypted, deferred_pcd);
return;
#if defined(WITH_SMB1SERVER)
}
if (nread >= smb_size && valid_smb_header(inbuf)
&& CVAL(inbuf, smb_com) != 0x72) {
/* This is a non-negprot SMB1 packet.
Disable SMB2 from now on. */
sconn->using_smb2 = false;
}
}
process_smb1(xconn, inbuf, nread, unread_bytes, seqnum, encrypted,
deferred_pcd);
#endif
done:
sconn->num_requests++;
/* The timeout_processing function isn't run nearly
often enough to implement 'max log size' without
overrunning the size of the file by many megabytes.
This is especially true if we are running at debug
level 10. Checking every 50 SMBs is a nice
tradeoff of performance vs log file size overrun. */
if ((sconn->num_requests % 50) == 0 &&
need_to_check_log_size()) {
change_to_root_user();
check_log_size();
}
}
/****************************************************************************
Return a string containing the function name of a SMB command.
****************************************************************************/

View File

@ -883,14 +883,15 @@ NTSTATUS smb1_receive_talloc(TALLOC_CTX *mem_ctx,
size_t *p_len,
uint32_t *seqnum,
bool trusted_channel);
void process_smb(struct smbXsrv_connection *xconn,
uint8_t *inbuf, size_t nread, size_t unread_bytes,
uint32_t seqnum, bool encrypted,
struct smb_perfcount_data *deferred_pcd);
bool push_deferred_open_message_smb1(struct smb_request *req,
struct timeval timeout,
struct file_id id,
struct deferred_open_record *open_rec);
void process_smb1(struct smbXsrv_connection *xconn,
uint8_t *inbuf, size_t nread, size_t unread_bytes,
uint32_t seqnum, bool encrypted,
struct smb_perfcount_data *deferred_pcd);
bool valid_smb_header(const uint8_t *inbuf);
/* The following definitions come from smbd/smb2_process.c */
@ -929,6 +930,10 @@ bool create_outbuf(TALLOC_CTX *mem_ctx, struct smb_request *req,
uint8_t num_words, uint32_t num_bytes);
void construct_reply_common_req(struct smb_request *req, char *outbuf);
void reply_outbuf(struct smb_request *req, uint8_t num_words, uint32_t num_bytes);
void process_smb(struct smbXsrv_connection *xconn,
uint8_t *inbuf, size_t nread, size_t unread_bytes,
uint32_t seqnum, bool encrypted,
struct smb_perfcount_data *deferred_pcd);
/* The following definitions come from smbd/quotas.c */

View File

@ -570,3 +570,82 @@ void reply_outbuf(struct smb_request *req, uint8_t num_words, uint32_t num_bytes
}
req->outbuf = (uint8_t *)outbuf;
}
/****************************************************************************
Process an smb from the client
****************************************************************************/
static void process_smb2(struct smbXsrv_connection *xconn,
uint8_t *inbuf, size_t nread, size_t unread_bytes,
uint32_t seqnum, bool encrypted,
struct smb_perfcount_data *deferred_pcd)
{
const uint8_t *inpdu = inbuf + NBT_HDR_SIZE;
size_t pdulen = nread - NBT_HDR_SIZE;
NTSTATUS status = smbd_smb2_process_negprot(xconn, 0, inpdu, pdulen);
if (!NT_STATUS_IS_OK(status)) {
exit_server_cleanly("SMB2 negprot fail");
}
}
void process_smb(struct smbXsrv_connection *xconn,
uint8_t *inbuf, size_t nread, size_t unread_bytes,
uint32_t seqnum, bool encrypted,
struct smb_perfcount_data *deferred_pcd)
{
struct smbd_server_connection *sconn = xconn->client->sconn;
int msg_type = CVAL(inbuf,0);
DO_PROFILE_INC(request);
DEBUG( 6, ( "got message type 0x%x of len 0x%x\n", msg_type,
smb_len(inbuf) ) );
DEBUG(3, ("Transaction %d of length %d (%u toread)\n",
sconn->trans_num, (int)nread, (unsigned int)unread_bytes));
if (msg_type != NBSSmessage) {
/*
* NetBIOS session request, keepalive, etc.
*/
reply_special(xconn, (char *)inbuf, nread);
goto done;
}
#if defined(WITH_SMB1SERVER)
if (sconn->using_smb2) {
/* At this point we're not really using smb2,
* we make the decision here.. */
if (smbd_is_smb2_header(inbuf, nread)) {
#endif
process_smb2(xconn, inbuf, nread, unread_bytes, seqnum,
encrypted, deferred_pcd);
return;
#if defined(WITH_SMB1SERVER)
}
if (nread >= smb_size && valid_smb_header(inbuf)
&& CVAL(inbuf, smb_com) != 0x72) {
/* This is a non-negprot SMB1 packet.
Disable SMB2 from now on. */
sconn->using_smb2 = false;
}
}
process_smb1(xconn, inbuf, nread, unread_bytes, seqnum, encrypted,
deferred_pcd);
#endif
done:
sconn->num_requests++;
/* The timeout_processing function isn't run nearly
often enough to implement 'max log size' without
overrunning the size of the file by many megabytes.
This is especially true if we are running at debug
level 10. Checking every 50 SMBs is a nice
tradeoff of performance vs log file size overrun. */
if ((sconn->num_requests % 50) == 0 &&
need_to_check_log_size()) {
change_to_root_user();
check_log_size();
}
}