void smb2srv_negprot_recv(struct smb2srv_request *req) { struct smb2_negprot *io; if (req->in.body_size < 0x26) { smb2srv_send_error(req, NT_STATUS_FOOBAR); return; } io = talloc(req, struct smb2_negprot); if (!io) { smbsrv_terminate_connection(req->smb_conn, nt_errstr(NT_STATUS_NO_MEMORY)); talloc_free(req); return; } io->in.unknown1 = SVAL(req->in.body, 0x02); memcpy(io->in.unknown2, req->in.body + 0x04, 0x20); io->in.unknown3 = SVAL(req->in.body, 0x24); req->status = smb2srv_negprot_backend(req, io); if (req->control_flags & SMB2SRV_REQ_CTRL_FLAG_NOT_REPLY) { talloc_free(req); return; } smb2srv_negprot_send(req, io); }
void smb2srv_negprot_recv(struct smb2srv_request *req) { struct smb2_negprot *io; int i; if (req->in.body_size < 0x26) { smbsrv_terminate_connection(req->smb_conn, "Bad body size in SMB2 negprot"); return; } io = talloc(req, struct smb2_negprot); if (!io) { smbsrv_terminate_connection(req->smb_conn, nt_errstr(NT_STATUS_NO_MEMORY)); talloc_free(req); return; } io->in.dialect_count = SVAL(req->in.body, 0x02); io->in.security_mode = SVAL(req->in.body, 0x04); io->in.reserved = SVAL(req->in.body, 0x06); io->in.capabilities = IVAL(req->in.body, 0x08); req->status = smbcli_pull_guid(req->in.body, 0xC, &io->in.client_guid); if (!NT_STATUS_IS_OK(req->status)) { smbsrv_terminate_connection(req->smb_conn, "Bad GUID in SMB2 negprot"); talloc_free(req); return; } io->in.start_time = smbcli_pull_nttime(req->in.body, 0x1C); io->in.dialects = talloc_array(req, uint16_t, io->in.dialect_count); if (io->in.dialects == NULL) { smbsrv_terminate_connection(req->smb_conn, nt_errstr(NT_STATUS_NO_MEMORY)); talloc_free(req); return; } for (i=0;i<io->in.dialect_count;i++) { io->in.dialects[i] = SVAL(req->in.body, 0x24+i*2); } req->status = smb2srv_negprot_backend(req, io); if (req->control_flags & SMB2SRV_REQ_CTRL_FLAG_NOT_REPLY) { talloc_free(req); return; } smb2srv_negprot_send(req, io); }