kdc: fix leak in previous commit
Don't zero output_token unless it was moved to PA-GSS padata.
This commit is contained in:
@@ -41,8 +41,7 @@
|
|||||||
#include "gss_preauth_authorizer_plugin.h"
|
#include "gss_preauth_authorizer_plugin.h"
|
||||||
|
|
||||||
struct gss_client_params {
|
struct gss_client_params {
|
||||||
OM_uint32 major_status;
|
OM_uint32 major, minor;
|
||||||
OM_uint32 minor_status;
|
|
||||||
gss_ctx_id_t context_handle;
|
gss_ctx_id_t context_handle;
|
||||||
gss_name_t initiator_name;
|
gss_name_t initiator_name;
|
||||||
gss_OID mech_type;
|
gss_OID mech_type;
|
||||||
@@ -217,7 +216,7 @@ _kdc_gss_rd_padata(astgs_request_t r,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
gcp->major_status = GSS_S_NO_CONTEXT;
|
gcp->major = GSS_S_NO_CONTEXT;
|
||||||
|
|
||||||
ret = pa_gss_get_context_state(r, gcp);
|
ret = pa_gss_get_context_state(r, gcp);
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -247,10 +246,10 @@ _kdc_gss_rd_padata(astgs_request_t r,
|
|||||||
&gcp->lifetime,
|
&gcp->lifetime,
|
||||||
NULL); /* delegated_cred_handle */
|
NULL); /* delegated_cred_handle */
|
||||||
|
|
||||||
gcp->major_status = major;
|
gcp->major = major;
|
||||||
gcp->minor_status = minor;
|
gcp->minor = minor;
|
||||||
|
|
||||||
if (GSS_ERROR(major)) {
|
if (GSS_ERROR(gcp->major)) {
|
||||||
pa_gss_display_status(r, major, minor, gcp,
|
pa_gss_display_status(r, major, minor, gcp,
|
||||||
"Failed to accept GSS security context");
|
"Failed to accept GSS security context");
|
||||||
ret = _krb5_gss_map_error(major, minor);
|
ret = _krb5_gss_map_error(major, minor);
|
||||||
@@ -264,7 +263,7 @@ _kdc_gss_rd_padata(astgs_request_t r,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
*open = (gcp->major_status == GSS_S_COMPLETE);
|
*open = (gcp->major == GSS_S_COMPLETE);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
gss_release_cred(&minor, &cred);
|
gss_release_cred(&minor, &cred);
|
||||||
@@ -575,7 +574,7 @@ _kdc_gss_mk_pa_reply(astgs_request_t r,
|
|||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
const KDC_REQ *req = &r->req;
|
const KDC_REQ *req = &r->req;
|
||||||
|
|
||||||
if (gcp->major_status == GSS_S_COMPLETE) {
|
if (gcp->major == GSS_S_COMPLETE) {
|
||||||
krb5_enctype enctype;
|
krb5_enctype enctype;
|
||||||
uint32_t kfe = 0;
|
uint32_t kfe = 0;
|
||||||
krb5_keyblock *reply_key = NULL;
|
krb5_keyblock *reply_key = NULL;
|
||||||
@@ -600,28 +599,28 @@ _kdc_gss_mk_pa_reply(astgs_request_t r,
|
|||||||
krb5_free_keyblock_contents(r->context, &r->reply_key);
|
krb5_free_keyblock_contents(r->context, &r->reply_key);
|
||||||
r->reply_key = *reply_key;
|
r->reply_key = *reply_key;
|
||||||
free(reply_key);
|
free(reply_key);
|
||||||
} else if (gcp->major_status == GSS_S_CONTINUE_NEEDED) {
|
} else if (gcp->major == GSS_S_CONTINUE_NEEDED) {
|
||||||
ret = pa_gss_set_context_state(r, gcp);
|
ret = pa_gss_set_context_state(r, gcp);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* only return padata in error case if we have an error token */
|
/* only return padata in error case if we have an error token */
|
||||||
if (!GSS_ERROR(gcp->major_status) || gcp->output_token.length) {
|
if (!GSS_ERROR(gcp->major) || gcp->output_token.length) {
|
||||||
ret = krb5_padata_add(r->context, &r->outpadata, KRB5_PADATA_GSS,
|
ret = krb5_padata_add(r->context, &r->outpadata, KRB5_PADATA_GSS,
|
||||||
gcp->output_token.value, gcp->output_token.length);
|
gcp->output_token.value, gcp->output_token.length);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/* token is now owned by outpadata */
|
||||||
|
gcp->output_token.length = 0;
|
||||||
|
gcp->output_token.value = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* token is now owned by outpadata */
|
if (gcp->major == GSS_S_CONTINUE_NEEDED)
|
||||||
gcp->output_token.length = 0;
|
|
||||||
gcp->output_token.value = NULL;
|
|
||||||
|
|
||||||
if (gcp->major_status == GSS_S_CONTINUE_NEEDED)
|
|
||||||
ret = KRB5_KDC_ERR_MORE_PREAUTH_DATA_REQUIRED;
|
ret = KRB5_KDC_ERR_MORE_PREAUTH_DATA_REQUIRED;
|
||||||
else
|
else
|
||||||
ret = _krb5_gss_map_error(gcp->major_status, gcp->minor_status);
|
ret = _krb5_gss_map_error(gcp->major, gcp->minor);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user