- if (session->auth_ntlmssp_state->server_info->guest) {
- /* we map anonymous to guest internally */
- *out_session_flags |= SMB2_SESSION_FLAG_IS_GUEST;
- *out_session_flags |= SMB2_SESSION_FLAG_IS_NULL;
- /* force no signing */
- session->do_signing = false;
- }
-
- session->server_info = session->auth_ntlmssp_state->server_info;
- data_blob_free(&session->server_info->user_session_key);
- session->server_info->user_session_key =
- data_blob_talloc(
- session->server_info,
- session->auth_ntlmssp_state->ntlmssp_state->session_key.data,
- session->auth_ntlmssp_state->ntlmssp_state->session_key.length);
- if (session->auth_ntlmssp_state->ntlmssp_state->session_key.length > 0) {
- if (session->server_info->user_session_key.data == NULL) {
- auth_ntlmssp_end(&session->auth_ntlmssp_state);
+ if (!session_claim(smb2req->sconn, session->compat)) {
+ DEBUG(1, ("smb2: Failed to claim session "
+ "for vuid=%d\n",
+ session->compat->vuid));
+ TALLOC_FREE(session);
+ return NT_STATUS_LOGON_FAILURE;
+ }
+
+ set_current_user_info(session_info->unix_info->sanitized_username,
+ session_info->unix_info->unix_name,
+ session_info->info->domain_name);
+
+ reload_services(smb2req->sconn, conn_snum_used, true);
+
+ session->status = NT_STATUS_OK;
+ session->global->auth_session_info = session->session_info;
+ session->global->auth_session_info_seqnum += 1;
+ session->global->channels[0].auth_session_info_seqnum =
+ session->global->auth_session_info_seqnum;
+ session->global->expiration_time = gensec_expire_time(session->gensec);
+
+ if ((in_previous_session_id != 0) &&
+ (session->global->session_wire_id !=
+ in_previous_session_id))
+ {
+ struct tevent_context *ev;
+ struct tevent_req *subreq;
+ bool ok;
+
+ ev = event_context_init(talloc_tos());
+ if (ev == NULL) {
+ TALLOC_FREE(session);
+ return NT_STATUS_LOGON_FAILURE;
+ }
+
+ subreq = smb2srv_session_close_previous_send(smb2req, ev,
+ session,
+ in_previous_session_id);
+ if (subreq == NULL) {
+ TALLOC_FREE(session);
+ return NT_STATUS_LOGON_FAILURE;
+ }
+
+ ok = tevent_req_poll_ntstatus(subreq, ev, &status);
+ if (!ok) {
+ TALLOC_FREE(subreq);
+ TALLOC_FREE(session);
+ return status;
+ }
+
+ status = smb2srv_session_close_previous_recv(subreq);
+ TALLOC_FREE(subreq);
+ if (!NT_STATUS_IS_OK(status)) {