diff options
| -rw-r--r-- | source3/smbd/smb2_negprot.c | 14 | 
1 files changed, 8 insertions, 6 deletions
diff --git a/source3/smbd/smb2_negprot.c b/source3/smbd/smb2_negprot.c index 27433982b1..dfb2da3fda 100644 --- a/source3/smbd/smb2_negprot.c +++ b/source3/smbd/smb2_negprot.c @@ -25,7 +25,7 @@  /*   * this is the entry point if SMB2 is selected via - * the SMB negprot + * the SMB negprot and the "SMB 2.002" dialect.   */  void reply_smb2002(struct smb_request *req, uint16_t choice)  { @@ -51,7 +51,7 @@ void reply_smb2002(struct smb_request *req, uint16_t choice)  	SSVAL(smb2_body, 0x00, 0x0024);	/* struct size */  	SSVAL(smb2_body, 0x02, 0x0001);	/* dialect count */ -	SSVAL(smb2_dyn,  0x00, 0x0202);	/* dialect 2.002 */ +	SSVAL(smb2_dyn,  0x00, SMB2_DIALECT_REVISION_202);  	req->outbuf = NULL; @@ -77,6 +77,7 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)  	uint16_t dialect_count;  	uint16_t dialect = 0;  	uint32_t capabilities; +	enum protocol_types protocol = PROTOCOL_NONE;  	uint32_t max_limit;  	uint32_t max_trans = lp_smb2_max_trans();  	uint32_t max_read = lp_smb2_max_read(); @@ -106,18 +107,19 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)  	}  	indyn = (const uint8_t *)req->in.vector[i+2].iov_base; -	for (c=0; c < dialect_count; c++) { +	for (c=0; protocol == PROTOCOL_NONE && c < dialect_count; c++) {  		dialect = SVAL(indyn, c*2);  		if (dialect == SMB2_DIALECT_REVISION_202) { +			protocol = PROTOCOL_SMB2_02;  			break;  		}  	} -	if (dialect != SMB2_DIALECT_REVISION_202) { -		return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER); +	if (protocol == PROTOCOL_NONE) { +		return smbd_smb2_request_error(req, NT_STATUS_NOT_SUPPORTED);  	} -	set_Protocol(PROTOCOL_SMB2_02); +	set_Protocol(protocol);  	if (get_remote_arch() != RA_SAMBA) {  		set_remote_arch(RA_VISTA);  | 
