Because of the "&& usp->server_info" test in get_valid_user_struct,
invalidate_vuid() called for an intermediate vuid would never do what it was
supposed to do. There is no server_info in the intermediate vuids.
This fixes a memleak, it was found for a client that does silly sequences of
sesssionsetup/ulogoff for every operation.
+void invalidate_intermediate_vuid(uint16 vuid)
+{
+ user_struct *vuser = get_partial_auth_user_struct(vuid);
+
+ if (vuser == NULL)
+ return;
+
+ DLIST_REMOVE(validated_users, vuser);
+
+ SAFE_FREE(vuser);
+ num_validated_vuids--;
+}
+
/****************************************************************************
Invalidate all vuid entries for this process.
****************************************************************************/
/****************************************************************************
Invalidate all vuid entries for this process.
****************************************************************************/
/* NB. This is *NOT* an error case. JRA */
auth_ntlmssp_end(auth_ntlmssp_state);
/* Kill the intermediate vuid */
/* NB. This is *NOT* an error case. JRA */
auth_ntlmssp_end(auth_ntlmssp_state);
/* Kill the intermediate vuid */
+ invalidate_intermediate_vuid(vuid);
status = parse_spnego_mechanisms(blob1, &secblob, &got_kerberos_mechanism);
if (!NT_STATUS_IS_OK(status)) {
/* Kill the intermediate vuid */
status = parse_spnego_mechanisms(blob1, &secblob, &got_kerberos_mechanism);
if (!NT_STATUS_IS_OK(status)) {
/* Kill the intermediate vuid */
+ invalidate_intermediate_vuid(vuid);
return ERROR_NT(nt_status_squash(status));
}
return ERROR_NT(nt_status_squash(status));
}
data_blob_free(&secblob);
if (destroy_vuid) {
/* Kill the intermediate vuid */
data_blob_free(&secblob);
if (destroy_vuid) {
/* Kill the intermediate vuid */
+ invalidate_intermediate_vuid(vuid);
status = auth_ntlmssp_start(auth_ntlmssp_state);
if (!NT_STATUS_IS_OK(status)) {
/* Kill the intermediate vuid */
status = auth_ntlmssp_start(auth_ntlmssp_state);
if (!NT_STATUS_IS_OK(status)) {
/* Kill the intermediate vuid */
+ invalidate_intermediate_vuid(vuid);
return ERROR_NT(nt_status_squash(status));
}
return ERROR_NT(nt_status_squash(status));
}
file_save("auth.dat", blob1.data, blob1.length);
#endif
/* Kill the intermediate vuid */
file_save("auth.dat", blob1.data, blob1.length);
#endif
/* Kill the intermediate vuid */
+ invalidate_intermediate_vuid(vuid);
return ERROR_NT(nt_status_squash(NT_STATUS_INVALID_PARAMETER));
}
return ERROR_NT(nt_status_squash(NT_STATUS_INVALID_PARAMETER));
}
data_blob_free(&auth);
if (destroy_vuid) {
/* Kill the intermediate vuid */
data_blob_free(&auth);
if (destroy_vuid) {
/* Kill the intermediate vuid */
+ invalidate_intermediate_vuid(vuid);
if (!*auth_ntlmssp_state) {
/* Kill the intermediate vuid */
if (!*auth_ntlmssp_state) {
/* Kill the intermediate vuid */
+ invalidate_intermediate_vuid(vuid);
/* auth before negotiatiate? */
return ERROR_NT(nt_status_squash(NT_STATUS_INVALID_PARAMETER));
/* auth before negotiatiate? */
return ERROR_NT(nt_status_squash(NT_STATUS_INVALID_PARAMETER));
if (!NT_STATUS_IS_OK(status)) {
if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
/* Real error - kill the intermediate vuid */
if (!NT_STATUS_IS_OK(status)) {
if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
/* Real error - kill the intermediate vuid */
+ invalidate_intermediate_vuid(vuid);
}
data_blob_free(&blob1);
return ERROR_NT(nt_status_squash(status));
}
data_blob_free(&blob1);
return ERROR_NT(nt_status_squash(status));
status = auth_ntlmssp_start(&vuser->auth_ntlmssp_state);
if (!NT_STATUS_IS_OK(status)) {
/* Kill the intermediate vuid */
status = auth_ntlmssp_start(&vuser->auth_ntlmssp_state);
if (!NT_STATUS_IS_OK(status)) {
/* Kill the intermediate vuid */
+ invalidate_intermediate_vuid(vuid);
data_blob_free(&blob1);
return ERROR_NT(nt_status_squash(status));
}
data_blob_free(&blob1);
return ERROR_NT(nt_status_squash(status));
}